From 378cc91a4d5204b9e370c95b17551f2f88a77431 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:41:43 +0000 Subject: [PATCH 001/204] CI: update appimage runtime (#5315) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 721d63b1..e886ae82 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ env: APPIMAGETOOL_VERSION: continuous APPIMAGETOOL_X86_64_HASH: '363dafac070b65cc36ca024b74db1f043c6f5cd7be8fca760e190dce0d18d684' APPIMAGE_RUNTIME_VERSION: continuous - APPIMAGE_RUNTIME_X86_64_HASH: 'e3c4dfb70eddf42e7e5a1d28dff396d30563aa9a901970aebe6f01f3fecf9f8e' + APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' permissions: # permissions required for attestation id-token: 'write' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 14625600..9b7fdd1b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ env: APPIMAGETOOL_VERSION: continuous APPIMAGETOOL_X86_64_HASH: '363dafac070b65cc36ca024b74db1f043c6f5cd7be8fca760e190dce0d18d684' APPIMAGE_RUNTIME_VERSION: continuous - APPIMAGE_RUNTIME_X86_64_HASH: 'e3c4dfb70eddf42e7e5a1d28dff396d30563aa9a901970aebe6f01f3fecf9f8e' + APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' permissions: # permissions required for attestation id-token: 'write' From 9057ce0ce3998b5f2ed54748d32f521052e887fe Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 12 Aug 2025 16:52:34 +0200 Subject: [PATCH 002/204] WebHost: fix links on sitemap, switch to url_for and add test to prevent future breakage (#5318) --- WebHostLib/templates/siteMap.html | 44 ++++++++++----------- test/general/__init__.py | 9 ++++- test/webhost/test_sitemap.py | 63 +++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 24 deletions(-) create mode 100644 test/webhost/test_sitemap.py diff --git a/WebHostLib/templates/siteMap.html b/WebHostLib/templates/siteMap.html index b7db8227..4b764c34 100644 --- a/WebHostLib/templates/siteMap.html +++ b/WebHostLib/templates/siteMap.html @@ -11,32 +11,32 @@

Site Map

Base Pages

Tutorials

Game Info Pages

diff --git a/test/general/__init__.py b/test/general/__init__.py index 34df741a..92ffc77e 100644 --- a/test/general/__init__.py +++ b/test/general/__init__.py @@ -3,7 +3,7 @@ from typing import List, Optional, Tuple, Type, Union from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region from worlds import network_data_package -from worlds.AutoWorld import World, call_all +from worlds.AutoWorld import World, WebWorld, call_all gen_steps = ( "generate_early", @@ -17,7 +17,7 @@ gen_steps = ( def setup_solo_multiworld( - world_type: Type[World], steps: Tuple[str, ...] = gen_steps, seed: Optional[int] = None + world_type: Type[World], steps: Tuple[str, ...] = gen_steps, seed: Optional[int] = None ) -> MultiWorld: """ Creates a multiworld with a single player of `world_type`, sets default options, and calls provided gen steps. @@ -62,11 +62,16 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple return multiworld +class TestWebWorld(WebWorld): + tutorials = [] + + class TestWorld(World): game = f"Test Game" item_name_to_id = {} location_name_to_id = {} hidden = True + web = TestWebWorld() # add our test world to the data package, so we can test it later diff --git a/test/webhost/test_sitemap.py b/test/webhost/test_sitemap.py new file mode 100644 index 00000000..930aa324 --- /dev/null +++ b/test/webhost/test_sitemap.py @@ -0,0 +1,63 @@ +import urllib.parse +import html +import re +from flask import url_for + +import WebHost +from . import TestBase + + +class TestSitemap(TestBase): + + # Codes for OK and some redirects that we use + valid_status_codes = [200, 302, 308] + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + WebHost.copy_tutorials_files_to_static() + + def test_sitemap_route(self) -> None: + """Verify that the sitemap route works correctly and renders the template without errors.""" + with self.app.test_request_context(): + # Test the /sitemap route + with self.client.open("/sitemap") as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b"Site Map", response.data) + + # Test the /index route which should also serve the sitemap + with self.client.open("/index") as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b"Site Map", response.data) + + # Test using url_for with the function name + with self.client.open(url_for('get_sitemap')) as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b'Site Map', response.data) + + def test_sitemap_links(self) -> None: + """ + Verify that all links in the sitemap are valid by making a request to each one. + """ + with self.app.test_request_context(): + with self.client.open(url_for("get_sitemap")) as response: + self.assertEqual(response.status_code, 200) + html_content = response.data.decode() + + # Extract all href links using regex + href_pattern = re.compile(r'href=["\'](.*?)["\']') + links = href_pattern.findall(html_content) + + self.assertTrue(len(links) > 0, "No links found in sitemap") + + # Test each link + for link in links: + # Skip external links + if link.startswith(("http://", "https://")): + continue + + link = urllib.parse.unquote(html.unescape(link)) + + with self.client.open(link) as response, self.subTest(link=link): + self.assertIn(response.status_code, self.valid_status_codes, + f"Link {link} returned invalid status code {response.status_code}") From 85c26f97400a6caaa7a690b9a299e7373c8ace80 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:38:22 +0000 Subject: [PATCH 003/204] WebHost: redirect old tutorials to new URL (#5319) * WebHost: redirect old tutorials to new URL * WebHost: make comment in tutorial_redirect more accurate --- WebHostLib/misc.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index ee85d3de..c57a6386 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -133,6 +133,15 @@ def tutorial(game: str, file: str): return abort(404) +@app.route('/tutorial///') +def tutorial_redirect(game: str, file: str, lang: str): + """ + Permanent redirect old tutorial URLs to new ones to keep search engines happy. + e.g. /tutorial/Archipelago/setup/en -> /tutorial/Archipelago/setup_en + """ + return redirect(url_for("tutorial", game=game, file=f"{file}_{lang}"), code=301) + + @app.route('/tutorial/') @cache.cached() def tutorial_landing(): From 6e6fd0e9bcc40c7524fe5520a4382e43deb70a14 Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Tue, 12 Aug 2025 14:01:29 -0600 Subject: [PATCH 004/204] CV64 and CotM: Correct Archipleago (#5323) --- worlds/cv64/__init__.py | 2 +- worlds/cvcotm/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/cv64/__init__.py b/worlds/cv64/__init__.py index 1bd069a2..117fd44e 100644 --- a/worlds/cv64/__init__.py +++ b/worlds/cv64/__init__.py @@ -37,7 +37,7 @@ class CV64Web(WebWorld): tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Archipleago Castlevania 64 randomizer on your computer and connecting it to a " + "A guide to setting up the Archipelago Castlevania 64 randomizer on your computer and connecting it to a " "multiworld.", "English", "setup_en.md", diff --git a/worlds/cvcotm/__init__.py b/worlds/cvcotm/__init__.py index a2d52b3e..829c73ae 100644 --- a/worlds/cvcotm/__init__.py +++ b/worlds/cvcotm/__init__.py @@ -41,7 +41,7 @@ class CVCotMWeb(WebWorld): tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Archipleago Castlevania: Circle of the Moon randomizer on your computer and " + "A guide to setting up the Archipelago Castlevania: Circle of the Moon randomizer on your computer and " "connecting it to a multiworld.", "English", "setup_en.md", From 0020e6c3d324ec1b74ba5a2db92bb2b464efce39 Mon Sep 17 00:00:00 2001 From: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:35:25 -0400 Subject: [PATCH 005/204] KH2: Fix html headers to be markdown (#5305) * update setup guide * Update worlds/kh2/docs/setup_en.md Co-authored-by: Fabian Dill * Update worlds/kh2/docs/setup_en.md Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Update en_Kingdom Hearts 2.md --------- Co-authored-by: Fabian Dill Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- worlds/kh2/docs/en_Kingdom Hearts 2.md | 24 +++++++++---------- worlds/kh2/docs/setup_en.md | 32 +++++++++++++------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/worlds/kh2/docs/en_Kingdom Hearts 2.md b/worlds/kh2/docs/en_Kingdom Hearts 2.md index 5aae7ad3..6924800e 100644 --- a/worlds/kh2/docs/en_Kingdom Hearts 2.md +++ b/worlds/kh2/docs/en_Kingdom Hearts 2.md @@ -1,15 +1,15 @@ # Kingdom Hearts 2 -

Changes from the vanilla game

+## Changes from the vanilla game This randomizer creates a more dynamic play experience by randomizing the locations of most items in Kingdom Hearts 2. Currently all items within Chests, Popups, Get Bonuses, Form Levels, and Sora's Levels are randomized. This allows abilities that Sora would normally have to be placed on Keyblades with random stats. Additionally, there are several options for ways to finish the game, allowing for different goals beyond beating the final boss. -

Where is the options page

+## Where is the options page The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. -

What is randomized in this game?

+## What is randomized in this game? - Chests @@ -21,27 +21,27 @@ The [player options page for this game](../player-options) contains all the opti - Keyblade Stats - Keyblade Abilities -

What Kingdom Hearts 2 items can appear in other players' worlds?

+## What Kingdom Hearts 2 items can appear in other players' worlds? Every item in the game except for abilities on weapons. -

What is The Garden of Assemblage "GoA"?

+## What is The Garden of Assemblage "GoA"? The Garden of Assemblage Mod made by Sonicshadowsilver2 and Num turns the Garden of Assemblage into a “World Hub” where each portal takes you to one of the game worlds (as opposed to having a world map). This allows you to enter worlds at any time, and world progression is maintained for each world individually. -

What does another world's item look like in Kingdom Hearts 2?

+## What does another world's item look like in Kingdom Hearts 2? In Kingdom Hearts 2, items which need to be sent to other worlds appear in any location that has a item in the vanilla game. They are represented by the Archipelago icon, and must be "picked up" as if it were a normal item. Upon obtaining the item, it will be sent to its home world. -

When the player receives an item, what happens?

+## When the player receives an item, what happens? It is added to your inventory. If you obtain magic, you will need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

What Happens if I die before Room Saving?

+## What Happens if I die before Room Saving? When you die in vanilla Kingdom Hearts 2, you are reverted to the last non-boss room you entered and your status is reverted to what it was at that time. However, in archipelago, any item that you have sent/received will not be taken away from the player, any chest you have opened will remain open, and you will keep your level, but lose the experience. @@ -49,7 +49,7 @@ When you die in vanilla Kingdom Hearts 2, you are reverted to the last non-boss For example, if you are fighting Roxas, receive Reflect Element, then die mid-fight, you will keep that Reflect Element. You will still need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

Customization options:

+## Customization options: - Choose a goal from the list below (with an additional option to Kill Final Xemnas alongside your goal). @@ -64,11 +64,11 @@ For example, if you are fighting Roxas, receive Reflect Element, then die mid-fi - Customize the amount and level of progressive movement (Growth Abilities) you start with. - Customize start inventory, i.e., begin every run with certain items or spells of your choice. -

What are Lucky Emblems?

+## What are Lucky Emblems? Lucky Emblems are items that are required to beat the game if your goal is "Lucky Emblem Hunt".
You can think of these as requiring X number of Proofs of Nonexistence to open the final door. -

What is Hitlist/Bounties?

+## What is Hitlist/Bounties? The Hitlist goal adds "bounty" items to select late-game fights and locations, and you need to collect X number of them to win.
The list of possible locations that can contain a bounty: @@ -82,7 +82,7 @@ The list of possible locations that can contain a bounty: - Transport to Remembrance - Godess of Fate cup and Hades Paradox cup -

Quality of life:

+## Quality of life: With the help of Shananas, Num, and ZakTheRobot we have many QoL features such are: diff --git a/worlds/kh2/docs/setup_en.md b/worlds/kh2/docs/setup_en.md index a1248d10..db0f6c86 100644 --- a/worlds/kh2/docs/setup_en.md +++ b/worlds/kh2/docs/setup_en.md @@ -1,11 +1,11 @@ # Kingdom Hearts 2 Archipelago Setup Guide -

Quick Links

+## Quick Links - [Game Info Page](../../../../games/Kingdom%20Hearts%202/info/en) - [Player Options Page](../../../../games/Kingdom%20Hearts%202/player-options) -

Required Software:

+## Required Software: Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) @@ -23,39 +23,39 @@ Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames. 1. Optionally Install the Archipelago Quality Of Life mod from `JaredWeakStrike/AP_QOL` using OpenKH Mod Manager 2. Optionally Install the Quality Of Life mod from `shananas/BearSkip` using OpenKH Mod Manager -

Required: Archipelago Companion Mod

+### Required: Archipelago Companion Mod Load this mod just like the GoA ROM you did during the KH2 Rando setup. `JaredWeakStrike/APCompanion`
Have this mod second-highest priority below the .zip seed.
This mod is based upon Num's Garden of Assemblage Mod and requires it to work. Without Num this could not be possible. -

Required: Auto Save Mod and KH2 Lua Library

+### Required: Auto Save Mod and KH2 Lua Library -Load these mods just like you loaded the GoA ROM mod during the KH2 Rando setup. `KH2FM-Mods-equations19/auto-save` and `KH2FM-Mods-equations19/KH2-Lua-Library` Location doesn't matter, required in case of crashes. See [Best Practices](en#best-practices) on how to load the auto save +Load these mods just like you loaded the GoA ROM mod during the KH2 Rando setup. `KH2FM-Mods-equations19/auto-save` and `KH2FM-Mods-equations19/KH2-Lua-Library` Location doesn't matter, required in case of crashes. See [Best Practices](#best-practices) on how to load the auto save -

Optional QoL Mods: AP QoL and Bear Skip

+### Optional QoL Mods: AP QoL and Bear Skip `JaredWeakStrike/AP_QOL` Makes the urns minigames much faster, makes Cavern of Remembrance orbs drop significantly more drive orbs for refilling drive/leveling master form, skips the animation when using the bulky vendor RC, skips carpet escape auto-scroller in Agrabah 2, and prevents the wardrobe in the Beasts Castle wardrobe push minigame from waking up while being pushed. `shananas/BearSkip` Skips all minigames in 100 Acre Woods except the Spooky Cave minigame since there are chests in Spooky Cave you can only get during the minigame. For Spooky Cave, Pooh is moved to the other side of the invisible wall that prevents you from using his RC to finish the minigame. -

Installing A Seed

+### Installing A Seed When you generate a game you will see a download link for a KH2 .zip seed on the room page. Download the seed then open OpenKH Mod Manager and click the green plus and "Select and install Mod Archive".
Make sure the seed is on the top of the list (Highest Priority)
After Installing the seed click "Mod Loader -> Build/Build and Run". Every slot is a unique mod to install and will be needed be repatched for different slots/rooms. -

Optional Software:

+## Optional Software: - [Kingdom Hearts 2 AP Tracker](https://github.com/palex00/kh2-ap-tracker/releases/latest/), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases) -

What the Mod Manager Should Look Like.

+## What the Mod Manager Should Look Like. ![image](https://i.imgur.com/N0WJ8Qn.png) -

Using the KH2 Client

+## Using the KH2 Client Start the game through OpenKH Mod Manager. If starting a new run, enter the Garden of Assemblage from a new save. If returning to a run, load the save and enter the Garden of Assemblage. Then run the [ArchipelagoKH2Client.exe](https://github.com/ArchipelagoMW/Archipelago/releases).
When you successfully connect to the server the client will automatically hook into the game to send/receive checks.
@@ -67,13 +67,13 @@ Most checks will be sent to you anywhere outside a load or cutscene.
If you obtain magic, you will need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

KH2 Client should look like this:

+## KH2 Client should look like this: ![image](https://i.imgur.com/qP6CmV8.png) Enter The room's port number into the top box where the x's are and press "Connect". Follow the prompts there and you should be connected -

Common Pitfalls

+## Common Pitfalls - Having an old GOA Lua Script in your `C:\Users\*YourName*\Documents\KINGDOM HEARTS HD 1.5+2.5 ReMIX\scripts\kh2` folder. - Pressing F2 while in game should look like this. ![image](https://i.imgur.com/ABSdtPC.png) @@ -86,7 +86,7 @@ Enter The room's port number into the top box where the x's are and pres - Using a seed from the standalone KH2 Randomizer Seed Generator. - The Archipelago version of the KH2 Randomizer does not use this Seed Generator; refer to the [Archipelago Setup](https://archipelago.gg/tutorial/Archipelago/setup/en) to learn how to generate and play a seed through Archipelago. -

Best Practices

+## Best Practices - Make a save at the start of the GoA before opening anything. This will be the file to select when loading an autosave if/when your game crashes. - If you don't want to have a save in the GoA. Disconnect the client, load the auto save, and then reconnect the client after it loads the auto save. @@ -94,13 +94,13 @@ Enter The room's port number into the top box where the x's are and pres - Run the game in windows/borderless windowed mode. Fullscreen is stable but the game can crash if you alt-tab out. - Make sure to save in a different save slot when playing in an async or disconnecting from the server to play a different seed -

Logic Sheet & PopTracker Autotracking

+## Logic Sheet & PopTracker Autotracking Have any questions on what's in logic? This spreadsheet made by Bulcon has the answer [Requirements/logic sheet](https://docs.google.com/spreadsheets/d/1nNi8ohEs1fv-sDQQRaP45o6NoRcMlLJsGckBonweDMY/edit?usp=sharing) Alternatively you can use the Kingdom Hearts 2 PopTracker Pack that is based off of the logic sheet above and does all the work for you. -

PopTracker Pack

+### PopTracker Pack 1. Download [Kingdom Hearts 2 AP Tracker](https://github.com/palex00/kh2-ap-tracker/releases/latest/) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). @@ -112,7 +112,7 @@ Alternatively you can use the Kingdom Hearts 2 PopTracker Pack that is based off This pack will handle logic, received items, checked locations and autotabbing for you! -

F.A.Q.

+## F.A.Q. - Why is my Client giving me a "Cannot Open Process: " error? - Due to how the client reads kingdom hearts 2 memory some people's computer flags it as a virus. Run the client as admin. From 5110676c76277b3bfddb1dde27c8635d853b2172 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 15 Aug 2025 11:44:24 +0200 Subject: [PATCH 006/204] Core: 0.6.4 (#5314) --- Utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utils.py b/Utils.py index b7616b57..04c4ac57 100644 --- a/Utils.py +++ b/Utils.py @@ -47,7 +47,7 @@ class Version(typing.NamedTuple): return ".".join(str(item) for item in self) -__version__ = "0.6.3" +__version__ = "0.6.4" version_tuple = tuplize_version(__version__) is_linux = sys.platform.startswith("linux") From b85887241f96ccef74a836c494ff24b9bf64cbff Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Fri, 15 Aug 2025 10:36:13 +0000 Subject: [PATCH 007/204] CI: update appimagetool hash (#5333) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e886ae82..7151ff00 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ env: # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, # we check the sha256 and require manual intervention if it was updated. APPIMAGETOOL_VERSION: continuous - APPIMAGETOOL_X86_64_HASH: '363dafac070b65cc36ca024b74db1f043c6f5cd7be8fca760e190dce0d18d684' + APPIMAGETOOL_X86_64_HASH: '29348a20b80827cd261c28e95172ff828b69d43d4e4e18e3fd069e2c8693c94e' APPIMAGE_RUNTIME_VERSION: continuous APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b7fdd1b..8c5d87b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ env: # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, # we check the sha256 and require manual intervention if it was updated. APPIMAGETOOL_VERSION: continuous - APPIMAGETOOL_X86_64_HASH: '363dafac070b65cc36ca024b74db1f043c6f5cd7be8fca760e190dce0d18d684' + APPIMAGETOOL_X86_64_HASH: '29348a20b80827cd261c28e95172ff828b69d43d4e4e18e3fd069e2c8693c94e' APPIMAGE_RUNTIME_VERSION: continuous APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' From 8f7fcd4889002b89f0e0d07364a1faaf269a80b6 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Fri, 15 Aug 2025 05:55:11 -0700 Subject: [PATCH 008/204] Zillion: Move `completion_condition` Definition Earlier (#5279) --- worlds/zillion/__init__.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/worlds/zillion/__init__.py b/worlds/zillion/__init__.py index 588654d2..02ef920d 100644 --- a/worlds/zillion/__init__.py +++ b/worlds/zillion/__init__.py @@ -168,8 +168,8 @@ class ZillionWorld(World): def create_regions(self) -> None: assert self.zz_system.randomizer, "generate_early hasn't been called" assert self.id_to_zz_item, "generate_early hasn't been called" - p = self.player - logic_cache = ZillionLogicCache(p, self.zz_system.randomizer, self.id_to_zz_item) + player = self.player + logic_cache = ZillionLogicCache(player, self.zz_system.randomizer, self.id_to_zz_item) self.logic_cache = logic_cache w = self.multiworld self.my_locations = [] @@ -192,7 +192,7 @@ class ZillionWorld(World): all_regions: dict[str, ZillionRegion] = {} for here_zz_name, zz_r in self.zz_system.randomizer.regions.items(): here_name = "Menu" if here_zz_name == "start" else zz_reg_name_to_reg_name(here_zz_name) - all_regions[here_name] = ZillionRegion(zz_r, here_name, here_name, p, w) + all_regions[here_name] = ZillionRegion(zz_r, here_name, here_name, player, w) self.multiworld.regions.append(all_regions[here_name]) limited_skill = Req(gun=3, jump=3, skill=self.zz_system.randomizer.options.skill, hp=940, red=1, floppy=126) @@ -239,7 +239,7 @@ class ZillionWorld(World): for zz_dest in zz_here.connections.keys(): dest_name = "Menu" if zz_dest.name == "start" else zz_reg_name_to_reg_name(zz_dest.name) dest = all_regions[dest_name] - exit_ = Entrance(p, f"{here_name} to {dest_name}", here) + exit_ = Entrance(player, f"{here_name} to {dest_name}", here) here.exits.append(exit_) exit_.connect(dest) @@ -248,6 +248,11 @@ class ZillionWorld(World): if self.options.priority_dead_ends.value: self.options.priority_locations.value |= {loc.name for loc in dead_end_locations} + # main location name is an alias + main_loc_name = self.zz_system.randomizer.loc_name_2_pretty[self.zz_system.randomizer.locations["main"].name] + self.multiworld.get_location(main_loc_name, player).place_locked_item(self.create_item("Win")) + self.multiworld.completion_condition[player] = lambda state: state.has("Win", player) + @override def create_items(self) -> None: if not self.id_to_zz_item: @@ -272,17 +277,6 @@ class ZillionWorld(World): self.logger.debug(f"Zillion Items: {item_name} 1") self.multiworld.itempool.append(self.create_item(item_name)) - @override - def generate_basic(self) -> None: - assert self.zz_system.randomizer, "generate_early hasn't been called" - # main location name is an alias - main_loc_name = self.zz_system.randomizer.loc_name_2_pretty[self.zz_system.randomizer.locations["main"].name] - - self.multiworld.get_location(main_loc_name, self.player)\ - .place_locked_item(self.create_item("Win")) - self.multiworld.completion_condition[self.player] = \ - lambda state: state.has("Win", self.player) - @staticmethod def stage_generate_basic(multiworld: MultiWorld, *args: Any) -> None: # noqa: ANN401 # item link pools are about to be created in main From 9d654b7e3b489d5f1b854dfe24518beb24ba1b8d Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 15 Aug 2025 18:45:40 +0200 Subject: [PATCH 009/204] Core: drop Python 3.10 (#5324) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- .github/pyright-config.json | 2 +- .github/workflows/analyze-modified-files.yml | 2 +- .github/workflows/unittests.yml | 5 ++--- ModuleUpdate.py | 10 +++++----- Utils.py | 2 +- docs/contributing.md | 2 +- docs/running from source.md | 2 +- worlds/generic/docs/mac_en.md | 2 +- 8 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/pyright-config.json b/.github/pyright-config.json index b6561afa..64a46d80 100644 --- a/.github/pyright-config.json +++ b/.github/pyright-config.json @@ -29,7 +29,7 @@ "reportMissingImports": true, "reportMissingTypeStubs": true, - "pythonVersion": "3.10", + "pythonVersion": "3.11", "pythonPlatform": "Windows", "executionEnvironments": [ diff --git a/.github/workflows/analyze-modified-files.yml b/.github/workflows/analyze-modified-files.yml index 6788abd3..862a050c 100644 --- a/.github/workflows/analyze-modified-files.yml +++ b/.github/workflows/analyze-modified-files.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-python@v5 if: env.diff != '' with: - python-version: '3.10' + python-version: '3.11' - name: "Install dependencies" if: env.diff != '' diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 2d83c649..96219daa 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -39,11 +39,10 @@ jobs: matrix: os: [ubuntu-latest] python: - - {version: '3.10'} - - {version: '3.11'} + - {version: '3.11.2'} # Change to '3.11' around 2026-06-10 - {version: '3.12'} include: - - python: {version: '3.10'} # old compat + - python: {version: '3.11'} # old compat os: windows-latest - python: {version: '3.12'} # current os: windows-latest diff --git a/ModuleUpdate.py b/ModuleUpdate.py index 2e58c4f7..46064d3f 100644 --- a/ModuleUpdate.py +++ b/ModuleUpdate.py @@ -5,15 +5,15 @@ import multiprocessing import warnings -if sys.platform in ("win32", "darwin") and sys.version_info < (3, 10, 11): +if sys.platform in ("win32", "darwin") and sys.version_info < (3, 11, 9): # Official micro version updates. This should match the number in docs/running from source.md. - raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. Official 3.10.15+ is supported.") -elif sys.platform in ("win32", "darwin") and sys.version_info < (3, 10, 15): + raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. Official 3.11.9+ is supported.") +elif sys.platform in ("win32", "darwin") and sys.version_info < (3, 11, 13): # There are known security issues, but no easy way to install fixed versions on Windows for testing. warnings.warn(f"Python Version {sys.version_info} has security issues. Don't use in production.") -elif sys.version_info < (3, 10, 1): +elif sys.version_info < (3, 11, 0): # Other platforms may get security backports instead of micro updates, so the number is unreliable. - raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. 3.10.1+ is supported.") + raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. 3.11.0+ is supported.") # don't run update if environment is frozen/compiled or if not the parent process (skip in subprocess) _skip_update = bool( diff --git a/Utils.py b/Utils.py index 04c4ac57..fc8dd726 100644 --- a/Utils.py +++ b/Utils.py @@ -900,7 +900,7 @@ def async_start(co: Coroutine[None, None, typing.Any], name: Optional[str] = Non Use this to start a task when you don't keep a reference to it or immediately await it, to prevent early garbage collection. "fire-and-forget" """ - # https://docs.python.org/3.10/library/asyncio-task.html#asyncio.create_task + # https://docs.python.org/3.11/library/asyncio-task.html#asyncio.create_task # Python docs: # ``` # Important: Save a reference to the result of [asyncio.create_task], diff --git a/docs/contributing.md b/docs/contributing.md index 96fc316b..06d83beb 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -16,7 +16,7 @@ game contributions: * **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.10](https://www.python.org/downloads/release/python-31015/). + is [Python 3.11](https://www.python.org/downloads/release/python-31113/). It is recommended that automated github actions are turned on in your fork to have github run unit tests after pushing. You can turn them on here: diff --git a/docs/running from source.md b/docs/running from source.md index 8e8b4f4b..36bff8c8 100644 --- a/docs/running from source.md +++ b/docs/running from source.md @@ -7,7 +7,7 @@ use that version. These steps are for developers or platforms without compiled r ## General What you'll need: - * [Python 3.10.11 or newer](https://www.python.org/downloads/), not the Windows Store version + * [Python 3.11.9 or newer](https://www.python.org/downloads/), not the Windows Store version * On Windows, please consider only using the latest supported version in production environments since security updates for older versions are not easily available. * Python 3.12.x is currently the newest supported version diff --git a/worlds/generic/docs/mac_en.md b/worlds/generic/docs/mac_en.md index 38fd3cd9..72f7d1a8 100644 --- a/worlds/generic/docs/mac_en.md +++ b/worlds/generic/docs/mac_en.md @@ -2,7 +2,7 @@ Archipelago does not have a compiled release on macOS. However, it is possible to run from source code on macOS. This guide expects you to have some experience with running software from the terminal. ## Prerequisite Software Here is a list of software to install and source code to download. -1. Python 3.10 "universal2" or newer from the [macOS Python downloads page](https://www.python.org/downloads/macos/). +1. Python 3.11 "universal2" or newer from the [macOS Python downloads page](https://www.python.org/downloads/macos/). **Python 3.13 is not supported yet.** 2. Xcode from the [macOS App Store](https://apps.apple.com/us/app/xcode/id497799835). 3. The source code from the [Archipelago releases page](https://github.com/ArchipelagoMW/Archipelago/releases). From eb09be35947002edf3c83d5b02736fa652cc7eef Mon Sep 17 00:00:00 2001 From: Faris <162540354+FarisTheAncient@users.noreply.github.com> Date: Sat, 16 Aug 2025 16:08:44 -0500 Subject: [PATCH 010/204] OSRS: Fix UT Integration and Various Gen Failures (#5331) --- worlds/osrs/Locations.py | 2 + worlds/osrs/LogicCSV/LogicCSVToPython.py | 2 +- worlds/osrs/LogicCSV/locations_generated.py | 2 +- worlds/osrs/Options.py | 2 +- worlds/osrs/Rules.py | 2 + worlds/osrs/__init__.py | 94 ++++++++++++++------- 6 files changed, 69 insertions(+), 35 deletions(-) diff --git a/worlds/osrs/Locations.py b/worlds/osrs/Locations.py index b5827d60..324da86b 100644 --- a/worlds/osrs/Locations.py +++ b/worlds/osrs/Locations.py @@ -3,6 +3,8 @@ import typing from BaseClasses import Location +task_types = ["prayer", "magic", "runecraft", "mining", "crafting", "smithing", "fishing", "cooking", "firemaking", "woodcutting", "combat"] + class SkillRequirement(typing.NamedTuple): skill: str level: int diff --git a/worlds/osrs/LogicCSV/LogicCSVToPython.py b/worlds/osrs/LogicCSV/LogicCSVToPython.py index b66f53cc..082bda7a 100644 --- a/worlds/osrs/LogicCSV/LogicCSVToPython.py +++ b/worlds/osrs/LogicCSV/LogicCSVToPython.py @@ -8,7 +8,7 @@ import requests # The CSVs are updated at this repository to be shared between generator and client. data_repository_address = "https://raw.githubusercontent.com/digiholic/osrs-archipelago-logic/" # The Github tag of the CSVs this was generated with -data_csv_tag = "v2.0.4" +data_csv_tag = "v2.0.5" # If true, generate using file names in the repository debug = False diff --git a/worlds/osrs/LogicCSV/locations_generated.py b/worlds/osrs/LogicCSV/locations_generated.py index 4c1cd0bd..03156b1c 100644 --- a/worlds/osrs/LogicCSV/locations_generated.py +++ b/worlds/osrs/LogicCSV/locations_generated.py @@ -77,7 +77,7 @@ location_rows = [ LocationRow('Bake a Redberry Pie', 'cooking', ['Redberry Bush', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 10), ], [], 0), LocationRow('Cook some Stew', 'cooking', ['Bowl', 'Meat', 'Potato', ], [SkillRequirement('Cooking', 25), ], [], 0), LocationRow('Bake an Apple Pie', 'cooking', ['Cooking Apple', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 32), ], [], 2), - LocationRow('Enter the Cook\'s Guild', 'cooking', ['Cook\'s Guild', ], [], [], 0), + LocationRow('Enter the Cook\'s Guild', 'cooking', ['Cook\'s Guild', ], [SkillRequirement('Cooking', 32), ], [], 0), LocationRow('Bake a Cake', 'cooking', ['Wheat', 'Windmill', 'Egg', 'Milk', 'Cake Tin', ], [SkillRequirement('Cooking', 40), ], [], 6), LocationRow('Bake a Meat Pizza', 'cooking', ['Wheat', 'Windmill', 'Cheese', 'Tomato', 'Meat', ], [SkillRequirement('Cooking', 45), ], [], 8), LocationRow('Burn a Log', 'firemaking', [], [SkillRequirement('Firemaking', 1), SkillRequirement('Woodcutting', 1), ], [], 0), diff --git a/worlds/osrs/Options.py b/worlds/osrs/Options.py index 55a040b0..cf0754a3 100644 --- a/worlds/osrs/Options.py +++ b/worlds/osrs/Options.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from Options import Choice, Toggle, Range, PerGameCommonOptions -MAX_COMBAT_TASKS = 16 +MAX_COMBAT_TASKS = 17 MAX_PRAYER_TASKS = 5 MAX_MAGIC_TASKS = 7 diff --git a/worlds/osrs/Rules.py b/worlds/osrs/Rules.py index 7fd770f0..1cdaabe3 100644 --- a/worlds/osrs/Rules.py +++ b/worlds/osrs/Rules.py @@ -190,6 +190,8 @@ def get_firemaking_skill_rule(level, player, options) -> CollectionRule: def get_skill_rule(skill, level, player, options) -> CollectionRule: + if level <= 1: + return lambda state: True if skill.lower() == "fishing": return get_fishing_skill_rule(level, player, options) if skill.lower() == "mining": diff --git a/worlds/osrs/__init__.py b/worlds/osrs/__init__.py index a54e272d..e0587daf 100644 --- a/worlds/osrs/__init__.py +++ b/worlds/osrs/__init__.py @@ -1,11 +1,11 @@ import typing -from BaseClasses import Item, Tutorial, ItemClassification, Region, MultiWorld, CollectionState -from Fill import fill_restrictive, FillError +from BaseClasses import Item, Tutorial, ItemClassification, Region, MultiWorld from worlds.AutoWorld import WebWorld, World +from Options import OptionError from .Items import OSRSItem, starting_area_dict, chunksanity_starting_chunks, QP_Items, ItemRow, \ chunksanity_special_region_names -from .Locations import OSRSLocation, LocationRow +from .Locations import OSRSLocation, LocationRow, task_types from .Rules import * from .Options import OSRSOptions, StartingArea from .Names import LocationNames, ItemNames, RegionNames @@ -47,6 +47,7 @@ class OSRSWorld(World): base_id = 0x070000 data_version = 1 explicit_indirect_conditions = False + ut_can_gen_without_yaml = True item_name_to_id = {item_rows[i].name: 0x070000 + i for i in range(len(item_rows))} location_name_to_id = {location_rows[i].name: 0x070000 + i for i in range(len(location_rows))} @@ -105,6 +106,18 @@ class OSRSWorld(World): # Set Starting Chunk self.multiworld.push_precollected(self.create_item(self.starting_area_item)) + elif hasattr(self.multiworld,"re_gen_passthrough") and self.game in self.multiworld.re_gen_passthrough: + re_gen_passthrough = self.multiworld.re_gen_passthrough[self.game] # UT passthrough + if "starting_area" in re_gen_passthrough: + self.starting_area_item = re_gen_passthrough["starting_area"] + for task_type in task_types: + if f"max_{task_type}_level" in re_gen_passthrough: + getattr(self.options,f"max_{task_type}_level").value = re_gen_passthrough[f"max_{task_type}_level"] + max_count = getattr(self.options,f"max_{task_type}_tasks") + max_count.value = max_count.range_end + self.options.brutal_grinds.value = re_gen_passthrough["brutal_grinds"] + + """ This function pulls from LogicCSVToPython so that it sends the correct tag of the repository to the client. @@ -115,20 +128,13 @@ class OSRSWorld(World): data = self.options.as_dict("brutal_grinds") data["data_csv_tag"] = data_csv_tag data["starting_area"] = str(self.starting_area_item) #these aren't actually strings, they just play them on tv + for task_type in task_types: + data[f"max_{task_type}_level"] = getattr(self.options,f"max_{task_type}_level").value return data - def interpret_slot_data(self, slot_data: typing.Dict[str, typing.Any]) -> None: - if "starting_area" in slot_data: - self.starting_area_item = slot_data["starting_area"] - menu_region = self.multiworld.get_region("Menu",self.player) - menu_region.exits.clear() #prevent making extra exits if players just reconnect to a differnet slot - if self.starting_area_item in chunksanity_special_region_names: - starting_area_region = chunksanity_special_region_names[self.starting_area_item] - else: - starting_area_region = self.starting_area_item[6:] # len("Area: ") - starting_entrance = menu_region.create_exit(f"Start->{starting_area_region}") - starting_entrance.access_rule = lambda state: state.has(self.starting_area_item, self.player) - starting_entrance.connect(self.region_name_to_data[starting_area_region]) + @staticmethod + def interpret_slot_data(slot_data: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any]: + return slot_data def create_regions(self) -> None: """ @@ -195,6 +201,8 @@ class OSRSWorld(World): generation_is_fake = hasattr(self.multiworld, "generation_is_fake") # UT specific override locations_required = 0 for item_row in item_rows: + if item_row.name == self.starting_area_item: + continue #skip starting area # If it's a filler item, set it aside for later if item_row.progression == ItemClassification.filler: continue @@ -206,15 +214,18 @@ class OSRSWorld(World): locations_required += item_row.amount if self.options.enable_duds: locations_required += self.options.dud_count - locations_added = 1 # At this point we've already added the starting area, so we start at 1 instead of 0 - + locations_added = 0 # Keep track of the number of locations we add so we don't add more the number of items we're going to make # Quests are always added first, before anything else is rolled for i, location_row in enumerate(location_rows): - if location_row.category in {"quest", "points", "goal"}: + if location_row.category in {"quest"}: if self.task_within_skill_levels(location_row.skills): self.create_and_add_location(i) - if location_row.category == "quest": - locations_added += 1 + locations_added += 1 + elif location_row.category in {"goal"}: + if not self.task_within_skill_levels(location_row.skills): + raise OptionError(f"Goal location for {self.player_name} not allowed in skill levels") #it doesn't actually have any, but just in case for future + self.create_and_add_location(i) + # Build up the weighted Task Pool rnd = self.random @@ -225,18 +236,28 @@ class OSRSWorld(World): rnd.shuffle(general_tasks) else: general_tasks.reverse() - for i in range(self.options.minimum_general_tasks): + general_tasks_added = 0 + while general_tasks_added0: + task = general_tasks.pop() + if self.task_within_skill_levels(task.skills): + self.add_location(task) + locations_added += 1 + general_tasks_added += 1 + if general_tasks_added < self.options.minimum_general_tasks: + raise OptionError(f"{self.plyaer_name} doesn't have enough general tasks to create required minimum count"+ + f", raise maximum skill levels or lower minimum general tasks") - general_weight = self.options.general_task_weight if len(general_tasks) > 0 else 0 + general_weight = self.options.general_task_weight.value if len(general_tasks) > 0 else 0 tasks_per_task_type: typing.Dict[str, typing.List[LocationRow]] = {} weights_per_task_type: typing.Dict[str, int] = {} - - task_types = ["prayer", "magic", "runecraft", "mining", "crafting", - "smithing", "fishing", "cooking", "firemaking", "woodcutting", "combat"] + for task_type in task_types: max_amount_for_task_type = getattr(self.options, f"max_{task_type}_tasks") tasks_for_this_type = [task for task in self.locations_by_category[task_type] @@ -263,10 +284,13 @@ class OSRSWorld(World): all_weights.append(weights_per_task_type[task_type]) # Even after the initial forced generals, they can still be rolled randomly - if general_weight > 0: + if general_weight > 0 and len(general_tasks)>0: all_tasks.append(general_tasks) all_weights.append(general_weight) + if not generation_is_fake and locations_added > locations_required: #due to minimum general tasks we already have more than needed + raise OptionError(f"Too many locations created for {self.player_name}, lower the minimum general tasks") + while locations_added < locations_required or (generation_is_fake and len(all_tasks) > 0): if all_tasks: chosen_task = rnd.choices(all_tasks, all_weights)[0] @@ -282,9 +306,9 @@ class OSRSWorld(World): del all_tasks[index] del all_weights[index] - else: + else: # We can ignore general tasks in UT because they will have been cleared already if len(general_tasks) == 0: - raise Exception(f"There are not enough available tasks to fill the remaining pool for OSRS " + + raise OptionError(f"There are not enough available tasks to fill the remaining pool for OSRS " + f"Please adjust {self.player_name}'s settings to be less restrictive of tasks.") task = general_tasks.pop() self.add_location(task) @@ -296,7 +320,7 @@ class OSRSWorld(World): self.create_and_add_location(index) def create_items(self) -> None: - filler_items = [] + filler_items:list[ItemRow] = [] for item_row in item_rows: if item_row.name != self.starting_area_item: # If it's a filler item, set it aside for later @@ -321,7 +345,7 @@ class OSRSWorld(World): def get_filler_item_name(self) -> str: if self.options.enable_duds: - return self.random.choice([item for item in item_rows if item.progression == ItemClassification.filler]) + return self.random.choice([item.name for item in item_rows if item.progression == ItemClassification.filler]) else: return self.random.choice([ItemNames.Progressive_Weapons, ItemNames.Progressive_Magic, ItemNames.Progressive_Range_Weapon, ItemNames.Progressive_Armor, @@ -388,6 +412,12 @@ class OSRSWorld(World): # Set the access rule for the QP Location add_rule(qp_loc, lambda state, loc=q_loc: (loc.can_reach(state))) + qp = 0 + for qp_event in self.available_QP_locations: + qp += int(qp_event[0]) + if qp < self.location_rows_by_name[LocationNames.Q_Dragon_Slayer].qp: + raise OptionError(f"{self.player_name} doesn't have enough quests for reach goal, increase maximum skill levels") + # place "Victory" at "Dragon Slayer" and set collection as win condition self.multiworld.get_location(LocationNames.Q_Dragon_Slayer, self.player) \ .place_locked_item(self.create_event("Victory")) From 6f7ca082f22b350c9fc7dfea3e6357635c2da60b Mon Sep 17 00:00:00 2001 From: Flit <8645405+FlitPix@users.noreply.github.com> Date: Sun, 17 Aug 2025 14:47:01 -0400 Subject: [PATCH 011/204] Docker: use python:3.12-slim-bookworm (#5343) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9e3c5f0d..294767be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,7 @@ COPY intset.h . RUN cythonize -b -i _speedups.pyx # Archipelago -FROM python:3.12-slim AS archipelago +FROM python:3.12-slim-bookworm AS archipelago ARG TARGETARCH ENV VIRTUAL_ENV=/opt/venv ENV PYTHONUNBUFFERED=1 From 6ba2b7f8c36e3f2945223183d99c043f0069a8c9 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:46:48 -0500 Subject: [PATCH 012/204] Tests: implement pattern for filtering unittests locally (#5080) --- test/worlds/__init__.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/test/worlds/__init__.py b/test/worlds/__init__.py index 4bc01751..4a4e3e07 100644 --- a/test/worlds/__init__.py +++ b/test/worlds/__init__.py @@ -1,17 +1,46 @@ -def load_tests(loader, standard_tests, pattern): +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from unittest import TestLoader, TestSuite + + +def load_tests(loader: "TestLoader", standard_tests: "TestSuite", pattern: str): import os import unittest + import fnmatch from .. import file_path from worlds.AutoWorld import AutoWorldRegister suite = unittest.TestSuite() suite.addTests(standard_tests) + + # pattern hack + # all tests from within __init__ are always imported, so we need to filter out the folder earlier + # if the pattern isn't matching a specific world, we don't have much of a solution + + if pattern.startswith("worlds."): + if pattern.endswith(".py"): + pattern = pattern[:-3] + components = pattern.split(".") + world_glob = f"worlds.{components[1]}" + pattern = components[-1] + + elif pattern.startswith(f"worlds{os.path.sep}") or pattern.startswith(f"worlds{os.path.altsep}"): + components = pattern.split(os.path.sep) + if len(components) == 1: + components = pattern.split(os.path.altsep) + world_glob = f"worlds.{components[1]}" + pattern = components[-1] + else: + world_glob = "*" + + folders = [os.path.join(os.path.split(world.__file__)[0], "test") - for world in AutoWorldRegister.world_types.values()] + for world in AutoWorldRegister.world_types.values() + if fnmatch.fnmatch(world.__module__, world_glob)] all_tests = [ test_case for folder in folders if os.path.exists(folder) - for test_collection in loader.discover(folder, top_level_dir=file_path) + for test_collection in loader.discover(folder, top_level_dir=file_path, pattern=pattern) for test_suite in test_collection if isinstance(test_suite, unittest.suite.TestSuite) for test_case in test_suite ] From 9a64b8c5cecc91efbbda7cb300bfad0cca296552 Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:48:56 -0400 Subject: [PATCH 013/204] Webhost: Remove showdown.js Remnants (#4984) --- WebHostLib/static/styles/markdown.css | 6 ------ 1 file changed, 6 deletions(-) diff --git a/WebHostLib/static/styles/markdown.css b/WebHostLib/static/styles/markdown.css index 5ead2c60..ac06dea5 100644 --- a/WebHostLib/static/styles/markdown.css +++ b/WebHostLib/static/styles/markdown.css @@ -28,7 +28,6 @@ font-weight: normal; font-family: LondrinaSolid-Regular, sans-serif; text-transform: uppercase; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; text-shadow: 1px 1px 4px #000000; } @@ -37,7 +36,6 @@ font-size: 38px; font-weight: normal; font-family: LondrinaSolid-Light, sans-serif; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; margin-top: 20px; margin-bottom: 0.5rem; @@ -50,7 +48,6 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; text-align: left; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; margin-bottom: 0.5rem; } @@ -59,7 +56,6 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 24px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ margin-bottom: 24px; } @@ -67,14 +63,12 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 22px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ } .markdown h6, .markdown details summary.h6{ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 20px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ } .markdown h4, .markdown h5, .markdown h6{ From 48906de8733d9a498484810c89a38f0865ec28d7 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Tue, 19 Aug 2025 12:08:39 -0400 Subject: [PATCH 014/204] Jak and Daxter: fix checks getting lost if player disconnects. (#5280) --- worlds/jakanddaxter/client.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/worlds/jakanddaxter/client.py b/worlds/jakanddaxter/client.py index 90e6a42a..fa2aea54 100644 --- a/worlds/jakanddaxter/client.py +++ b/worlds/jakanddaxter/client.py @@ -135,6 +135,10 @@ class JakAndDaxterContext(CommonContext): self.tags = set() await self.send_connect() + async def disconnect(self, allow_autoreconnect: bool = False): + self.locations_checked = set() # Clear this set to gracefully handle server disconnects. + await super(JakAndDaxterContext, self).disconnect(allow_autoreconnect) + def on_package(self, cmd: str, args: dict): if cmd == "RoomInfo": @@ -177,6 +181,10 @@ class JakAndDaxterContext(CommonContext): create_task_log_exception(get_orb_balance()) + # If there were any locations checked while the client wasn't connected, we want to make sure the server + # knows about them. To do that, replay the whole location_outbox (no duplicates will be sent). + self.memr.outbox_index = 0 + # Tell the server if Deathlink is enabled or disabled in the in-game options. # This allows us to "remember" the user's choice. self.on_deathlink_toggle() @@ -254,6 +262,7 @@ class JakAndDaxterContext(CommonContext): # We don't need an ap_inform function because check_locations solves that need. def on_location_check(self, location_ids: list[int]): + self.locations_checked.update(location_ids) # Populate this set to gracefully handle server disconnects. create_task_log_exception(self.check_locations(location_ids)) # CommonClient has no finished_game function, so we will have to craft our own. TODO - Update if that changes. From 16d5b453a79c7ef869e20c1e27b3cf4192b037b3 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 19 Aug 2025 17:35:50 +0000 Subject: [PATCH 015/204] Core: require setuptools>=75 (#5346) Setuptools 70.3.0 seems to not work for us. --- Dockerfile | 2 +- ModuleUpdate.py | 4 ++-- setup.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 294767be..36347898 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ COPY requirements.txt WebHostLib/requirements.txt RUN pip install --no-cache-dir -r \ WebHostLib/requirements.txt \ - "setuptools<81" + "setuptools>=75,<81" COPY _speedups.pyx . COPY intset.h . diff --git a/ModuleUpdate.py b/ModuleUpdate.py index 46064d3f..db42f8e5 100644 --- a/ModuleUpdate.py +++ b/ModuleUpdate.py @@ -74,11 +74,11 @@ def update_command(): def install_pkg_resources(yes=False): try: import pkg_resources # noqa: F401 - except ImportError: + except (AttributeError, ImportError): check_pip() if not yes: confirm("pkg_resources not found, press enter to install it") - subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", "setuptools<81"]) + subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", "setuptools>=75,<81"]) def update(yes: bool = False, force: bool = False) -> None: diff --git a/setup.py b/setup.py index 1808b22c..01342e4e 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ try: install_cx_freeze = False except pkg_resources.ResolutionError: install_cx_freeze = True -except ImportError: +except (AttributeError, ImportError): install_cx_freeze = True pkg_resources = None # type: ignore[assignment] From bead81b64b067c03489c135b326cba1aa5772443 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Wed, 20 Aug 2025 23:46:06 -0600 Subject: [PATCH 016/204] Core: Fix get_unique_identifier failing on missing cache folder (#5322) --- Utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Utils.py b/Utils.py index fc8dd726..5a24bc15 100644 --- a/Utils.py +++ b/Utils.py @@ -414,11 +414,11 @@ def get_adjuster_settings(game_name: str) -> Namespace: @cache_argsless def get_unique_identifier(): common_path = cache_path("common.json") - if os.path.exists(common_path): + try: with open(common_path) as f: common_file = json.load(f) uuid = common_file.get("uuid", None) - else: + except FileNotFoundError: common_file = {} uuid = None @@ -428,6 +428,9 @@ def get_unique_identifier(): from uuid import uuid4 uuid = str(uuid4()) common_file["uuid"] = uuid + + cache_folder = os.path.dirname(common_path) + os.makedirs(cache_folder, exist_ok=True) with open(common_path, "w") as f: json.dump(common_file, f, separators=(",", ":")) return uuid From 88a4a589a0ae4f3f38e6de35772d7bdc3c61a761 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Sat, 23 Aug 2025 01:33:46 -0500 Subject: [PATCH 017/204] WebHost: add a tracker api endpoint (#1052) An endpoint from the tracker page. --- WebHostLib/api/__init__.py | 4 +- WebHostLib/api/tracker.py | 230 +++++++++++++++++++++++++++++++++++++ docs/webhost api.md | 210 +++++++++++++++++++++++++++++++++ 3 files changed, 442 insertions(+), 2 deletions(-) create mode 100644 WebHostLib/api/tracker.py diff --git a/WebHostLib/api/__init__.py b/WebHostLib/api/__init__.py index d0b9d05c..54eb5c1d 100644 --- a/WebHostLib/api/__init__.py +++ b/WebHostLib/api/__init__.py @@ -11,5 +11,5 @@ api_endpoints = Blueprint('api', __name__, url_prefix="/api") def get_players(seed: Seed) -> List[Tuple[str, str]]: return [(slot.player_name, slot.game) for slot in seed.slots.order_by(Slot.player_id)] - -from . import datapackage, generate, room, user # trigger registration +# trigger endpoint registration +from . import datapackage, generate, room, tracker, user diff --git a/WebHostLib/api/tracker.py b/WebHostLib/api/tracker.py new file mode 100644 index 00000000..abf4cdbe --- /dev/null +++ b/WebHostLib/api/tracker.py @@ -0,0 +1,230 @@ +from datetime import datetime, timezone +from typing import Any, TypedDict +from uuid import UUID + +from flask import abort + +from NetUtils import ClientStatus, Hint, NetworkItem, SlotType +from WebHostLib import cache +from WebHostLib.api import api_endpoints +from WebHostLib.models import Room +from WebHostLib.tracker import TrackerData + + +@api_endpoints.route("/tracker/") +@cache.memoize(timeout=60) +def tracker_data(tracker: UUID) -> dict[str, Any]: + """ + Outputs json data to /api/tracker/. + + :param tracker: UUID of current session tracker. + + :return: Tracking data for all players in the room. Typing and docstrings describe the format of each value. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) + + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + class PlayerAlias(TypedDict): + player: int + name: str | None + + player_aliases: list[dict[str, int | list[PlayerAlias]]] = [] + """Slot aliases of all players.""" + for team, players in all_players.items(): + team_player_aliases: list[PlayerAlias] = [] + team_aliases = {"team": team, "players": team_player_aliases} + player_aliases.append(team_aliases) + for player in players: + team_player_aliases.append({"player": player, "alias": tracker_data.get_player_alias(team, player)}) + + class PlayerItemsReceived(TypedDict): + player: int + items: list[NetworkItem] + + player_items_received: list[dict[str, int | list[PlayerItemsReceived]]] = [] + """Items received by each player.""" + for team, players in all_players.items(): + player_received_items: list[PlayerItemsReceived] = [] + team_items_received = {"team": team, "players": player_received_items} + player_items_received.append(team_items_received) + for player in players: + player_received_items.append( + {"player": player, "items": tracker_data.get_player_received_items(team, player)}) + + class PlayerChecksDone(TypedDict): + player: int + locations: list[int] + + player_checks_done: list[dict[str, int | list[PlayerChecksDone]]] = [] + """ID of all locations checked by each player.""" + for team, players in all_players.items(): + per_player_checks: list[PlayerChecksDone] = [] + team_checks_done = {"team": team, "players": per_player_checks} + player_checks_done.append(team_checks_done) + for player in players: + per_player_checks.append( + {"player": player, "locations": sorted(tracker_data.get_player_checked_locations(team, player))}) + + total_checks_done: list[dict[str, int]] = [ + {"team": team, "checks_done": checks_done} + for team, checks_done in tracker_data.get_team_locations_checked_count().items() + ] + """Total number of locations checked for the entire multiworld per team.""" + + class PlayerHints(TypedDict): + player: int + hints: list[Hint] + + hints: list[dict[str, int | list[PlayerHints]]] = [] + """Hints that all players have used or received.""" + for team, players in tracker_data.get_all_slots().items(): + per_player_hints: list[PlayerHints] = [] + team_hints = {"team": team, "players": per_player_hints} + hints.append(team_hints) + for player in players: + player_hints = sorted(tracker_data.get_player_hints(team, player)) + per_player_hints.append({"player": player, "hints": player_hints}) + slot_info = tracker_data.get_slot_info(team, player) + # this assumes groups are always after players + if slot_info.type != SlotType.group: + continue + for member in slot_info.group_members: + team_hints[member]["hints"] += player_hints + + class PlayerTimer(TypedDict): + player: int + time: datetime | None + + activity_timers: list[dict[str, int | list[PlayerTimer]]] = [] + """Time of last activity per player. Returned as RFC 1123 format and null if no connection has been made.""" + for team, players in all_players.items(): + player_timers: list[PlayerTimer] = [] + team_timers = {"team": team, "players": player_timers} + activity_timers.append(team_timers) + for player in players: + player_timers.append({"player": player, "time": None}) + + client_activity_timers: tuple[tuple[int, int], float] = tracker_data._multisave.get("client_activity_timers", ()) + for (team, player), timestamp in client_activity_timers: + # use index since we can rely on order + activity_timers[team]["player_timers"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + + connection_timers: list[dict[str, int | list[PlayerTimer]]] = [] + """Time of last connection per player. Returned as RFC 1123 format and null if no connection has been made.""" + for team, players in all_players.items(): + player_timers: list[PlayerTimer] = [] + team_connection_timers = {"team": team, "players": player_timers} + connection_timers.append(team_connection_timers) + for player in players: + player_timers.append({"player": player, "time": None}) + + client_connection_timers: tuple[tuple[int, int], float] = tracker_data._multisave.get( + "client_connection_timers", ()) + for (team, player), timestamp in client_connection_timers: + connection_timers[team]["players"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + + class PlayerStatus(TypedDict): + player: int + status: ClientStatus + + player_status: list[dict[str, int | list[PlayerStatus]]] = [] + """The current client status for each player.""" + for team, players in all_players.items(): + player_statuses: list[PlayerStatus] = [] + team_status = {"team": team, "players": player_statuses} + player_status.append(team_status) + for player in players: + player_statuses.append({"player": player, "status": tracker_data.get_player_client_status(team, player)}) + + return { + **get_static_tracker_data(room), + "aliases": player_aliases, + "player_items_received": player_items_received, + "player_checks_done": player_checks_done, + "total_checks_done": total_checks_done, + "hints": hints, + "activity_timers": activity_timers, + "connection_timers": connection_timers, + "player_status": player_status, + "datapackage": tracker_data._multidata["datapackage"], + } + +@cache.memoize() +def get_static_tracker_data(room: Room) -> dict[str, Any]: + """ + Builds and caches the static data for this active session tracker, so that it doesn't need to be recalculated. + """ + + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + class PlayerGroups(TypedDict): + slot: int + name: str + members: list[int] + + groups: list[dict[str, int | list[PlayerGroups]]] = [] + """The Slot ID of groups and the IDs of the group's members.""" + for team, players in tracker_data.get_all_slots().items(): + groups_in_team: list[PlayerGroups] = [] + team_groups = {"team": team, "groups": groups_in_team} + groups.append(team_groups) + for player in players: + slot_info = tracker_data.get_slot_info(team, player) + if slot_info.type != SlotType.group or not slot_info.group_members: + continue + groups_in_team.append( + { + "slot": player, + "name": slot_info.name, + "members": list(slot_info.group_members), + }) + class PlayerName(TypedDict): + player: int + name: str + + player_names: list[dict[str, str | list[PlayerName]]] = [] + """Slot names of all players.""" + for team, players in all_players.items(): + per_team_player_names: list[PlayerName] = [] + team_names = {"team": team, "players": per_team_player_names} + player_names.append(team_names) + for player in players: + per_team_player_names.append({"player": player, "name": tracker_data.get_player_name(team, player)}) + + class PlayerGame(TypedDict): + player: int + game: str + + games: list[dict[str, int | list[PlayerGame]]] = [] + """The game each player is playing.""" + for team, players in all_players.items(): + player_games: list[PlayerGame] = [] + team_games = {"team": team, "players": player_games} + games.append(team_games) + for player in players: + player_games.append({"player": player, "game": tracker_data.get_player_game(team, player)}) + + class PlayerSlotData(TypedDict): + player: int + slot_data: dict[str, Any] + + slot_data: list[dict[str, int | list[PlayerSlotData]]] = [] + """Slot data for each player.""" + for team, players in all_players.items(): + player_slot_data: list[PlayerSlotData] = [] + team_slot_data = {"team": team, "players": player_slot_data} + slot_data.append(team_slot_data) + for player in players: + player_slot_data.append({"player": player, "slot_data": tracker_data.get_slot_data(team, player)}) + + return { + "groups": groups, + "slot_data": slot_data, + } diff --git a/docs/webhost api.md b/docs/webhost api.md index c8936205..ca4b1ce7 100644 --- a/docs/webhost api.md +++ b/docs/webhost api.md @@ -16,6 +16,8 @@ Current endpoints: - [`/status/`](#status) - Room API - [`/room_status/`](#roomstatus) +- Tracker API + - [`/tracker/`](#tracker) - User API - [`/get_rooms`](#getrooms) - [`/get_seeds`](#getseeds) @@ -244,6 +246,214 @@ Example: } ``` +## Tracker Endpoints +Endpoints to fetch information regarding players of an active WebHost room with the supplied tracker_ID. The tracker ID +can either be viewed while on a room tracker page, or from the [room's endpoint](#room-endpoints). + +### `/tracker/` + +Will provide a dict of tracker data with the following keys: + +- item_link groups and their players (`groups`) +- Each player's slot_data (`slot_data`) +- Each player's current alias (`aliases`) + - Will return the name if there is none +- A list of items each player has received as a NetworkItem (`player_items_received`) +- A list of checks done by each player as a list of the location id's (`player_checks_done`) +- The total number of checks done by all players (`total_checks_done`) +- Hints that players have used or received (`hints`) +- The time of last activity of each player in RFC 1123 format (`activity_timers`) +- The time of last active connection of each player in RFC 1123 format (`connection_timers`) +- The current client status of each player (`player_status`) +- The datapackage hash for each player (`datapackage`) + - This hash can then be sent to the datapackage API to receive the appropriate datapackage as necessary + + +Example: +```json +{ + "groups": [ + { + "team": 0, + "groups": [ + { + "slot": 5, + "name": "testGroup", + "members": [ + 1, + 2 + ] + }, + { + "slot": 6, + "name": "myCoolLink", + "members": [ + 3, + 4 + ] + } + ] + } + ], + "slot_data": [ + { + "team": 0, + "players": [ + { + "player": 1, + "slot_data": { + "example_option": 1, + "other_option": 3 + } + }, + { + "player": 2, + "slot_data": { + "example_option": 1, + "other_option": 2 + } + } + ] + } + ], + "aliases": [ + { + "team": 0, + "players": [ + { + "player": 1, + "alias": "Incompetence" + }, + { + "player": 2, + "alias": "Slot_Name_2" + } + ] + } + ], + "player_items_received": [ + { + "team": 0, + "players": [ + { + "player": 1, + "items": [ + [1, 1, 1, 0], + [2, 2, 2, 1] + ] + }, + { + "player": 2, + "items": [ + [1, 1, 1, 2], + [2, 2, 2, 0] + ] + } + ] + } + ], + "player_checks_done": [ + { + "team": 0, + "players": [ + { + "player": 1, + "locations": [ + 1, + 2 + ] + }, + { + "player": 2, + "locations": [ + 1, + 2 + ] + } + ] + } + ], + "total_checks_done": [ + { + "team": 0, + "checks_done": 4 + } + ], + "hints": [ + { + "team": 0, + "players": [ + { + "player": 1, + "hints": [ + [1, 2, 4, 6, 0, "", 4, 0] + ] + }, + { + "player": 2, + "hints": [] + } + ] + } + ], + "activity_timers": [ + { + "team": 0, + "players": [ + { + "player": 1, + "time": "Fri, 18 Apr 2025 20:35:45 GMT" + }, + { + "player": 2, + "time": "Fri, 18 Apr 2025 20:42:46 GMT" + } + ] + } + ], + "connection_timers": [ + { + "team": 0, + "players": [ + { + "player": 1, + "time": "Fri, 18 Apr 2025 20:38:25 GMT" + }, + { + "player": 2, + "time": "Fri, 18 Apr 2025 21:03:00 GMT" + } + ] + } + ], + "player_status": [ + { + "team": 0, + "players": [ + { + "player": 1, + "status": 0 + }, + { + "player": 2, + "status": 0 + } + ] + } + ], + "datapackage": { + "Archipelago": { + "checksum": "ac9141e9ad0318df2fa27da5f20c50a842afeecb", + "version": 0 + }, + "The Messenger": { + "checksum": "6991cbcda7316b65bcb072667f3ee4c4cae71c0b", + "version": 0 + } + } +} +``` + ## User Endpoints User endpoints can get room and seed details from the current session tokens (cookies) From dfd7cbf0c5c11bb2ff126349395b9cbf1f81f297 Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:36:25 -0400 Subject: [PATCH 018/204] Tests: Standardize World Exclusions, Strengthen LCS Test (#4423) --- test/general/test_implemented.py | 9 +++++---- test/general/test_items.py | 3 +-- test/general/test_locations.py | 9 ++++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/test/general/test_implemented.py b/test/general/test_implemented.py index cf0624a2..de432e36 100644 --- a/test/general/test_implemented.py +++ b/test/general/test_implemented.py @@ -37,10 +37,11 @@ class TestImplemented(unittest.TestCase): def test_slot_data(self): """Tests that if a world creates slot data, it's json serializable.""" - for game_name, world_type in AutoWorldRegister.world_types.items(): - # has an await for generate_output which isn't being called - if game_name in {"Ocarina of Time"}: - continue + # has an await for generate_output which isn't being called + excluded_games = ("Ocarina of Time",) + worlds_to_test = {game: world + for game, world in AutoWorldRegister.world_types.items() if game not in excluded_games} + for game_name, world_type in worlds_to_test.items(): multiworld = setup_solo_multiworld(world_type) with self.subTest(game=game_name, seed=multiworld.seed): distribute_items_restrictive(multiworld) diff --git a/test/general/test_items.py b/test/general/test_items.py index dbaca1c9..a48576da 100644 --- a/test/general/test_items.py +++ b/test/general/test_items.py @@ -150,8 +150,7 @@ class TestBase(unittest.TestCase): """Test that worlds don't modify the locality of items after duplicates are resolved""" gen_steps = ("generate_early",) additional_steps = ("create_regions", "create_items", "set_rules", "connect_entrances", "generate_basic", "pre_fill") - worlds_to_test = {game: world for game, world in AutoWorldRegister.world_types.items()} - for game_name, world_type in worlds_to_test.items(): + for game_name, world_type in AutoWorldRegister.world_types.items(): with self.subTest("Game", game=game_name): multiworld = setup_solo_multiworld(world_type, gen_steps) local_items = multiworld.worlds[1].options.local_items.value.copy() diff --git a/test/general/test_locations.py b/test/general/test_locations.py index 37ae94e0..77ae2602 100644 --- a/test/general/test_locations.py +++ b/test/general/test_locations.py @@ -33,7 +33,10 @@ class TestBase(unittest.TestCase): def test_location_creation_steps(self): """Tests that Regions and Locations aren't created after `create_items`.""" gen_steps = ("generate_early", "create_regions", "create_items") - for game_name, world_type in AutoWorldRegister.world_types.items(): + excluded_games = ("Ocarina of Time", "Pokemon Red and Blue") + worlds_to_test = {game: world + for game, world in AutoWorldRegister.world_types.items() if game not in excluded_games} + for game_name, world_type in worlds_to_test.items(): with self.subTest("Game", game_name=game_name): multiworld = setup_solo_multiworld(world_type, gen_steps) region_count = len(multiworld.get_regions()) @@ -54,13 +57,13 @@ class TestBase(unittest.TestCase): call_all(multiworld, "generate_basic") self.assertEqual(region_count, len(multiworld.get_regions()), f"{game_name} modified region count during generate_basic") - self.assertGreaterEqual(location_count, len(multiworld.get_locations()), + self.assertEqual(location_count, len(multiworld.get_locations()), f"{game_name} modified locations count during generate_basic") call_all(multiworld, "pre_fill") self.assertEqual(region_count, len(multiworld.get_regions()), f"{game_name} modified region count during pre_fill") - self.assertGreaterEqual(location_count, len(multiworld.get_locations()), + self.assertEqual(location_count, len(multiworld.get_locations()), f"{game_name} modified locations count during pre_fill") def test_location_group(self): From d5bdac02b76e4d579f7f6cada09132fd6eb833e6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sun, 24 Aug 2025 02:54:49 +0200 Subject: [PATCH 019/204] Docs: Add deprioritized to AP API doc (#5355) Did this on my phone while in the bathroom :) --- docs/world api.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/world api.md b/docs/world api.md index e8932cfd..832ad05d 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -257,6 +257,14 @@ another flag like "progression", it means "an especially useful progression item combined with `progression`; see below) * `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, to not flood early spheres +* `deprioritized`: denotes that an item should not be placed on priority locations + (to be combined with `progression`; see below) +* `progression_deprioritized`: the combination of `progression` and `deprioritized`, i.e. a progression item that + should not be placed on priority locations, despite being progression; + like skip_balancing, this is commonly used for currency or tokens. +* `progression_deprioritized_skip_balancing`: the combination of `progression`, `deprioritized` and `skip_balancing`. + Since there is overlap between the kind of items that want `skip_balancing` and `deprioritized`, + this combined classification exists for convenience ### Regions From d146d90131a5087698cbf67a9fc085ce3da2f362 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:52:04 +0200 Subject: [PATCH 020/204] Core: Fix Priority Fill *not* crashing when it should, in cases where there is no deprioritized progression #5363 --- Fill.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Fill.py b/Fill.py index 1cc1278f..7a079fbc 100644 --- a/Fill.py +++ b/Fill.py @@ -549,10 +549,12 @@ def distribute_items_restrictive(multiworld: MultiWorld, if prioritylocations and regular_progression: # retry with one_item_per_player off because some priority fills can fail to fill with that optimization # deprioritized items are still not in the mix, so they need to be collected into state first. + # allow_partial should only be set if there is deprioritized progression to fall back on. priority_retry_state = sweep_from_pool(multiworld.state, deprioritized_progression) fill_restrictive(multiworld, priority_retry_state, prioritylocations, regular_progression, single_player_placement=single_player, swap=False, on_place=mark_for_locking, - name="Priority Retry", one_item_per_player=False, allow_partial=True) + name="Priority Retry", one_item_per_player=False, + allow_partial=bool(deprioritized_progression)) if prioritylocations and deprioritized_progression: # There are no more regular progression items that can be placed on any priority locations. From 1fa342b0859439ed671ad43f1c29ad5fa8468e12 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:36:39 +0000 Subject: [PATCH 021/204] Core: add python 3.13 support (#5357) * Core: fix freeze support for py3.13+ Loading Utils now patches multiprocessing.freeze_support() Utils.freeze_support() is now deprecated * WebHost: use pony fork on py3.13 * CI: test with py3.13 --- .github/workflows/unittests.yml | 7 ++++--- Launcher.py | 2 +- Utils.py | 20 +++++++++++++------- WebHostLib/requirements.txt | 3 ++- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 96219daa..90a5d70b 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -41,12 +41,13 @@ jobs: python: - {version: '3.11.2'} # Change to '3.11' around 2026-06-10 - {version: '3.12'} + - {version: '3.13'} include: - python: {version: '3.11'} # old compat os: windows-latest - - python: {version: '3.12'} # current + - python: {version: '3.13'} # current os: windows-latest - - python: {version: '3.12'} # current + - python: {version: '3.13'} # current os: macos-latest steps: @@ -74,7 +75,7 @@ jobs: os: - ubuntu-latest python: - - {version: '3.12'} # current + - {version: '3.13'} # current steps: - uses: actions/checkout@v4 diff --git a/Launcher.py b/Launcher.py index 5720012c..adc3cb96 100644 --- a/Launcher.py +++ b/Launcher.py @@ -484,7 +484,7 @@ def main(args: argparse.Namespace | dict | None = None): if __name__ == '__main__': init_logging('Launcher') - Utils.freeze_support() + multiprocessing.freeze_support() multiprocessing.set_start_method("spawn") # if launched process uses kivy, fork won't work parser = argparse.ArgumentParser( description='Archipelago Launcher', diff --git a/Utils.py b/Utils.py index 5a24bc15..e73edd71 100644 --- a/Utils.py +++ b/Utils.py @@ -940,15 +940,15 @@ class DeprecateDict(dict): def _extend_freeze_support() -> None: - """Extend multiprocessing.freeze_support() to also work on Non-Windows for spawn.""" - # upstream issue: https://github.com/python/cpython/issues/76327 + """Extend multiprocessing.freeze_support() to also work on Non-Windows and without setting spawn method first.""" + # original upstream issue: https://github.com/python/cpython/issues/76327 # code based on https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py#L26 import multiprocessing import multiprocessing.spawn def _freeze_support() -> None: """Minimal freeze_support. Only apply this if frozen.""" - from subprocess import _args_from_interpreter_flags + from subprocess import _args_from_interpreter_flags # noqa # Prevent `spawn` from trying to read `__main__` in from the main script multiprocessing.process.ORIGINAL_DIR = None @@ -975,17 +975,23 @@ def _extend_freeze_support() -> None: multiprocessing.spawn.spawn_main(**kwargs) sys.exit() - if not is_windows and is_frozen(): - multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support + def _noop() -> None: + pass + + multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support if is_frozen() else _noop def freeze_support() -> None: - """This behaves like multiprocessing.freeze_support but also works on Non-Windows.""" + """This now only calls multiprocessing.freeze_support since we are patching freeze_support on module load.""" import multiprocessing - _extend_freeze_support() + + deprecate("Use multiprocessing.freeze_support() instead") multiprocessing.freeze_support() +_extend_freeze_support() + + def visualize_regions(root_region: Region, file_name: str, *, show_entrance_names: bool = False, show_locations: bool = True, show_other_regions: bool = True, linetype_ortho: bool = True, regions_to_highlight: set[Region] | None = None) -> None: diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt index 8fd6dc63..f64ed085 100644 --- a/WebHostLib/requirements.txt +++ b/WebHostLib/requirements.txt @@ -1,6 +1,7 @@ flask>=3.1.1 werkzeug>=3.1.3 -pony>=0.7.19 +pony>=0.7.19; python_version <= '3.12' +pony @ git+https://github.com/black-sliver/pony@7feb1221953b7fa4a6735466bf21a8b4d35e33ba#0.7.19; python_version >= '3.13' waitress>=3.0.2 Flask-Caching>=2.3.0 Flask-Compress>=1.17 From e1fca86cf82f0616e292dd5b0375d43fa2e61a48 Mon Sep 17 00:00:00 2001 From: Ishigh1 Date: Wed, 27 Aug 2025 02:36:47 +0200 Subject: [PATCH 022/204] Core: Improved GER's caching of visited nodes during initialization (#5366) * Moved the visited update * Renamed visited to seen --- entrance_rando.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entrance_rando.py b/entrance_rando.py index 492fff32..578059ae 100644 --- a/entrance_rando.py +++ b/entrance_rando.py @@ -74,13 +74,12 @@ class EntranceLookup: if entrance in self._expands_graph_cache: return self._expands_graph_cache[entrance] - visited = set() + seen = {entrance.connected_region} q: deque[Region] = deque() q.append(entrance.connected_region) while q: region = q.popleft() - visited.add(region) # check if the region itself is progression if region in region.multiworld.indirect_connections: @@ -103,7 +102,8 @@ class EntranceLookup: and exit_ in self._usable_exits): self._expands_graph_cache[entrance] = True return True - elif exit_.connected_region and exit_.connected_region not in visited: + elif exit_.connected_region and exit_.connected_region not in seen: + seen.add(exit_.connected_region) q.append(exit_.connected_region) self._expands_graph_cache[entrance] = False From be51fb9ba9309bd0dcd20c8da7420af7b7959295 Mon Sep 17 00:00:00 2001 From: Rosalie <61372066+Rosalie-A@users.noreply.github.com> Date: Wed, 27 Aug 2025 09:20:51 -0400 Subject: [PATCH 023/204] [TLOZ] Updated to remove deprecated call. (#5266) * Updated to remove deprecated call. * Removed unused argument. --- worlds/tloz/Rom.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/worlds/tloz/Rom.py b/worlds/tloz/Rom.py index 58aa3880..e7b60b90 100644 --- a/worlds/tloz/Rom.py +++ b/worlds/tloz/Rom.py @@ -70,10 +70,6 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: return base_rom_bytes -def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() - if not file_name: - file_name = options["tloz_options"]["rom_file"] - if not os.path.exists(file_name): - file_name = Utils.user_path(file_name) - return file_name +def get_base_rom_path() -> str: + from . import TLoZWorld + return TLoZWorld.settings.rom_file From e11b40c94b0b570b1ccb01245b6638a01e709658 Mon Sep 17 00:00:00 2001 From: lordlou <87331798+lordlou@users.noreply.github.com> Date: Wed, 27 Aug 2025 09:21:28 -0400 Subject: [PATCH 024/204] [SM, SMZ3] get options deprecation (#5257) * - SM now displays message when getting an item outside for someone else (fills ROM item table) This is dependant on modifications done to sm_randomizer_rom project * First working MultiWorld SM * some missing things: - player name inject in ROM and get in client - end game get from ROM in client - send self item to server - add player names table in ROM * replaced CollectionState inheritance from SMBoolManager with a composition of an array of it (required to generation more than one SM world, which is still fails but is better) * - reenabled balancing * post rebase fixes * updated SmClient.py * + added VariaRandomizer LICENSE * + added sm_randomizer_rom project (which builds sm.ips) * Moved VariaRandomizer and sm_randomizer_rom projects inside worlds/sm and done some cleaning * properly revert change made to CollectionState and more cleaning * Fixed multiworld support patch not working with VariaRandomizer's * missing file commit * Fixed syntax error in unused code to satisfy Linter * Revert "Fixed multiworld support patch not working with VariaRandomizer's" This reverts commit fb3ca18528bb331995e3d3051648c8f84d04c08b. * many fixes and improovement - fixed seeded generation - fixed broken logic when more than one SM world - added missing rules for inter-area transitions - added basic patch presence for logic - added DoorManager init call to reflect present patches for logic - moved CollectionState addition out of BaseClasses into SM world - added condition to apply progitempool presorting only if SM world is present - set Bosses item id to None to prevent them going into multidata - now use get_game_players * first working (most of the time) progression generation for SM using VariaRandomizer's rules, items, locations and accessPoint (as regions) * first working single-world randomized SM rom patches * - SM now displays message when getting an item outside for someone else (fills ROM item table) This is dependant on modifications done to sm_randomizer_rom project * First working MultiWorld SM * some missing things: - player name inject in ROM and get in client - end game get from ROM in client - send self item to server - add player names table in ROM * replaced CollectionState inheritance from SMBoolManager with a composition of an array of it (required to generation more than one SM world, which is still fails but is better) * - reenabled balancing * post rebase fixes * updated SmClient.py * + added VariaRandomizer LICENSE * + added sm_randomizer_rom project (which builds sm.ips) * Moved VariaRandomizer and sm_randomizer_rom projects inside worlds/sm and done some cleaning * properly revert change made to CollectionState and more cleaning * Fixed multiworld support patch not working with VariaRandomizer's * missing file commit * Fixed syntax error in unused code to satisfy Linter * Revert "Fixed multiworld support patch not working with VariaRandomizer's" This reverts commit fb3ca18528bb331995e3d3051648c8f84d04c08b. * many fixes and improovement - fixed seeded generation - fixed broken logic when more than one SM world - added missing rules for inter-area transitions - added basic patch presence for logic - added DoorManager init call to reflect present patches for logic - moved CollectionState addition out of BaseClasses into SM world - added condition to apply progitempool presorting only if SM world is present - set Bosses item id to None to prevent them going into multidata - now use get_game_players * Fixed multiworld support patch not working with VariaRandomizer's Added stage_fill_hook to set morph first in progitempool Added back VariaRandomizer's standard patches * + added missing files from variaRandomizer project * + added missing variaRandomizer files (custom sprites) + started integrating VariaRandomizer options (WIP) * Some fixes for player and server name display - fixed player name of 16 characters reading too far in SM client - fixed 12 bytes SM player name limit (now 16) - fixed server name not being displayed in SM when using server cheat ( now displays RECEIVED FROM ARCHIPELAGO) - request: temporarly changed default seed names displayed in SM main menu to OWTCH * Fixed Goal completion not triggering in smClient * integrated VariaRandomizer's options into AP (WIP) - startAP is working - door rando is working - skillset is working * - fixed itemsounds.ips crash by always including nofanfare.ips into multiworld.ips (itemsounds is now always applied and "itemsounds" preset must always be "off") * skillset are now instanced per player instead of being a singleton class * RomPatches are now instanced per player instead of being a singleton class * DoorManager is now instanced per player instead of being a singleton class * - fixed the last bugs that prevented generation of >1 SM world * fixed crash when no skillset preset is specified in randoPreset (default to "casual") * maxDifficulty support and itemsounds removal - added support for maxDifficulty - removed itemsounds patch as its always applied from multiworld patch for now * Fixed bad merge * Post merge adaptation * fixed player name length fix that got lost with the merge * fixed generation with other game type than SM * added default randoPreset json for SM in playerSettings.yaml * fixed broken SM client following merge * beautified json skillset presets * Fixed ArchipelagoSmClient not building * Fixed conflict between mutliworld patch and beam_doors_plms patch - doorsColorsRando now working * SM generation now outputs APBP - Fixed paths for patches and presets when frozen * added missing file and fixed multithreading issue * temporarily set data_version = 0 * more work - added support for AP starting items - fixed client crash with gamemode being None - patch.py "compatible_version" is now 3 * commited missing asm files fixed start item reserve breaking game (was using bad write offset when patching) * Nothing item are now handled game-side. the game will now skip displaying a message box for received Nothing item (but the client will still receive it). fixed crash in SMClient when loosing connection to SNI * fixed No Energy Item missing its ID fixed Plando * merge post fixes * fixed start item Grapple, XRay and Reserve HUD, as well as graphic beams (except ice palette color) * fixed freeze in blue brinstar caused by Varia's custom PLM not being filled with proper Multiworld PLM address (altLocsAddresses) * fixed start item x-ray HUD display * Fixed start items being sent by the server (is all handled in ROM) Start items are now not removed from itempool anymore Nothing Item is now local_items so no player will ever pickup Nothing. Doing so reduces contribution of this world to the Multiworld the more Nothing there is though. Fixed crash (and possibly passing but broken) at generation where the static list of IPSPatches used by all SM worlds was being modified * fixed settings that could be applied to any SM players * fixed auth to server only using player name (now does as ALTTP to authenticate) * - fixed End Credits broken text * added non SM item name display * added all supported SM options in playerSettings.yaml * fixed locations needing a list of parent regions (now generate a region for each location with one-way exits to each (previously) parent region did some cleaning (mainly reverts on unnecessary core classes * minor setting fixes and tweaks - merged Area and lightArea settings - made missileQty, superQty and powerBombQty use value from 10 to 90 and divide value by float(10) when generating - fixed inverted layoutPatch setting * added option start_inventory_removes_from_pool fixed option names formatting fixed lint errors small code and repo cleanup * Hopefully fixed ROR2 that could not send any items * - fixed missing required change to ROR2 * fixed 0 hp when respawning without having ever saved (start items were not updating the save checksum) * fixed typo with doors_colors_rando * fixed checksum * added custom sprites for off-world items (progression or not) the original AP sprite was made with PierRoulette's SM Item Sprite Utility by ijwu * - added missing change following upstream merge - changed patch filename extension from apbp to apm3 so patch can be used with the new client * added morph placement options: early means local and sphere 1 * fixed failing unit tests * - fixed broken custom_preset options * - big cleanup to remove unnecessary or unsupported features * - more cleanup * - moved sm_randomizer_rom and all always applied patches into an external project that outputs basepatch.ips - small cleanup * - added comment to refer to project for generating basepatch.ips (https://github.com/lordlou/SMBasepatch) * fixed g4_skip patch that can be not applied if hud is enabled * - fixed off world sprite that can have broken graphics (restricted to use only first 2 palette) * - updated basepatch to reflect g4_skip removal - moved more asm files to SMBasepatch project * - tourian grey doors at baby metroid are now always flashing (allowing to go back if needed) * fixed wrong path if using built as exe * - cleaned exposed maxDifficulty options - removed always enabled Knows * Merged LttPClient and SMClient into SNIClient * added varia_custom Preset Option that fetch a preset (read from a new varia_custom_preset Option) from varia's web service * small doc precision * - added death_link support - fixed broken Goal Completion - post merge fix * - removed now useless presets * - fixed bad internal mapping with maxDiff - increases maxDiff if only Bosses is preventing beating the game * - added support for lowercase custom preset sections (knows, settings and controller) - fixed controller settings not applying to ROM * - fixed death loop when dying with Door rando, bomb or speed booster as starting items - varia's backup save should now be usable (automatically enabled when doing door rando) * -added docstring for generated yaml * fixed bad merge * fixed broken infinity max difficulty * commented debug prints * adjusted credits to mark progression speed and difficulty as Non Available * added support for more than 255 players (will print Archipelago for higher player number) * fixed missing cleanup * added support for 65535 different player names in ROM * fixed generations failing when only bosses are unreachable * - replaced setting maxDiff to infinity with a bool only affecting boss logics if only bosses are left to finish * fixed failling generations when using 'fun' settings Accessibility checks are forced to 'items' if restricted locations are used by VARIA following usage of 'fun' settings * fixed debug logger * removed unsupported "suits_restriction" option * fixed generations failing when only bosses are unreachable (using a less intrusive approach for AP) * - fixed deathlink emptying reserves - added death_link_survive option that lets player survive when receiving a deathlink if the have non-empty reserves * - merged death_link and death_link_survive options * fixed death_link * added a fallback default starting location instead of failing generation if an invalid one was chosen * added Nothing and NoEnergy as hint blacklist added missing NoEnergy as local items and removed it from progression * replaced deprecated usage of Utils.get_options with settings.get_settings in SM and SMZ3 --- worlds/sm/Rom.py | 3 ++- worlds/smz3/Rom.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/worlds/sm/Rom.py b/worlds/sm/Rom.py index c5b6645e..9d567aa4 100644 --- a/worlds/sm/Rom.py +++ b/worlds/sm/Rom.py @@ -1,6 +1,7 @@ import hashlib import os +import settings import json import Utils from Utils import read_snes_rom @@ -77,7 +78,7 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["sm_options"]["rom_file"] if not os.path.exists(file_name): diff --git a/worlds/smz3/Rom.py b/worlds/smz3/Rom.py index d66d9239..4c66b0d4 100644 --- a/worlds/smz3/Rom.py +++ b/worlds/smz3/Rom.py @@ -1,6 +1,7 @@ import hashlib import os +import settings import Utils from Utils import read_snes_rom from worlds.Files import APProcedurePatch, APPatchExtension, APTokenMixin, APTokenTypes @@ -65,7 +66,7 @@ def get_base_rom_bytes() -> bytes: def get_sm_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["sm_options"]["rom_file"] if not os.path.exists(file_name): @@ -74,7 +75,7 @@ def get_sm_base_rom_path(file_name: str = "") -> str: def get_lttp_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["lttp_options"]["rom_file"] if not os.path.exists(file_name): From 750c8a98100ceaea01871255f6da813d0fd839e7 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Wed, 27 Aug 2025 09:21:53 -0400 Subject: [PATCH 025/204] Stop using get_options (#5341) --- worlds/dkc3/Rom.py | 5 +++-- worlds/smw/Regions.py | 2 +- worlds/smw/Rom.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/worlds/dkc3/Rom.py b/worlds/dkc3/Rom.py index fb8bc2b1..cde4d8c7 100644 --- a/worlds/dkc3/Rom.py +++ b/worlds/dkc3/Rom.py @@ -1,3 +1,4 @@ + import Utils from Utils import read_snes_rom from worlds.AutoWorld import World @@ -735,9 +736,9 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: return base_rom_bytes def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() if not file_name: - file_name = options["dkc3_options"]["rom_file"] + from settings import get_settings + file_name = get_settings()["dkc3_options"]["rom_file"] if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name diff --git a/worlds/smw/Regions.py b/worlds/smw/Regions.py index 24960498..d7950ffb 100644 --- a/worlds/smw/Regions.py +++ b/worlds/smw/Regions.py @@ -808,7 +808,7 @@ def create_regions(world: World, active_locations): lambda state: (state.has(ItemName.blue_switch_palace, player) and (state.has(ItemName.p_switch, player) or state.has(ItemName.green_switch_palace, player) or - (state.has(ItemName.yellow_switch_palace, player) or state.has(ItemName.red_switch_palace, player))))) + (state.has(ItemName.yellow_switch_palace, player) and state.has(ItemName.red_switch_palace, player))))) add_location_to_region(multiworld, player, active_locations, LocationName.chocolate_island_3_region, LocationName.chocolate_island_3_dragon) add_location_to_region(multiworld, player, active_locations, LocationName.chocolate_island_4_region, LocationName.chocolate_island_4_dragon, lambda state: (state.has(ItemName.p_switch, player) and diff --git a/worlds/smw/Rom.py b/worlds/smw/Rom.py index 9016e14d..081d6b4a 100644 --- a/worlds/smw/Rom.py +++ b/worlds/smw/Rom.py @@ -3185,9 +3185,9 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() if not file_name: - file_name = options["smw_options"]["rom_file"] + from settings import get_settings + file_name = get_settings()["smw_options"]["rom_file"] if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name From 439be48f36a2ed26bedede7e620d441cc3478b4f Mon Sep 17 00:00:00 2001 From: Rosalie <61372066+Rosalie-A@users.noreply.github.com> Date: Wed, 27 Aug 2025 13:28:42 -0400 Subject: [PATCH 026/204] [TLOZ] Remove deprecated Utils.get_options call, part 2 (#5371) * Updated to remove deprecated call. * Removed unused argument. * Removed errant client calls to Utils.get_options, and fixed call in Rom.py that was passing an argument. --- Zelda1Client.py | 7 ++++--- worlds/tloz/Rom.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Zelda1Client.py b/Zelda1Client.py index 9753621e..6dd7a361 100644 --- a/Zelda1Client.py +++ b/Zelda1Client.py @@ -20,6 +20,8 @@ from worlds.tloz.Items import item_game_ids from worlds.tloz.Locations import location_ids from worlds.tloz import Items, Locations, Rom +from settings import get_settings + SYSTEM_MESSAGE_ID = 0 CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_tloz.lua" @@ -341,13 +343,12 @@ if __name__ == '__main__': # Text Mode to use !hint and such with games that have no text entry Utils.init_logging("ZeldaClient") - options = Utils.get_options() - DISPLAY_MSGS = options["tloz_options"]["display_msgs"] + DISPLAY_MSGS = get_settings()["tloz_options"]["display_msgs"] async def run_game(romfile: str) -> None: auto_start = typing.cast(typing.Union[bool, str], - Utils.get_options()["tloz_options"].get("rom_start", True)) + get_settings()["tloz_options"].get("rom_start", True)) if auto_start is True: import webbrowser webbrowser.open(romfile) diff --git a/worlds/tloz/Rom.py b/worlds/tloz/Rom.py index e7b60b90..5b618bb6 100644 --- a/worlds/tloz/Rom.py +++ b/worlds/tloz/Rom.py @@ -58,7 +58,7 @@ class TLoZDeltaPatch(APDeltaPatch): def get_base_rom_bytes(file_name: str = "") -> bytes: base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None) if not base_rom_bytes: - file_name = get_base_rom_path(file_name) + file_name = get_base_rom_path() base_rom_bytes = bytes(Utils.read_snes_rom(open(file_name, "rb"))) basemd5 = hashlib.md5() From bb2ecb8a97913399c64ea1594dadeaadc83c7b9d Mon Sep 17 00:00:00 2001 From: Justus Lind Date: Sat, 30 Aug 2025 01:41:29 +1000 Subject: [PATCH 027/204] Muse Dash: Change Exception to Option Error and Update to Muse Radio FM106 (#5374) * Change Exception to OptionError * Update to Muse Radio FM106. * Add Scipio's suggestion. Co-authored-by: Scipio Wright --------- Co-authored-by: Scipio Wright --- worlds/musedash/MuseDashData.py | 4 ++++ worlds/musedash/__init__.py | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/worlds/musedash/MuseDashData.py b/worlds/musedash/MuseDashData.py index 32849eec..6943b281 100644 --- a/worlds/musedash/MuseDashData.py +++ b/worlds/musedash/MuseDashData.py @@ -661,4 +661,8 @@ SONG_DATA: Dict[str, SongData] = { "Ineffabilis": SongData(2900785, "87-4", "Aim to Be a Rhythm Master!", False, 3, 7, 10), "DaJiaHao": SongData(2900786, "87-5", "Aim to Be a Rhythm Master!", False, 5, 7, 10), "Echoes of SeraphiM": SongData(2900787, "87-6", "Aim to Be a Rhythm Master!", False, 5, 8, 10), + "Othello feat.Uiro": SongData(2900788, "88-0", "MUSE RADIO FM106", True, 3, 5, 7), + "Midnight Blue": SongData(2900789, "88-1", "MUSE RADIO FM106", True, 2, 5, 7), + "overwork feat.Woonoo": SongData(2900790, "88-2", "MUSE RADIO FM106", True, 2, 6, 8), + "SUPER CITYLIGHTS": SongData(2900791, "88-3", "MUSE RADIO FM106", True, 5, 7, 10), } diff --git a/worlds/musedash/__init__.py b/worlds/musedash/__init__.py index eb82148c..239d640e 100644 --- a/worlds/musedash/__init__.py +++ b/worlds/musedash/__init__.py @@ -2,7 +2,7 @@ from worlds.AutoWorld import World, WebWorld from BaseClasses import Region, Item, ItemClassification, Tutorial from typing import List, ClassVar, Type, Set from math import floor -from Options import PerGameCommonOptions +from Options import PerGameCommonOptions, OptionError from .Options import MuseDashOptions, md_option_groups from .Items import MuseDashSongItem, MuseDashFixedItem @@ -102,7 +102,8 @@ class MuseDashWorld(World): # If the above fails, we want to adjust the difficulty thresholds. # Easier first, then harder if lower_diff_threshold <= 1 and higher_diff_threshold >= 11: - raise Exception("Failed to find enough songs, even with maximum difficulty thresholds.") + raise OptionError("Failed to find enough songs, even with maximum difficulty thresholds. " + "Too many songs have been excluded or set to be starter songs.") elif lower_diff_threshold <= 1: higher_diff_threshold += 1 else: From f2461a2fea9f9d8a8fca6ef411fb8531a8c0c364 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 30 Aug 2025 22:33:43 +0200 Subject: [PATCH 028/204] WebHost: Ensure that OptionSets and OptionLists get exported to yaml, even when nothing is selected (#5240) * Ensure that OptionSets and OptionLists get exported to yaml, even if nothing is selected * forgot ItemSet and LocationSet * Make it even less likely for there to be overlap --- WebHostLib/options.py | 9 +++++++-- WebHostLib/templates/playerOptions/macros.html | 4 ++++ WebHostLib/templates/weightedOptions/macros.html | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/WebHostLib/options.py b/WebHostLib/options.py index 38489cee..3c63fa8c 100644 --- a/WebHostLib/options.py +++ b/WebHostLib/options.py @@ -155,7 +155,9 @@ def generate_weighted_yaml(game: str): options = {} for key, val in request.form.items(): - if "||" not in key: + if val == "_ensure-empty-list": + options[key] = {} + elif "||" not in key: if len(str(val)) == 0: continue @@ -212,8 +214,11 @@ def generate_yaml(game: str): if request.method == "POST": options = {} intent_generate = False + for key, val in request.form.items(multi=True): - if key in options: + if val == "_ensure-empty-list": + options[key] = [] + elif options.get(key): if not isinstance(options[key], list): options[key] = [options[key]] options[key].append(val) diff --git a/WebHostLib/templates/playerOptions/macros.html b/WebHostLib/templates/playerOptions/macros.html index bbb3c75d..a4cc3aa5 100644 --- a/WebHostLib/templates/playerOptions/macros.html +++ b/WebHostLib/templates/playerOptions/macros.html @@ -134,6 +134,7 @@ {% macro OptionList(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
@@ -146,6 +147,7 @@ {% macro LocationSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for group_name in world.location_name_groups.keys()|sort %} {% if group_name != "Everywhere" %} @@ -169,6 +171,7 @@ {% macro ItemSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for group_name in world.item_name_groups.keys()|sort %} {% if group_name != "Everything" %} @@ -192,6 +195,7 @@ {% macro OptionSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
diff --git a/WebHostLib/templates/weightedOptions/macros.html b/WebHostLib/templates/weightedOptions/macros.html index 89ba0a0e..1d485a24 100644 --- a/WebHostLib/templates/weightedOptions/macros.html +++ b/WebHostLib/templates/weightedOptions/macros.html @@ -139,6 +139,7 @@ {% endmacro %} {% macro OptionList(option_name, option) %} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
@@ -158,6 +159,7 @@ {% endmacro %} {% macro LocationSet(option_name, option, world) %} +
{% for group_name in world.location_name_groups.keys()|sort %} {% if group_name != "Everywhere" %} @@ -180,6 +182,7 @@ {% endmacro %} {% macro ItemSet(option_name, option, world) %} +
{% for group_name in world.item_name_groups.keys()|sort %} {% if group_name != "Everything" %} @@ -202,6 +205,7 @@ {% endmacro %} {% macro OptionSet(option_name, option) %} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
From 34aaa44b1f426239a3789229ed3a69107d4e3a1b Mon Sep 17 00:00:00 2001 From: sgrunt Date: Sat, 30 Aug 2025 17:09:22 -0600 Subject: [PATCH 029/204] Timespinner: add support for spider traps from new client release (#4848) Co-authored-by: sgrunt --- worlds/timespinner/Items.py | 4 +++- worlds/timespinner/Options.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/worlds/timespinner/Items.py b/worlds/timespinner/Items.py index a00fca7e..4cfcc289 100644 --- a/worlds/timespinner/Items.py +++ b/worlds/timespinner/Items.py @@ -208,7 +208,9 @@ item_table: Dict[str, ItemData] = { 'Lab Access Research': ItemData('Lab Access', 1337196, progression=True), 'Lab Access Dynamo': ItemData('Lab Access', 1337197, progression=True), 'Drawbridge Key': ItemData('Key', 1337198, progression=True), - # 1337199 - 1337248 Reserved + # 1337199 Reserved + 'Spider Trap': ItemData('Trap', 1337200, 0, trap=True), + # 1337201 - 1337248 Reserved 'Max Sand': ItemData('Stat', 1337249, 14) } diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 4cb7fbbc..0b735ea3 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -367,8 +367,8 @@ class TrapChance(Range): class Traps(OptionList): """List of traps that may be in the item pool to find""" display_name = "Traps Types" - valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap" } - default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap" ] + valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap" } + default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap" ] class PresentAccessWithWheelAndSpindle(Toggle): """When inverted, allows using the refugee camp warp when both the Timespinner Wheel and Spindle is acquired.""" From 893acd2f027e910402839930e2cd886f889747c2 Mon Sep 17 00:00:00 2001 From: Etsuna <47378314+Etsuna@users.noreply.github.com> Date: Sun, 31 Aug 2025 14:12:32 +0200 Subject: [PATCH 030/204] Webserver: fix activity_timers for api tracker.py (#5385) --- WebHostLib/api/tracker.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WebHostLib/api/tracker.py b/WebHostLib/api/tracker.py index abf4cdbe..4ea3a233 100644 --- a/WebHostLib/api/tracker.py +++ b/WebHostLib/api/tracker.py @@ -112,7 +112,9 @@ def tracker_data(tracker: UUID) -> dict[str, Any]: client_activity_timers: tuple[tuple[int, int], float] = tracker_data._multisave.get("client_activity_timers", ()) for (team, player), timestamp in client_activity_timers: # use index since we can rely on order - activity_timers[team]["player_timers"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + # FIX: key is "players" (not "player_timers") + activity_timers[team]["players"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + connection_timers: list[dict[str, int | list[PlayerTimer]]] = [] """Time of last connection per player. Returned as RFC 1123 format and null if no connection has been made.""" From cdf7165ab4d01f22a3f9a2b4cb603c1e8852db4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sun, 31 Aug 2025 10:21:23 -0400 Subject: [PATCH 031/204] Stardew Valley: Use new asserts in tests (#4621) * changes * cherry pick stuff * use newly create methods more * use new assets to ease readability * remove unneeded assert * add assert region adapters * use new asserts yay * self review * self review * review * replace parrot express with transportation constant * bullshit commit again * revert a bunch of off topic changes * these changes seems to be on topic * revert some undesired merge changes * review imports * use type instead of instance in some options * properly return super * review * change one str to use a constnat --- worlds/stardew_valley/test/TestGeneration.py | 29 +++++------ .../stardew_valley/test/TestWalnutsanity.py | 34 ++++++------ worlds/stardew_valley/test/bases.py | 52 +++++++++++-------- worlds/stardew_valley/test/options/utils.py | 4 +- .../stardew_valley/test/rules/TestArcades.py | 36 ++++++------- 5 files changed, 81 insertions(+), 74 deletions(-) diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 5e60f8e8..7b153567 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -131,15 +131,13 @@ class TestProgressiveElevator(SVTestBase): items_for_115 = self.generate_items_for_mine_115() last_elevator = self.get_item_by_name("Progressive Mine Elevator") self.collect(items_for_115) - floor_115 = self.multiworld.get_region("The Mines - Floor 115", self.player) - floor_120 = self.multiworld.get_region("The Mines - Floor 120", self.player) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertFalse(floor_120.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_cannot_reach_region(Region.mines_floor_120) self.collect(last_elevator) - self.assertTrue(floor_120.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_120) def generate_items_for_mine_115(self) -> List[Item]: pickaxes = [self.get_item_by_name("Progressive Pickaxe")] * 2 @@ -171,27 +169,24 @@ class TestSkullCavernLogic(SVTestBase): items_for_skull_50 = self.generate_items_for_skull_50() items_for_skull_100 = self.generate_items_for_skull_100() self.collect(items_for_115) - floor_115 = self.multiworld.get_region(Region.mines_floor_115, self.player) - skull_25 = self.multiworld.get_region(Region.skull_cavern_25, self.player) - skull_75 = self.multiworld.get_region(Region.skull_cavern_75, self.player) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertFalse(skull_25.can_reach(self.multiworld.state)) - self.assertFalse(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_cannot_reach_region(Region.skull_cavern_25) + self.assert_cannot_reach_region(Region.skull_cavern_75) self.remove(items_for_115) self.collect(items_for_skull_50) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertTrue(skull_25.can_reach(self.multiworld.state)) - self.assertFalse(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_can_reach_region(Region.skull_cavern_25) + self.assert_cannot_reach_region(Region.skull_cavern_75) self.remove(items_for_skull_50) self.collect(items_for_skull_100) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertTrue(skull_25.can_reach(self.multiworld.state)) - self.assertTrue(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_can_reach_region(Region.skull_cavern_25) + self.assert_can_reach_region(Region.skull_cavern_75) def generate_items_for_mine_115(self) -> List[Item]: pickaxes = [self.get_item_by_name("Progressive Pickaxe")] * 2 diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index 418eaa87..7111174d 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -3,6 +3,7 @@ import unittest from .bases import SVTestBase from ..options import ExcludeGingerIsland, Walnutsanity, ToolProgression, SkillProgression from ..strings.ap_names.ap_option_names import WalnutsanityOptionName +from ..strings.ap_names.transport_names import Transportation class SVWalnutsanityTestBase(SVTestBase): @@ -48,24 +49,27 @@ class TestWalnutsanityNone(SVWalnutsanityTestBase): self.collect("Island West Turtle") self.collect("Progressive House") self.collect("5 Golden Walnuts", 10) + self.assert_cannot_reach_location(Transportation.parrot_express) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) self.collect("Island North Turtle") self.collect("Island Resort") self.collect("Open Professor Snail Cave") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Dig Site Bridge") self.collect("Island Farmhouse") self.collect("Qi Walnut Room") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Combat Level", 10) self.collect("Mining Level", 10) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Progressive Slingshot") self.collect("Progressive Weapon", 5) self.collect("Progressive Pickaxe", 4) self.collect("Progressive Watering Can", 4) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) class TestWalnutsanityPuzzles(SVWalnutsanityTestBase): @@ -155,9 +159,9 @@ class TestWalnutsanityPuzzlesAndBushes(SVWalnutsanityTestBase): self.collect("Island West Turtle") self.collect("5 Golden Walnuts", 5) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) self.collect("Island North Turtle") - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) class TestWalnutsanityDigSpots(SVWalnutsanityTestBase): @@ -218,20 +222,20 @@ class TestWalnutsanityAll(SVWalnutsanityTestBase): # You need to receive 40, and collect 4 self.collect("Island Obelisk") self.collect("Island West Turtle") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("5 Golden Walnuts", 8) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("3 Golden Walnuts", 14) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("Golden Walnut", 40) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) self.collect("5 Golden Walnuts", 4) self.collect("3 Golden Walnuts", 6) self.collect("Golden Walnut", 2) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) diff --git a/worlds/stardew_valley/test/bases.py b/worlds/stardew_valley/test/bases.py index a2852183..4370c05d 100644 --- a/worlds/stardew_valley/test/bases.py +++ b/worlds/stardew_valley/test/bases.py @@ -4,10 +4,10 @@ import os import threading import typing import unittest +from collections.abc import Iterable from contextlib import contextmanager -from typing import Optional, Dict, Union, Any, List, Iterable -from BaseClasses import get_seed, MultiWorld, Location, Item, CollectionState, Entrance +from BaseClasses import get_seed, MultiWorld, Location, Item, Region, CollectionState, Entrance from test.bases import WorldTestBase from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld from worlds.AutoWorld import call_all @@ -18,6 +18,7 @@ from ..logic.time_logic import MONTH_COEFFICIENT from ..options import StardewValleyOption, options logger = logging.getLogger(__name__) + DEFAULT_TEST_SEED = get_seed() logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") @@ -39,7 +40,7 @@ class SVTestCase(unittest.TestCase): @contextmanager def solo_world_sub_test(self, msg: str | None = None, /, - world_options: dict[str | type[StardewValleyOption], Any] | None = None, + world_options: dict[str | type[StardewValleyOption], typing.Any] | None = None, *, seed=DEFAULT_TEST_SEED, world_caching=True, @@ -121,18 +122,17 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): if item.name != item_to_not_collect: self.multiworld.state.collect(item) - def get_real_locations(self) -> List[Location]: + def get_real_locations(self) -> list[Location]: return [location for location in self.multiworld.get_locations(self.player) if location.address is not None] - def get_real_location_names(self) -> List[str]: + def get_real_location_names(self) -> list[str]: return [location.name for location in self.get_real_locations()] - def collect(self, item: Union[str, Item, Iterable[Item]], count: int = 1) -> Union[None, Item, List[Item]]: + def collect(self, item: str | Item | Iterable[Item], count: int = 1) -> Item | list[Item] | None: assert count > 0 if not isinstance(item, str): - super().collect(item) - return + return super().collect(item) if count == 1: item = self.create_item(item) @@ -162,34 +162,44 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: if state is None: state = self.multiworld.state - super().assert_rule_true(rule, state) + return super().assert_rule_true(rule, state) def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: if state is None: state = self.multiworld.state - super().assert_rule_false(rule, state) + return super().assert_rule_false(rule, state) def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: if state is None: state = self.multiworld.state - super().assert_can_reach_location(location, state) + return super().assert_can_reach_location(location, state) def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: if state is None: state = self.multiworld.state - super().assert_cannot_reach_location(location, state) + return super().assert_cannot_reach_location(location, state) + + def assert_can_reach_region(self, region: Region | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_can_reach_region(region, state) + + def assert_cannot_reach_region(self, region: Region | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_cannot_reach_region(region, state) def assert_can_reach_entrance(self, entrance: Entrance | str, state: CollectionState | None = None) -> None: if state is None: state = self.multiworld.state - super().assert_can_reach_entrance(entrance, state) + return super().assert_can_reach_entrance(entrance, state) pre_generated_worlds = {} @contextmanager -def solo_multiworld(world_options: dict[str | type[StardewValleyOption], Any] | None = None, +def solo_multiworld(world_options: dict[str | type[StardewValleyOption], typing.Any] | None = None, *, seed=DEFAULT_TEST_SEED, world_caching=True) -> Iterable[tuple[MultiWorld, StardewValleyWorld]]: @@ -200,13 +210,11 @@ def solo_multiworld(world_options: dict[str | type[StardewValleyOption], Any] | multiworld = setup_solo_multiworld(world_options, seed) try: multiworld.lock.acquire() - world = multiworld.worlds[1] - original_state = multiworld.state.copy() original_itempool = multiworld.itempool.copy() unfilled_locations = multiworld.get_unfilled_locations(1) - yield multiworld, typing.cast(StardewValleyWorld, world) + yield multiworld, typing.cast(StardewValleyWorld, multiworld.worlds[1]) multiworld.state = original_state multiworld.itempool = original_itempool @@ -217,9 +225,9 @@ def solo_multiworld(world_options: dict[str | type[StardewValleyOption], Any] | # Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. -def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOption], str]] = None, +def setup_solo_multiworld(test_options: dict[str | type[StardewValleyOption], str] | None = None, seed=DEFAULT_TEST_SEED, - _cache: Dict[frozenset, MultiWorld] = {}, # noqa + _cache: dict[frozenset, MultiWorld] = {}, # noqa _steps=gen_steps) -> MultiWorld: test_options = parse_class_option_keys(test_options) @@ -276,7 +284,7 @@ def make_hashable(test_options, seed): return frozenset(test_options.items()).union({("seed", seed)}) -def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset) -> Optional[MultiWorld]: +def search_world_cache(cache: dict[frozenset, MultiWorld], frozen_options: frozenset) -> MultiWorld | None: try: return cache[frozen_options] except KeyError: @@ -286,12 +294,12 @@ def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: froze return None -def add_to_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: +def add_to_world_cache(cache: dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: # We could complete the key with all the default options, but that does not seem to improve performances. cache[frozen_options] = multi_world -def setup_multiworld(test_options: Iterable[Dict[str, int]] = None, seed=None) -> MultiWorld: # noqa +def setup_multiworld(test_options: Iterable[dict[str, int]] | None = None, seed=None) -> MultiWorld: # noqa if test_options is None: test_options = [] diff --git a/worlds/stardew_valley/test/options/utils.py b/worlds/stardew_valley/test/options/utils.py index 9f02105d..1ed88974 100644 --- a/worlds/stardew_valley/test/options/utils.py +++ b/worlds/stardew_valley/test/options/utils.py @@ -7,7 +7,7 @@ from ... import StardewValleyWorld from ...options import StardewValleyOptions, StardewValleyOption -def parse_class_option_keys(test_options: dict[str | StardewValleyOption, Any] | None) -> dict: +def parse_class_option_keys(test_options: dict[str | type[StardewValleyOption], Any] | None) -> dict: """ Now the option class is allowed as key. """ if test_options is None: return {} @@ -25,7 +25,7 @@ def parse_class_option_keys(test_options: dict[str | StardewValleyOption, Any] | return parsed_options -def fill_dataclass_with_default(test_options: dict[str | StardewValleyOption, Any] | None) -> StardewValleyOptions: +def fill_dataclass_with_default(test_options: dict[str | type[StardewValleyOption], Any] | None) -> StardewValleyOptions: test_options = parse_class_option_keys(test_options) filled_options = {} diff --git a/worlds/stardew_valley/test/rules/TestArcades.py b/worlds/stardew_valley/test/rules/TestArcades.py index 407f2999..b820fda7 100644 --- a/worlds/stardew_valley/test/rules/TestArcades.py +++ b/worlds/stardew_valley/test/rules/TestArcades.py @@ -8,9 +8,9 @@ class TestArcadeMachinesLogic(SVTestBase): } def test_prairie_king(self): - self.assertFalse(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_cannot_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") boots = self.create_item("JotPK: Progressive Boots") @@ -21,18 +21,18 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(boots) self.multiworld.state.collect(gun) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) self.multiworld.state.collect(boots) self.multiworld.state.collect(boots) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) @@ -41,9 +41,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(gun) self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) @@ -57,9 +57,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) self.multiworld.state.collect(drop) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_can_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) @@ -80,9 +80,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) self.multiworld.state.collect(drop) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_can_reach_region("JotPK World 3") self.assert_can_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) From c753fbff2de1c2a327dcb83b2b170900902476af Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:31:09 -0400 Subject: [PATCH 032/204] Celeste (Open World): Implement New Game (#4937) * APWorld Skeleton * Hair Color Rando and first items * All interactable items * Checkpoint Items and Locations * First pass sample intermediate data * Bulk of Region/location code * JSON Data Parser * New items and Level Item mapping * Data Parsing fixes and most of 1a data * 1a complete data and region/location/item creation fixes * Add Key Location type and ID output * Add options to slot data * 1B Level Data * Added Location logging * Add Goal Area Options * 1c Level Data * Old Site A B C level data * Key/Binosanity and Hair Length options * Key Item/Location and Clutter Event handling * Remove generic 'keys' item * 3a level data * 3b and 3c level data * Chapter 4 level data * Chapter 5 Logic Data * Chapter 5 level data * Trap Support * Add TrapLink Support * Chapter 6 A/B/C Level Data * Add active_levels to slot_data * Item and Location Name Groups + style cleanups * Chapter 7 Level Data and Items, Gemsanity option * Goal Area and victory handling * Fix slot_data * Add Core Level Data * Carsanity * Farewell Level Data and ID Range Update * Farewell level data and handling * Music Shuffle * Require Cassettes * Change default trap expiration action to Deaths * Handle Poetry * Mod versioning * Rename folder, general cleanup * Additional Cleanup * Handle Farewell Golden Goal when Include Goldens is off * Better handling of Farewell Golden * Update Docs * Beta test bug fixes * Bump to v1.0.0 * Update Changelog * Several Logic tweaks * Update APWorld Version * Add Celeste (Open World) to README * Peer review changes * Logic Fixes: * Adjust Mirror Temple B Key logic * Increment APWorld version * Fix several logic bugs * Add missing link * Add Item Name Groups for common alternative item names * Account for Madeline's post-Celeste hair-dying activities * Account for ignored member variable and hardcoded color in Celeste codebase * Add Blue Clouds to the logic of reaching Farewell - intro-02-launch * Type checking workaround * Bump version number * Adjust Setup Guide * Minor typing fixes * Logic and PR fixes * Increment APWorld Version * Use more world helpers * Core review * CODEOWNERS --- README.md | 1 + docs/CODEOWNERS | 3 + worlds/celeste_open_world/CHANGELOG.md | 47 + worlds/celeste_open_world/Items.py | 264 + worlds/celeste_open_world/Levels.py | 208 + worlds/celeste_open_world/Locations.py | 281 + worlds/celeste_open_world/Names/ItemName.py | 210 + worlds/celeste_open_world/Names/__init__.py | 0 worlds/celeste_open_world/Options.py | 528 + worlds/celeste_open_world/__init__.py | 351 + .../data/CelesteLevelData.json | 41232 ++++++++++++++++ .../data/CelesteLevelData.py | 9792 ++++ worlds/celeste_open_world/data/ParseData.py | 190 + worlds/celeste_open_world/data/__init__.py | 0 .../docs/en_Celeste (Open World).md | 98 + worlds/celeste_open_world/docs/guide_en.md | 20 + 16 files changed, 53225 insertions(+) create mode 100644 worlds/celeste_open_world/CHANGELOG.md create mode 100644 worlds/celeste_open_world/Items.py create mode 100644 worlds/celeste_open_world/Levels.py create mode 100644 worlds/celeste_open_world/Locations.py create mode 100644 worlds/celeste_open_world/Names/ItemName.py create mode 100644 worlds/celeste_open_world/Names/__init__.py create mode 100644 worlds/celeste_open_world/Options.py create mode 100644 worlds/celeste_open_world/__init__.py create mode 100644 worlds/celeste_open_world/data/CelesteLevelData.json create mode 100644 worlds/celeste_open_world/data/CelesteLevelData.py create mode 100644 worlds/celeste_open_world/data/ParseData.py create mode 100644 worlds/celeste_open_world/data/__init__.py create mode 100644 worlds/celeste_open_world/docs/en_Celeste (Open World).md create mode 100644 worlds/celeste_open_world/docs/guide_en.md diff --git a/README.md b/README.md index 44c44d72..4a0aa614 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Currently, the following games are supported: * Super Mario Land 2: 6 Golden Coins * shapez * Paint +* Celeste (Open World) For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 889d5141..44eb830b 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -42,6 +42,9 @@ # Celeste 64 /worlds/celeste64/ @PoryGone +# Celeste (Open World) +/worlds/celeste_open_world/ @PoryGone + # ChecksFinder /worlds/checksfinder/ @SunCatMC diff --git a/worlds/celeste_open_world/CHANGELOG.md b/worlds/celeste_open_world/CHANGELOG.md new file mode 100644 index 00000000..dbc3d717 --- /dev/null +++ b/worlds/celeste_open_world/CHANGELOG.md @@ -0,0 +1,47 @@ +# Celeste - Changelog + + +## v1.0 - First Stable Release + +### Features: + +- Goal is to collect a certain number of Strawberries, finish your chosen Goal Area, and reach the credits in the Epilogue +- Locations included: + - Level Clears + - Strawberries + - Crystal Hearts + - Cassettes + - Golden Strawberries + - Keys + - Checkpoints + - Summit Gems + - Cars + - Binoculars + - Rooms +- Items included: + - 34 different interactable objects + - Keys + - Checkpoints + - Summit Gems + - Crystal Hearts + - Cassettes + - Traps + - Bald Trap + - Literature Trap + - Stun Trap + - Invisible Trap + - Fast Trap + - Slow Trap + - Ice Trap + - Reverse Trap + - Screen Flip Trap + - Laughter Trap + - Hiccup Trap + - Zoom Trap +- Aesthetic Options: + - Music Shuffle + - Require Cassette items to hear music + - Hair Length/Color options +- Death Link + - Amnesty option to select how many deaths must occur to send a DeathLink +- Trap Link diff --git a/worlds/celeste_open_world/Items.py b/worlds/celeste_open_world/Items.py new file mode 100644 index 00000000..51df6e91 --- /dev/null +++ b/worlds/celeste_open_world/Items.py @@ -0,0 +1,264 @@ +from typing import NamedTuple, Optional + +from BaseClasses import Item, ItemClassification +from .Names import ItemName + + +level_item_lists: dict[str, set[str]] = { + "0a": set(), + + "1a": {ItemName.springs, ItemName.traffic_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "1b": {ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "1c": {ItemName.traffic_blocks, ItemName.dash_refills, ItemName.coins}, + + "2a": {ItemName.springs, ItemName.dream_blocks, ItemName.traffic_blocks, ItemName.strawberry_seeds, ItemName.dash_refills, ItemName.coins}, + "2b": {ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ItemName.blue_cassette_blocks}, + "2c": {ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins}, + + "3a": {ItemName.springs, ItemName.moving_platforms, ItemName.sinking_platforms, ItemName.dash_refills, ItemName.coins, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "3b": {ItemName.springs, ItemName.dash_refills, ItemName.sinking_platforms, ItemName.coins, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "3c": {ItemName.dash_refills, ItemName.sinking_platforms, ItemName.coins}, + + "4a": {ItemName.blue_clouds, ItemName.blue_boosters, ItemName.moving_platforms, ItemName.coins, ItemName.strawberry_seeds, ItemName.springs, ItemName.move_blocks, ItemName.pink_clouds, ItemName.white_block, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "4b": {ItemName.blue_boosters, ItemName.moving_platforms, ItemName.move_blocks, ItemName.springs, ItemName.coins, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "4c": {ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ItemName.pink_clouds}, + + "5a": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills, ItemName.coins, ItemName.springs, ItemName.torches, ItemName.seekers, ItemName.theo_crystal, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "5b": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills, ItemName.coins, ItemName.springs, ItemName.torches, ItemName.seekers, ItemName.theo_crystal, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "5c": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills}, + + "6a": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "6b": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ItemName.springs, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "6c": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers}, + + "7a": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.traffic_blocks, ItemName.coins, ItemName.dream_blocks, ItemName.sinking_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ItemName.moving_platforms, ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.feathers, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "7b": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.traffic_blocks, ItemName.coins, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ItemName.swap_blocks, ItemName.red_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "7c": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.coins, ItemName.pink_clouds}, + + # Epilogue + "8a": set(), + + # Core + "9a": {ItemName.springs, ItemName.dash_refills, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.coins, ItemName.badeline_boosters, ItemName.feathers, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "9b": {ItemName.springs, ItemName.dash_refills, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.coins, ItemName.badeline_boosters, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "9c": {ItemName.dash_refills, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks}, + + # Farewell Pre/Post Empty Space + "10a": {ItemName.blue_clouds, ItemName.badeline_boosters, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.swap_blocks, ItemName.springs, ItemName.pufferfish, ItemName.coins, ItemName.dream_blocks, ItemName.jellyfish, ItemName.red_boosters, ItemName.dash_switches, ItemName.move_blocks, ItemName.breaker_boxes, ItemName.traffic_blocks}, + "10b": {ItemName.dream_blocks, ItemName.badeline_boosters, ItemName.bird, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.kevin_blocks, ItemName.coins, ItemName.traffic_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.swap_blocks, ItemName.red_boosters, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.kevin_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish}, + "10c": {ItemName.badeline_boosters, ItemName.double_dash_refills, ItemName.springs, ItemName.pufferfish, ItemName.jellyfish}, +} + +level_cassette_items: dict[str, str] = { + "0a": ItemName.prologue_cassette, + "1a": ItemName.fc_a_cassette, + "1b": ItemName.fc_b_cassette, + "1c": ItemName.fc_c_cassette, + "2a": ItemName.os_a_cassette, + "2b": ItemName.os_b_cassette, + "2c": ItemName.os_c_cassette, + "3a": ItemName.cr_a_cassette, + "3b": ItemName.cr_b_cassette, + "3c": ItemName.cr_c_cassette, + "4a": ItemName.gr_a_cassette, + "4b": ItemName.gr_b_cassette, + "4c": ItemName.gr_c_cassette, + "5a": ItemName.mt_a_cassette, + "5b": ItemName.mt_b_cassette, + "5c": ItemName.mt_c_cassette, + "6a": ItemName.ref_a_cassette, + "6b": ItemName.ref_b_cassette, + "6c": ItemName.ref_c_cassette, + "7a": ItemName.sum_a_cassette, + "7b": ItemName.sum_b_cassette, + "7c": ItemName.sum_c_cassette, + "8a": ItemName.epilogue_cassette, + "9a": ItemName.core_a_cassette, + "9b": ItemName.core_b_cassette, + "9c": ItemName.core_c_cassette, + "10a":ItemName.farewell_cassette, +} + + +celeste_base_id: int = 0xCA10000 + + +class CelesteItem(Item): + game = "Celeste" + + +class CelesteItemData(NamedTuple): + code: Optional[int] = None + type: ItemClassification = ItemClassification.filler + + +collectable_item_data_table: dict[str, CelesteItemData] = { + ItemName.strawberry: CelesteItemData(celeste_base_id + 0x0, ItemClassification.progression_skip_balancing), + ItemName.raspberry: CelesteItemData(celeste_base_id + 0x1, ItemClassification.filler), +} + +goal_item_data_table: dict[str, CelesteItemData] = { + ItemName.house_keys: CelesteItemData(celeste_base_id + 0x10, ItemClassification.progression_skip_balancing), +} + +trap_item_data_table: dict[str, CelesteItemData] = { + ItemName.bald_trap: CelesteItemData(celeste_base_id + 0x20, ItemClassification.trap), + ItemName.literature_trap: CelesteItemData(celeste_base_id + 0x21, ItemClassification.trap), + ItemName.stun_trap: CelesteItemData(celeste_base_id + 0x22, ItemClassification.trap), + ItemName.invisible_trap: CelesteItemData(celeste_base_id + 0x23, ItemClassification.trap), + ItemName.fast_trap: CelesteItemData(celeste_base_id + 0x24, ItemClassification.trap), + ItemName.slow_trap: CelesteItemData(celeste_base_id + 0x25, ItemClassification.trap), + ItemName.ice_trap: CelesteItemData(celeste_base_id + 0x26, ItemClassification.trap), + ItemName.reverse_trap: CelesteItemData(celeste_base_id + 0x28, ItemClassification.trap), + ItemName.screen_flip_trap: CelesteItemData(celeste_base_id + 0x29, ItemClassification.trap), + ItemName.laughter_trap: CelesteItemData(celeste_base_id + 0x2A, ItemClassification.trap), + ItemName.hiccup_trap: CelesteItemData(celeste_base_id + 0x2B, ItemClassification.trap), + ItemName.zoom_trap: CelesteItemData(celeste_base_id + 0x2C, ItemClassification.trap), +} + +checkpoint_item_data_table: dict[str, CelesteItemData] = {} + +key_item_data_table: dict[str, CelesteItemData] = {} +gem_item_data_table: dict[str, CelesteItemData] = {} + +interactable_item_data_table: dict[str, CelesteItemData] = { + ItemName.springs: CelesteItemData(celeste_base_id + 0x2000 + 0x00, ItemClassification.progression), + ItemName.traffic_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x01, ItemClassification.progression), + ItemName.pink_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x02, ItemClassification.progression), + ItemName.blue_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x03, ItemClassification.progression), + + ItemName.dream_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x04, ItemClassification.progression), + ItemName.coins: CelesteItemData(celeste_base_id + 0x2000 + 0x05, ItemClassification.progression), + ItemName.strawberry_seeds: CelesteItemData(celeste_base_id + 0x2000 + 0x1F, ItemClassification.progression), + + ItemName.sinking_platforms: CelesteItemData(celeste_base_id + 0x2000 + 0x20, ItemClassification.progression), + + ItemName.moving_platforms: CelesteItemData(celeste_base_id + 0x2000 + 0x06, ItemClassification.progression), + ItemName.blue_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x07, ItemClassification.progression), + ItemName.blue_clouds: CelesteItemData(celeste_base_id + 0x2000 + 0x08, ItemClassification.progression), + ItemName.move_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x09, ItemClassification.progression), + ItemName.white_block: CelesteItemData(celeste_base_id + 0x2000 + 0x21, ItemClassification.progression), + + ItemName.swap_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x0A, ItemClassification.progression), + ItemName.red_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x0B, ItemClassification.progression), + ItemName.torches: CelesteItemData(celeste_base_id + 0x2000 + 0x22, ItemClassification.useful), + ItemName.theo_crystal: CelesteItemData(celeste_base_id + 0x2000 + 0x0C, ItemClassification.progression), + + ItemName.feathers: CelesteItemData(celeste_base_id + 0x2000 + 0x0D, ItemClassification.progression), + ItemName.bumpers: CelesteItemData(celeste_base_id + 0x2000 + 0x0E, ItemClassification.progression), + ItemName.kevin_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x0F, ItemClassification.progression), + + ItemName.pink_clouds: CelesteItemData(celeste_base_id + 0x2000 + 0x10, ItemClassification.progression), + ItemName.badeline_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x11, ItemClassification.progression), + + ItemName.fire_ice_balls: CelesteItemData(celeste_base_id + 0x2000 + 0x12, ItemClassification.progression), + ItemName.core_toggles: CelesteItemData(celeste_base_id + 0x2000 + 0x13, ItemClassification.progression), + ItemName.core_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x14, ItemClassification.progression), + + ItemName.pufferfish: CelesteItemData(celeste_base_id + 0x2000 + 0x15, ItemClassification.progression), + ItemName.jellyfish: CelesteItemData(celeste_base_id + 0x2000 + 0x16, ItemClassification.progression), + ItemName.breaker_boxes: CelesteItemData(celeste_base_id + 0x2000 + 0x17, ItemClassification.progression), + ItemName.dash_refills: CelesteItemData(celeste_base_id + 0x2000 + 0x18, ItemClassification.progression), + ItemName.double_dash_refills: CelesteItemData(celeste_base_id + 0x2000 + 0x19, ItemClassification.progression), + ItemName.yellow_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x1A, ItemClassification.progression), + ItemName.green_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x1B, ItemClassification.progression), + ItemName.bird: CelesteItemData(celeste_base_id + 0x2000 + 0x23, ItemClassification.progression), + + ItemName.dash_switches: CelesteItemData(celeste_base_id + 0x2000 + 0x1C, ItemClassification.progression), + ItemName.seekers: CelesteItemData(celeste_base_id + 0x2000 + 0x1D, ItemClassification.progression), +} + +cassette_item_data_table: dict[str, CelesteItemData] = { + ItemName.prologue_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x00, ItemClassification.filler), + ItemName.fc_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x01, ItemClassification.filler), + ItemName.fc_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x02, ItemClassification.filler), + ItemName.fc_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x03, ItemClassification.filler), + ItemName.os_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x04, ItemClassification.filler), + ItemName.os_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x05, ItemClassification.filler), + ItemName.os_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x06, ItemClassification.filler), + ItemName.cr_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x07, ItemClassification.filler), + ItemName.cr_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x08, ItemClassification.filler), + ItemName.cr_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x09, ItemClassification.filler), + ItemName.gr_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0A, ItemClassification.filler), + ItemName.gr_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0B, ItemClassification.filler), + ItemName.gr_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0C, ItemClassification.filler), + ItemName.mt_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0D, ItemClassification.filler), + ItemName.mt_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0E, ItemClassification.filler), + ItemName.mt_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0F, ItemClassification.filler), + ItemName.ref_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x10, ItemClassification.filler), + ItemName.ref_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x11, ItemClassification.filler), + ItemName.ref_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x12, ItemClassification.filler), + ItemName.sum_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x13, ItemClassification.filler), + ItemName.sum_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x14, ItemClassification.filler), + ItemName.sum_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x15, ItemClassification.filler), + ItemName.epilogue_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x16, ItemClassification.filler), + ItemName.core_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x17, ItemClassification.filler), + ItemName.core_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x18, ItemClassification.filler), + ItemName.core_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x19, ItemClassification.filler), + ItemName.farewell_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x1A, ItemClassification.filler), +} + +crystal_heart_item_data_table: dict[str, CelesteItemData] = { + ItemName.crystal_heart_1: CelesteItemData(celeste_base_id + 0x3000 + 0x00, ItemClassification.filler), + ItemName.crystal_heart_2: CelesteItemData(celeste_base_id + 0x3000 + 0x01, ItemClassification.filler), + ItemName.crystal_heart_3: CelesteItemData(celeste_base_id + 0x3000 + 0x02, ItemClassification.filler), + ItemName.crystal_heart_4: CelesteItemData(celeste_base_id + 0x3000 + 0x03, ItemClassification.filler), + ItemName.crystal_heart_5: CelesteItemData(celeste_base_id + 0x3000 + 0x04, ItemClassification.filler), + ItemName.crystal_heart_6: CelesteItemData(celeste_base_id + 0x3000 + 0x05, ItemClassification.filler), + ItemName.crystal_heart_7: CelesteItemData(celeste_base_id + 0x3000 + 0x06, ItemClassification.filler), + ItemName.crystal_heart_8: CelesteItemData(celeste_base_id + 0x3000 + 0x07, ItemClassification.filler), + ItemName.crystal_heart_9: CelesteItemData(celeste_base_id + 0x3000 + 0x08, ItemClassification.filler), + ItemName.crystal_heart_10: CelesteItemData(celeste_base_id + 0x3000 + 0x09, ItemClassification.filler), + ItemName.crystal_heart_11: CelesteItemData(celeste_base_id + 0x3000 + 0x0A, ItemClassification.filler), + ItemName.crystal_heart_12: CelesteItemData(celeste_base_id + 0x3000 + 0x0B, ItemClassification.filler), + ItemName.crystal_heart_13: CelesteItemData(celeste_base_id + 0x3000 + 0x0C, ItemClassification.filler), + ItemName.crystal_heart_14: CelesteItemData(celeste_base_id + 0x3000 + 0x0D, ItemClassification.filler), + ItemName.crystal_heart_15: CelesteItemData(celeste_base_id + 0x3000 + 0x0E, ItemClassification.filler), + ItemName.crystal_heart_16: CelesteItemData(celeste_base_id + 0x3000 + 0x0F, ItemClassification.filler), +} + +def add_checkpoint_to_table(id: int, name: str): + checkpoint_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def add_key_to_table(id: int, name: str): + key_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def add_gem_to_table(id: int, name: str): + gem_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def generate_item_data_table() -> dict[str, CelesteItemData]: + return {**collectable_item_data_table, + **goal_item_data_table, + **trap_item_data_table, + **checkpoint_item_data_table, + **key_item_data_table, + **gem_item_data_table, + **cassette_item_data_table, + **crystal_heart_item_data_table, + **interactable_item_data_table} + + +def generate_item_table() -> dict[str, int]: + return {name: data.code for name, data in generate_item_data_table().items() if data.code is not None} + + +def generate_item_groups() -> dict[str, list[str]]: + item_groups: dict[str, list[str]] = { + "Collectables": list(collectable_item_data_table.keys()), + "Traps": list(trap_item_data_table.keys()), + "Checkpoints": list(checkpoint_item_data_table.keys()), + "Keys": list(key_item_data_table.keys()), + "Gems": list(gem_item_data_table.keys()), + "Cassettes": list(cassette_item_data_table.keys()), + "Crystal Hearts": list(crystal_heart_item_data_table.keys()), + "Interactables": list(interactable_item_data_table.keys()), + + # Commonly mistaken names + "Green Boosters": [ItemName.blue_boosters], + "Green Bubbles": [ItemName.blue_boosters], + "Blue Bubbles": [ItemName.blue_boosters], + "Red Bubbles": [ItemName.red_boosters], + "Touch Switches": [ItemName.coins], + } + + return item_groups diff --git a/worlds/celeste_open_world/Levels.py b/worlds/celeste_open_world/Levels.py new file mode 100644 index 00000000..1f846bbe --- /dev/null +++ b/worlds/celeste_open_world/Levels.py @@ -0,0 +1,208 @@ +from __future__ import annotations +from enum import IntEnum + +from BaseClasses import CollectionState + + +goal_area_option_to_name: dict[int, str] = { + 0: "7a", + 1: "7b", + 2: "7c", + 3: "9a", + 4: "9b", + 5: "9c", + 6: "10a", + 7: "10b", + 8: "10c", +} + + +goal_area_option_to_display_name: dict[int, str] = { + 0: "The Summit A", + 1: "The Summit B", + 2: "The Summit C", + 3: "Core A", + 4: "Core B", + 5: "Core C", + 6: "Farewell", + 7: "Farewell", + 8: "Farewell", +} + +goal_area_to_location_name: dict[str, str] = { + "7a": "The Summit A - Level Clear", + "7b": "The Summit B - Level Clear", + "7c": "The Summit C - Level Clear", + "9a": "Core A - Level Clear", + "9b": "Core B - Level Clear", + "9c": "Core C - Level Clear", + "10a": "Farewell - Crystal Heart?", + "10b": "Farewell - Level Clear", + "10c": "Farewell - Golden Strawberry", +} + + +class LocationType(IntEnum): + strawberry = 0 + golden_strawberry = 1 + cassette = 2 + crystal_heart = 3 + checkpoint = 4 + level_clear = 5 + key = 6 + binoculars = 7 + room_enter = 8 + clutter = 9 + gem = 10 + car = 11 + +class DoorDirection(IntEnum): + up = 0 + right = 1 + down = 2 + left = 3 + special = 4 + + +class Door: + name: str + room_name: str + room: Room + dir: DoorDirection + blocked: bool + closes_behind: bool + region: PreRegion + + def __init__(self, name: str, room_name: str, dir: DoorDirection, blocked: bool, closes_behind: bool): + self.name = name + self.room_name = room_name + self.dir = dir + self.blocked = blocked + self.closes_behind = closes_behind + # Find PreRegion later using our name once we know it exists + + +class PreRegion: + name: str + room_name: str + room: Room + connections: list[RegionConnection] + locations: list[LevelLocation] + + def __init__(self, name: str, room_name: str, connections: list[RegionConnection], locations: list[LevelLocation]): + self.name = name + self.room_name = room_name + self.connections = connections.copy() + self.locations = locations.copy() + + for loc in self.locations: + loc.region = self + + +class RegionConnection: + source_name: str + source: PreRegion + destination_name: str + destination: PreRegion + possible_access: list[list[str]] + + def __init__(self, source_name: str, destination_name: str, possible_access: list[list[str]] = []): + self.source_name = source_name + self.destination_name = destination_name + self.possible_access = possible_access.copy() + + +class LevelLocation: + name: str + display_name: str + region_name: str + region: PreRegion + loc_type: LocationType + possible_access: list[list[str]] + + def __init__(self, name: str, display_name: str, region_name: str, loc_type: LocationType, possible_access: list[list[str]] = []): + self.name = name + self.display_name = display_name + self.region_name = region_name + self.loc_type = loc_type + self.possible_access = possible_access.copy() + +class Room: + level_name: str + name: str + display_name: str + regions: list[PreRegion] + doors: list[Door] + checkpoint: str + checkpoint_region: str + + def __init__(self, level_name: str, name: str, display_name: str, regions: list[PreRegion], doors: list[Door], checkpoint: str = None, checkpoint_region: str = None): + self.level_name = level_name + self.name = name + self.display_name = display_name + self.regions = regions.copy() + self.doors = doors.copy() + self.checkpoint = checkpoint + self.checkpoint_region = checkpoint_region + + from .data.CelesteLevelData import all_regions + + for reg in self.regions: + reg.room = self + + for reg_con in reg.connections: + reg_con.source = reg + reg_con.destination = all_regions[reg_con.destination_name] + + for door in self.doors: + door.room = self + + +class RoomConnection: + level_name: str + source: Door + dest: Door + two_way: bool + + def __init__(self, level_name: str, source: Door, dest: Door): + self.level_name = level_name + self.source = source + self.dest = dest + self.two_way = not self.dest.closes_behind + + if (self.source.dir == DoorDirection.left and self.dest.dir != DoorDirection.right or + self.source.dir == DoorDirection.right and self.dest.dir != DoorDirection.left or + self.source.dir == DoorDirection.up and self.dest.dir != DoorDirection.down or + self.source.dir == DoorDirection.down and self.dest.dir != DoorDirection.up): + raise Exception(f"Door {source.name} ({self.source.dir}) and Door {dest.name} ({self.dest.dir}) have mismatched directions.") + + +class Level: + name: str + display_name: str + rooms: list[Room] + room_connections: list[RoomConnection] + + def __init__(self, name: str, display_name: str, rooms: list[Room], room_connections: list[RoomConnection]): + self.name = name + self.display_name = display_name + self.rooms = rooms.copy() + self.room_connections = room_connections.copy() + + +def load_logic_data() -> dict[str, Level]: + from .data.CelesteLevelData import all_levels + + #for _, level in all_levels.items(): + # print(level.display_name) + # + # for room in level.rooms: + # print(" " + room.display_name) + # + # for region in room.regions: + # print(" " + region.name) + # + # for location in region.locations: + # print(" " + location.display_name) + + return all_levels diff --git a/worlds/celeste_open_world/Locations.py b/worlds/celeste_open_world/Locations.py new file mode 100644 index 00000000..01ce5336 --- /dev/null +++ b/worlds/celeste_open_world/Locations.py @@ -0,0 +1,281 @@ +from typing import NamedTuple, Optional, TYPE_CHECKING + +from BaseClasses import Location, Region +from worlds.generic.Rules import set_rule + +from .Levels import Level, LocationType +from .Names import ItemName + +if TYPE_CHECKING: + from . import CelesteOpenWorld +else: + CelesteOpenWorld = object + + +celeste_base_id: int = 0xCA10000 + + +class CelesteLocation(Location): + game = "Celeste" + + +class CelesteLocationData(NamedTuple): + region: str + address: Optional[int] = None + + +checkpoint_location_data_table: dict[str, CelesteLocationData] = {} +key_location_data_table: dict[str, CelesteLocationData] = {} + +location_id_offsets: dict[LocationType, int | None] = { + LocationType.strawberry: celeste_base_id, + LocationType.golden_strawberry: celeste_base_id + 0x1000, + LocationType.cassette: celeste_base_id + 0x2000, + LocationType.car: celeste_base_id + 0x2A00, + LocationType.crystal_heart: celeste_base_id + 0x3000, + LocationType.checkpoint: celeste_base_id + 0x4000, + LocationType.level_clear: celeste_base_id + 0x5000, + LocationType.key: celeste_base_id + 0x6000, + LocationType.gem: celeste_base_id + 0x6A00, + LocationType.binoculars: celeste_base_id + 0x7000, + LocationType.room_enter: celeste_base_id + 0x8000, + LocationType.clutter: None, +} + + +def generate_location_table() -> dict[str, int]: + from .Levels import Level, LocationType, load_logic_data + level_data: dict[str, Level] = load_logic_data() + location_table = {} + + location_counts: dict[LocationType, int] = { + LocationType.strawberry: 0, + LocationType.golden_strawberry: 0, + LocationType.cassette: 0, + LocationType.car: 0, + LocationType.crystal_heart: 0, + LocationType.checkpoint: 0, + LocationType.level_clear: 0, + LocationType.key: 0, + LocationType.gem: 0, + LocationType.binoculars: 0, + LocationType.room_enter: 0, + } + + for _, level in level_data.items(): + for room in level.rooms: + if room.name != "10b_GOAL": + location_table[room.display_name] = location_id_offsets[LocationType.room_enter] + location_counts[LocationType.room_enter] + location_counts[LocationType.room_enter] += 1 + + if room.checkpoint is not None and room.checkpoint != "Start": + checkpoint_id: int = location_id_offsets[LocationType.checkpoint] + location_counts[LocationType.checkpoint] + checkpoint_name: str = level.display_name + " - " + room.checkpoint + location_table[checkpoint_name] = checkpoint_id + location_counts[LocationType.checkpoint] += 1 + checkpoint_location_data_table[checkpoint_name] = CelesteLocationData(level.display_name, checkpoint_id) + + from .Items import add_checkpoint_to_table + add_checkpoint_to_table(checkpoint_id, checkpoint_name) + + for region in room.regions: + for location in region.locations: + if location_id_offsets[location.loc_type] is not None: + location_id = location_id_offsets[location.loc_type] + location_counts[location.loc_type] + location_table[location.display_name] = location_id + location_counts[location.loc_type] += 1 + + if location.loc_type == LocationType.key: + from .Items import add_key_to_table + add_key_to_table(location_id, location.display_name) + + if location.loc_type == LocationType.gem: + from .Items import add_gem_to_table + add_gem_to_table(location_id, location.display_name) + + return location_table + + +def create_regions_and_locations(world: CelesteOpenWorld): + menu_region = Region("Menu", world.player, world.multiworld) + world.multiworld.regions.append(menu_region) + + world.active_checkpoint_names: list[str] = [] + world.goal_checkpoint_names: dict[str, str] = dict() + world.active_key_names: list[str] = [] + world.active_gem_names: list[str] = [] + world.active_clutter_names: list[str] = [] + + for _, level in world.level_data.items(): + if level.name not in world.active_levels: + continue + + for room in level.rooms: + room_region = Region(room.name + "_room", world.player, world.multiworld) + world.multiworld.regions.append(room_region) + + for pre_region in room.regions: + region = Region(pre_region.name, world.player, world.multiworld) + world.multiworld.regions.append(region) + + for level_location in pre_region.locations: + if level_location.loc_type == LocationType.golden_strawberry: + if level_location.display_name == "Farewell - Golden Strawberry": + if not world.options.goal_area == "farewell_golden": + continue + elif not world.options.include_goldens: + continue + + if level_location.loc_type == LocationType.car and not world.options.carsanity: + continue + + if level_location.loc_type == LocationType.binoculars and not world.options.binosanity: + continue + + if level_location.loc_type == LocationType.key: + world.active_key_names.append(level_location.display_name) + + if level_location.loc_type == LocationType.gem: + world.active_gem_names.append(level_location.display_name) + + location_rule = None + if len(level_location.possible_access) == 1: + only_access = level_location.possible_access[0] + if len(only_access) == 1: + only_item = level_location.possible_access[0][0] + def location_rule_func(state, only_item=only_item): + return state.has(only_item, world.player) + location_rule = location_rule_func + else: + def location_rule_func(state, only_access=only_access): + return state.has_all(only_access, world.player) + location_rule = location_rule_func + elif len(level_location.possible_access) > 0: + def location_rule_func(state, level_location=level_location): + for sublist in level_location.possible_access: + if state.has_all(sublist, world.player): + return True + return False + location_rule = location_rule_func + + if level_location.loc_type == LocationType.clutter: + world.active_clutter_names.append(level_location.display_name) + location = CelesteLocation(world.player, level_location.display_name, None, region) + if location_rule is not None: + set_rule(location, location_rule) + region.locations.append(location) + continue + + location = CelesteLocation(world.player, level_location.display_name, world.location_name_to_id[level_location.display_name], region) + if location_rule is not None: + set_rule(location, location_rule) + region.locations.append(location) + + for pre_region in room.regions: + region = world.get_region(pre_region.name) + for connection in pre_region.connections: + connection_rule = None + if len(connection.possible_access) == 1: + only_access = connection.possible_access[0] + if len(only_access) == 1: + only_item = connection.possible_access[0][0] + def connection_rule_func(state, only_item=only_item): + return state.has(only_item, world.player) + connection_rule = connection_rule_func + else: + def connection_rule_func(state, only_access=only_access): + return state.has_all(only_access, world.player) + connection_rule = connection_rule_func + elif len(connection.possible_access) > 0: + def connection_rule_func(state, connection=connection): + for sublist in connection.possible_access: + if state.has_all(sublist, world.player): + return True + return False + + connection_rule = connection_rule_func + + if connection_rule is None: + region.add_exits([connection.destination_name]) + else: + region.add_exits([connection.destination_name], {connection.destination_name: connection_rule}) + region.add_exits([room_region.name]) + + if room.checkpoint != None: + if room.checkpoint == "Start": + if world.options.lock_goal_area and (level.name == world.goal_area or (level.name[:2] == world.goal_area[:2] == "10")): + world.goal_start_region: str = room.checkpoint_region + elif level.name == "8a": + world.epilogue_start_region: str = room.checkpoint_region + else: + menu_region.add_exits([room.checkpoint_region]) + else: + checkpoint_location_name = level.display_name + " - " + room.checkpoint + world.active_checkpoint_names.append(checkpoint_location_name) + checkpoint_rule = lambda state, checkpoint_location_name=checkpoint_location_name: state.has(checkpoint_location_name, world.player) + room_region.add_locations({ + checkpoint_location_name: world.location_name_to_id[checkpoint_location_name] + }, CelesteLocation) + + if world.options.lock_goal_area and (level.name == world.goal_area or (level.name[:2] == world.goal_area[:2] == "10")): + world.goal_checkpoint_names[room.checkpoint_region] = checkpoint_location_name + else: + menu_region.add_exits([room.checkpoint_region], {room.checkpoint_region: checkpoint_rule}) + + if world.options.roomsanity: + if room.name != "10b_GOAL": + room_location_name = room.display_name + room_region.add_locations({ + room_location_name: world.location_name_to_id[room_location_name] + }, CelesteLocation) + + for room_connection in level.room_connections: + source_region = world.get_region(room_connection.source.name) + source_region.add_exits([room_connection.dest.name]) + if room_connection.two_way: + dest_region = world.get_region(room_connection.dest.name) + dest_region.add_exits([room_connection.source.name]) + + if level.name == "10b": + # Manually connect the two parts of Farewell + source_region = world.get_region("10a_e-08_east") + source_region.add_exits(["10b_f-door_west"]) + + if level.name == "10c": + # Manually connect the Golden room of Farewell + golden_items: list[str] = [ItemName.traffic_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.dream_blocks, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.coins, ItemName.red_boosters, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.badeline_boosters, ItemName.bird, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks] + golden_rule = lambda state: state.has_all(golden_items, world.player) + + source_region_end = world.get_region("10b_j-19_top") + source_region_end.add_exits(["10c_end-golden_bottom"], {"10c_end-golden_bottom": golden_rule}) + source_region_moon = world.get_region("10b_j-16_east") + source_region_moon.add_exits(["10c_end-golden_bottom"], {"10c_end-golden_bottom": golden_rule}) + source_region_golden = world.get_region("10c_end-golden_top") + source_region_golden.add_exits(["10b_GOAL_main"]) + + +location_data_table: dict[str, int] = generate_location_table() + + +def generate_location_groups() -> dict[str, list[str]]: + from .Levels import Level, LocationType, load_logic_data + level_data: dict[str, Level] = load_logic_data() + + location_groups: dict[str, list[str]] = { + "Strawberries": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.strawberry] and id < location_id_offsets[LocationType.golden_strawberry]], + "Golden Strawberries": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.golden_strawberry] and id < location_id_offsets[LocationType.cassette]], + "Cassettes": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.cassette] and id < location_id_offsets[LocationType.car]], + "Cars": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.car] and id < location_id_offsets[LocationType.crystal_heart]], + "Crystal Hearts": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.crystal_heart] and id < location_id_offsets[LocationType.checkpoint]], + "Checkpoints": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.checkpoint] and id < location_id_offsets[LocationType.level_clear]], + "Level Clears": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.level_clear] and id < location_id_offsets[LocationType.key]], + "Keys": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.key] and id < location_id_offsets[LocationType.gem]], + "Gems": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.gem] and id < location_id_offsets[LocationType.binoculars]], + "Binoculars": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.binoculars] and id < location_id_offsets[LocationType.room_enter]], + "Rooms": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.room_enter]], + } + + for level in level_data.values(): + location_groups.update({level.display_name: [loc_name for loc_name, id in location_data_table.items() if level.display_name in loc_name]}) + + return location_groups diff --git a/worlds/celeste_open_world/Names/ItemName.py b/worlds/celeste_open_world/Names/ItemName.py new file mode 100644 index 00000000..93b57dde --- /dev/null +++ b/worlds/celeste_open_world/Names/ItemName.py @@ -0,0 +1,210 @@ +# Collectables +strawberry = "Strawberry" +raspberry = "Raspberry" + +# Goal Items +house_keys = "Granny's House Keys" +victory = "Victory" + +# Traps +bald_trap = "Bald Trap" +literature_trap = "Literature Trap" +stun_trap = "Stun Trap" +invisible_trap = "Invisible Trap" +fast_trap = "Fast Trap" +slow_trap = "Slow Trap" +ice_trap = "Ice Trap" +reverse_trap = "Reverse Trap" +screen_flip_trap = "Screen Flip Trap" +laughter_trap = "Laughter Trap" +hiccup_trap = "Hiccup Trap" +zoom_trap = "Zoom Trap" + +# Movement +dash = "Dash" +u_dash = "Up Dash" +r_dash = "Right Dash" +d_dash = "Down Dash" +l_dash = "Left Dash" +ur_dash = "Up-Right Dash" +dr_dash = "Down-Right Dash" +dl_dash = "Down-Left Dash" +ul_dash = "Up-Left Dash" + +# Interactables +springs = "Springs" +traffic_blocks = "Traffic Blocks" +pink_cassette_blocks = "Pink Cassette Blocks" +blue_cassette_blocks = "Blue Cassette Blocks" + +dream_blocks = "Dream Blocks" +coins = "Coins" +strawberry_seeds = "Strawberry Seeds" + +sinking_platforms = "Sinking Platforms" + +moving_platforms = "Moving Platforms" +blue_boosters = "Blue Boosters" +blue_clouds = "Blue Clouds" +move_blocks = "Move Blocks" +white_block = "White Block" + +swap_blocks = "Swap Blocks" +red_boosters = "Red Boosters" +torches = "Torches" +theo_crystal = "Theo Crystal" + +feathers = "Feathers" +bumpers = "Bumpers" +kevin_blocks = "Kevins" + +pink_clouds = "Pink Clouds" +badeline_boosters = "Badeline Boosters" + +fire_ice_balls = "Fire and Ice Balls" +core_toggles = "Core Toggles" +core_blocks = "Core Blocks" + +pufferfish = "Pufferfish" +jellyfish = "Jellyfish" +breaker_boxes = "Breaker Boxes" +dash_refills = "Dash Refills" +double_dash_refills = "Double Dash Refills" +yellow_cassette_blocks = "Yellow Cassette Blocks" +green_cassette_blocks = "Green Cassette Blocks" + +dash_switches = "Dash Switches" +seekers = "Seekers" +bird = "Bird" + +brown_clutter = "Celestial Resort A - Brown Clutter" +green_clutter = "Celestial Resort A - Green Clutter" +pink_clutter = "Celestial Resort A - Pink Clutter" + +cannot_access = "Cannot Access" + +# Checkpoints +fc_a_checkpoint_1 = "Forsaken City A - Crossing" +fc_a_checkpoint_2 = "Forsaken City A - Chasm" + +fc_b_checkpoint_1 = "Forsaken City B - Contraption" +fc_b_checkpoint_2 = "Forsaken City B - Scrap Pit" + +os_a_checkpoint_1 = "Old Site A - Intervention" +os_a_checkpoint_2 = "Old Site A - Awake" + +os_b_checkpoint_1 = "Old Site B - Combination Lock" +os_b_checkpoint_2 = "Old Site B - Dream Altar" + +cr_a_checkpoint_1 = "Celestial Resort A - Huge Mess" +cr_a_checkpoint_2 = "Celestial Resort A - Elevator Shaft" +cr_a_checkpoint_3 = "Celestial Resort A - Presidential Suite" + +cr_b_checkpoint_1 = "Celestial Resort B - Staff Quarters" +cr_b_checkpoint_2 = "Celestial Resort B - Library" +cr_b_checkpoint_3 = "Celestial Resort B - Rooftop" + +gr_a_checkpoint_1 = "Golden Ridge A - Shrine" +gr_a_checkpoint_2 = "Golden Ridge A - Old Trail" +gr_a_checkpoint_3 = "Golden Ridge A - Cliff Face" + +gr_b_checkpoint_1 = "Golden Ridge B - Stepping Stones" +gr_b_checkpoint_2 = "Golden Ridge B - Gusty Canyon" +gr_b_checkpoint_3 = "Golden Ridge B - Eye of the Storm" + +mt_a_checkpoint_1 = "Mirror Temple A - Depths" +mt_a_checkpoint_2 = "Mirror Temple A - Unravelling" +mt_a_checkpoint_3 = "Mirror Temple A - Search" +mt_a_checkpoint_4 = "Mirror Temple A - Rescue" + +mt_b_checkpoint_1 = "Mirror Temple B - Central Chamber" +mt_b_checkpoint_2 = "Mirror Temple B - Through the Mirror" +mt_b_checkpoint_3 = "Mirror Temple B - Mix Master" + +ref_a_checkpoint_1 = "Reflection A - Lake" +ref_a_checkpoint_2 = "Reflection A - Hollows" +ref_a_checkpoint_3 = "Reflection A - Reflection" +ref_a_checkpoint_4 = "Reflection A - Rock Bottom" +ref_a_checkpoint_5 = "Reflection A - Resolution" + +ref_b_checkpoint_1 = "Reflection B - Reflection" +ref_b_checkpoint_2 = "Reflection B - Rock Bottom" +ref_b_checkpoint_3 = "Reflection B - Reprieve" + +sum_a_checkpoint_1 = "The Summit A - 500 M" +sum_a_checkpoint_2 = "The Summit A - 1000 M" +sum_a_checkpoint_3 = "The Summit A - 1500 M" +sum_a_checkpoint_4 = "The Summit A - 2000 M" +sum_a_checkpoint_5 = "The Summit A - 2500 M" +sum_a_checkpoint_6 = "The Summit A - 3000 M" + +sum_b_checkpoint_1 = "The Summit B - 500 M" +sum_b_checkpoint_2 = "The Summit B - 1000 M" +sum_b_checkpoint_3 = "The Summit B - 1500 M" +sum_b_checkpoint_4 = "The Summit B - 2000 M" +sum_b_checkpoint_5 = "The Summit B - 2500 M" +sum_b_checkpoint_6 = "The Summit B - 3000 M" + +core_a_checkpoint_1 = "Core A - Into the Core" +core_a_checkpoint_2 = "Core A - Hot and Cold" +core_a_checkpoint_3 = "Core A - Heart of the Mountain" + +core_b_checkpoint_1 = "Core B - Into the Core" +core_b_checkpoint_2 = "Core B - Burning or Freezing" +core_b_checkpoint_3 = "Core B - Heartbeat" + +farewell_checkpoint_1 = "Farewell - Singular" +farewell_checkpoint_2 = "Farewell - Power Source" +farewell_checkpoint_3 = "Farewell - Remembered" +farewell_checkpoint_4 = "Farewell - Event Horizon" +farewell_checkpoint_5 = "Farewell - Determination" +farewell_checkpoint_6 = "Farewell - Stubbornness" +farewell_checkpoint_7 = "Farewell - Reconcilliation" +farewell_checkpoint_8 = "Farewell - Farewell" + +# Cassettes +prologue_cassette = "Prologue Cassette" +fc_a_cassette = "Forsaken City Cassette - A Side" +fc_b_cassette = "Forsaken City Cassette - B Side" +fc_c_cassette = "Forsaken City Cassette - C Side" +os_a_cassette = "Old Site Cassette - A Side" +os_b_cassette = "Old Site Cassette - B Side" +os_c_cassette = "Old Site Cassette - C Side" +cr_a_cassette = "Celestial Resort Cassette - A Side" +cr_b_cassette = "Celestial Resort Cassette - B Side" +cr_c_cassette = "Celestial Resort Cassette - C Side" +gr_a_cassette = "Golden Ridge Cassette - A Side" +gr_b_cassette = "Golden Ridge Cassette - B Side" +gr_c_cassette = "Golden Ridge Cassette - C Side" +mt_a_cassette = "Mirror Temple Cassette - A Side" +mt_b_cassette = "Mirror Temple Cassette - B Side" +mt_c_cassette = "Mirror Temple Cassette - C Side" +ref_a_cassette = "Reflection Cassette - A Side" +ref_b_cassette = "Reflection Cassette - B Side" +ref_c_cassette = "Reflection Cassette - C Side" +sum_a_cassette = "The Summit Cassette - A Side" +sum_b_cassette = "The Summit Cassette - B Side" +sum_c_cassette = "The Summit Cassette - C Side" +epilogue_cassette = "Epilogue Cassette" +core_a_cassette = "Core Cassette - A Side" +core_b_cassette = "Core Cassette - B Side" +core_c_cassette = "Core Cassette - C Side" +farewell_cassette = "Farewell Cassette" + +# Crystal Hearts +crystal_heart_1 = "Crystal Heart 1" +crystal_heart_2 = "Crystal Heart 2" +crystal_heart_3 = "Crystal Heart 3" +crystal_heart_4 = "Crystal Heart 4" +crystal_heart_5 = "Crystal Heart 5" +crystal_heart_6 = "Crystal Heart 6" +crystal_heart_7 = "Crystal Heart 7" +crystal_heart_8 = "Crystal Heart 8" +crystal_heart_9 = "Crystal Heart 9" +crystal_heart_10 = "Crystal Heart 10" +crystal_heart_11 = "Crystal Heart 11" +crystal_heart_12 = "Crystal Heart 12" +crystal_heart_13 = "Crystal Heart 13" +crystal_heart_14 = "Crystal Heart 14" +crystal_heart_15 = "Crystal Heart 15" +crystal_heart_16 = "Crystal Heart 16" diff --git a/worlds/celeste_open_world/Names/__init__.py b/worlds/celeste_open_world/Names/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/worlds/celeste_open_world/Options.py b/worlds/celeste_open_world/Options.py new file mode 100644 index 00000000..75e8928a --- /dev/null +++ b/worlds/celeste_open_world/Options.py @@ -0,0 +1,528 @@ +from dataclasses import dataclass +import random + +from Options import Choice, Range, DefaultOnToggle, Toggle, TextChoice, DeathLink, OptionGroup, PerGameCommonOptions, OptionError +from worlds.AutoWorld import World + + +class DeathLinkAmnesty(Range): + """ + How many deaths it takes to send a DeathLink + """ + display_name = "Death Link Amnesty" + range_start = 1 + range_end = 30 + default = 10 + +class TrapLink(Toggle): + """ + Whether your received traps are linked to other players + + You will also receive any linked traps from other players with Trap Link enabled, + if you have a weight above "none" set for that trap + """ + display_name = "Trap Link" + + +class GoalArea(Choice): + """ + What Area must be cleared to gain access to the Epilogue and complete the game + """ + display_name = "Goal Area" + option_the_summit_a = 0 + option_the_summit_b = 1 + option_the_summit_c = 2 + option_core_a = 3 + option_core_b = 4 + option_core_c = 5 + option_empty_space = 6 + option_farewell = 7 + option_farewell_golden = 8 + default = 0 + +class LockGoalArea(DefaultOnToggle): + """ + Determines whether your Goal Area will be locked until you receive your required Strawberries, or only the Epilogue + """ + display_name = "Lock Goal Area" + +class GoalAreaCheckpointsanity(Toggle): + """ + Determines whether the Checkpoints in your Goal Area will be shuffled into the item pool (if Checkpointsanity is active) + """ + display_name = "Goal Area Checkpointsanity" + +class TotalStrawberries(Range): + """ + Maximum number of how many Strawberries can exist + """ + display_name = "Total Strawberries" + range_start = 0 + range_end = 202 + default = 50 + +class StrawberriesRequiredPercentage(Range): + """ + Percentage of existing Strawberries you must receive to access your Goal Area (if Lock Goal Area is active) and the Epilogue + """ + display_name = "Strawberries Required Percentage" + range_start = 0 + range_end = 100 + default = 80 + + +class Checkpointsanity(Toggle): + """ + Determines whether Checkpoints will be shuffled into the item pool + """ + display_name = "Checkpointsanity" + +class Binosanity(Toggle): + """ + Determines whether using Binoculars sends location checks + """ + display_name = "Binosanity" + +class Keysanity(Toggle): + """ + Determines whether individual Keys are shuffled into the item pool + """ + display_name = "Keysanity" + +class Gemsanity(Toggle): + """ + Determines whether Summit Gems are shuffled into the item pool + """ + display_name = "Gemsanity" + +class Carsanity(Toggle): + """ + Determines whether riding on cars grants location checks + """ + display_name = "Carsanity" + +class Roomsanity(Toggle): + """ + Determines whether entering individual rooms sends location checks + """ + display_name = "Roomsanity" + +class IncludeGoldens(Toggle): + """ + Determines whether collecting Golden Strawberries sends location checks + """ + display_name = "Include Goldens" + + +class IncludeCore(Toggle): + """ + Determines whether Chapter 8 - Core Levels will be included + """ + display_name = "Include Core" + +class IncludeFarewell(Choice): + """ + Determines how much of Chapter 9 - Farewell Level will be included + """ + display_name = "Include Farewell" + option_none = 0 + option_empty_space = 1 + option_farewell = 2 + default = 0 + +class IncludeBSides(Toggle): + """ + Determines whether the B-Side Levels will be included + """ + display_name = "Include B-Sides" + +class IncludeCSides(Toggle): + """ + Determines whether the C-Side Levels will be included + """ + display_name = "Include C-Sides" + + +class JunkFillPercentage(Range): + """ + Replace a percentage of non-required Strawberries in the item pool with junk items + """ + display_name = "Junk Fill Percentage" + range_start = 0 + range_end = 100 + default = 50 + +class TrapFillPercentage(Range): + """ + Replace a percentage of junk items in the item pool with random traps + """ + display_name = "Trap Fill Percentage" + range_start = 0 + range_end = 100 + default = 0 + +class TrapExpirationAction(Choice): + """ + The type of action which causes traps to wear off + """ + display_name = "Trap Expiration Action" + option_return_to_menu = 0 + option_deaths = 1 + option_new_screens = 2 + default = 1 + +class TrapExpirationAmount(Range): + """ + The amount of the selected Trap Expiration Action that must occur for the trap to wear off + """ + display_name = "Trap Expiration Amount" + range_start = 1 + range_end = 10 + default = 5 + +class BaseTrapWeight(Choice): + """ + Base Class for Trap Weights + """ + option_none = 0 + option_low = 1 + option_medium = 2 + option_high = 4 + default = 2 + +class BaldTrapWeight(BaseTrapWeight): + """ + Likelihood of receiving a trap which makes Maddy bald + """ + display_name = "Bald Trap Weight" + +class LiteratureTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the player to read literature + """ + display_name = "Literature Trap Weight" + +class StunTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which briefly stuns Maddy + """ + display_name = "Stun Trap Weight" + +class InvisibleTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which turns Maddy invisible + """ + display_name = "Invisible Trap Weight" + +class FastTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which increases the game speed + """ + display_name = "Fast Trap Weight" + +class SlowTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which decreases the game speed + """ + display_name = "Slow Trap Weight" + +class IceTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the level to become slippery + """ + display_name = "Ice Trap Weight" + +class ReverseTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the controls to be reversed + """ + display_name = "Reverse Trap Weight" + +class ScreenFlipTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the screen to be flipped + """ + display_name = "Screen Flip Trap Weight" + +class LaughterTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes Maddy to laugh uncontrollably + """ + display_name = "Laughter Trap Weight" + +class HiccupTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes Maddy to hiccup uncontrollably + """ + display_name = "Hiccup Trap Weight" + +class ZoomTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the camera to focus on Maddy + """ + display_name = "Zoom Trap Weight" + + +class MusicShuffle(Choice): + """ + Music shuffle type + + None: No Music is shuffled + + Consistent: Each music track is consistently shuffled throughout the game + + Singularity: The entire game uses one song for levels + """ + display_name = "Music Shuffle" + option_none = 0 + option_consistent = 1 + option_singularity = 2 + default = 0 + +class RequireCassettes(Toggle): + """ + Determines whether you must receive a level's Cassette Item to hear that level's music + """ + display_name = "Require Cassettes" + + +class MadelineHairLength(Choice): + """ + How long Madeline's hair is + """ + display_name = "Madeline Hair Length" + option_very_short = 1 + option_short = 2 + option_default = 4 + option_long = 7 + option_very_long = 10 + option_absurd = 20 + default = 4 + + +class ColorChoice(TextChoice): + option_strawberry = 0xAC3232 + option_empty = 0x44B7FF + option_double = 0xFF6DEF + option_golden = 0xFFD65C + option_baddy = 0x9B3FB5 + option_fire_red = 0xFF0000 + option_maroon = 0x800000 + option_salmon = 0xFF3A65 + option_orange = 0xD86E0A + option_lime_green = 0x8DF920 + option_bright_green = 0x0DAF05 + option_forest_green = 0x132818 + option_royal_blue = 0x0036BF + option_brown = 0xB78726 + option_black = 0x000000 + option_white = 0xFFFFFF + option_grey = 0x808080 + option_any_color = -1 + + @classmethod + def from_text(cls, text: str) -> Choice: + text = text.lower() + if text == "random": + choice_list = list(cls.name_lookup) + choice_list.remove(cls.option_any_color) + return cls(random.choice(choice_list)) + return super().from_text(text) + + +class MadelineOneDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has one dash + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline One Dash Hair Color" + default = ColorChoice.option_strawberry + +class MadelineTwoDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has two dashes + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline Two Dash Hair Color" + default = ColorChoice.option_double + +class MadelineNoDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has no dashes + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline No Dash Hair Color" + default = ColorChoice.option_empty + +class MadelineFeatherHairColor(ColorChoice): + """ + What color Madeline's hair is when she has a feather + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline Feather Hair Color" + default = ColorChoice.option_golden + + + +celeste_option_groups = [ + OptionGroup("Goal Options", [ + GoalArea, + LockGoalArea, + GoalAreaCheckpointsanity, + TotalStrawberries, + StrawberriesRequiredPercentage, + ]), + OptionGroup("Location Options", [ + Checkpointsanity, + Binosanity, + Keysanity, + Gemsanity, + Carsanity, + Roomsanity, + IncludeGoldens, + IncludeCore, + IncludeFarewell, + IncludeBSides, + IncludeCSides, + ]), + OptionGroup("Junk and Traps", [ + JunkFillPercentage, + TrapFillPercentage, + TrapExpirationAction, + TrapExpirationAmount, + BaldTrapWeight, + LiteratureTrapWeight, + StunTrapWeight, + InvisibleTrapWeight, + FastTrapWeight, + SlowTrapWeight, + IceTrapWeight, + ReverseTrapWeight, + ScreenFlipTrapWeight, + LaughterTrapWeight, + HiccupTrapWeight, + ZoomTrapWeight, + ]), + OptionGroup("Aesthetic Options", [ + MusicShuffle, + RequireCassettes, + MadelineHairLength, + MadelineOneDashHairColor, + MadelineTwoDashHairColor, + MadelineNoDashHairColor, + MadelineFeatherHairColor, + ]), +] + + +def resolve_options(world: World): + # One Dash Hair + if isinstance(world.options.madeline_one_dash_hair_color.value, str): + try: + world.madeline_one_dash_hair_color = int(world.options.madeline_one_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_one_dash_hair_color`:" + f"{world.options.madeline_one_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_one_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_one_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_one_dash_hair_color = world.options.madeline_one_dash_hair_color.value + + # Two Dash Hair + if isinstance(world.options.madeline_two_dash_hair_color.value, str): + try: + world.madeline_two_dash_hair_color = int(world.options.madeline_two_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_two_dash_hair_color`:" + f"{world.options.madeline_two_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_two_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_two_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_two_dash_hair_color = world.options.madeline_two_dash_hair_color.value + + # No Dash Hair + if isinstance(world.options.madeline_no_dash_hair_color.value, str): + try: + world.madeline_no_dash_hair_color = int(world.options.madeline_no_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_no_dash_hair_color`:" + f"{world.options.madeline_no_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_no_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_no_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_no_dash_hair_color = world.options.madeline_no_dash_hair_color.value + + # Feather Hair + if isinstance(world.options.madeline_feather_hair_color.value, str): + try: + world.madeline_feather_hair_color = int(world.options.madeline_feather_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_feather_hair_color`:" + f"{world.options.madeline_feather_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_feather_hair_color.value == ColorChoice.option_any_color: + world.madeline_feather_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_feather_hair_color = world.options.madeline_feather_hair_color.value + + +@dataclass +class CelesteOptions(PerGameCommonOptions): + death_link: DeathLink + death_link_amnesty: DeathLinkAmnesty + trap_link: TrapLink + + goal_area: GoalArea + lock_goal_area: LockGoalArea + goal_area_checkpointsanity: GoalAreaCheckpointsanity + total_strawberries: TotalStrawberries + strawberries_required_percentage: StrawberriesRequiredPercentage + + junk_fill_percentage: JunkFillPercentage + trap_fill_percentage: TrapFillPercentage + trap_expiration_action: TrapExpirationAction + trap_expiration_amount: TrapExpirationAmount + bald_trap_weight: BaldTrapWeight + literature_trap_weight: LiteratureTrapWeight + stun_trap_weight: StunTrapWeight + invisible_trap_weight: InvisibleTrapWeight + fast_trap_weight: FastTrapWeight + slow_trap_weight: SlowTrapWeight + ice_trap_weight: IceTrapWeight + reverse_trap_weight: ReverseTrapWeight + screen_flip_trap_weight: ScreenFlipTrapWeight + laughter_trap_weight: LaughterTrapWeight + hiccup_trap_weight: HiccupTrapWeight + zoom_trap_weight: ZoomTrapWeight + + checkpointsanity: Checkpointsanity + binosanity: Binosanity + keysanity: Keysanity + gemsanity: Gemsanity + carsanity: Carsanity + roomsanity: Roomsanity + include_goldens: IncludeGoldens + include_core: IncludeCore + include_farewell: IncludeFarewell + include_b_sides: IncludeBSides + include_c_sides: IncludeCSides + + music_shuffle: MusicShuffle + require_cassettes: RequireCassettes + + madeline_hair_length: MadelineHairLength + madeline_one_dash_hair_color: MadelineOneDashHairColor + madeline_two_dash_hair_color: MadelineTwoDashHairColor + madeline_no_dash_hair_color: MadelineNoDashHairColor + madeline_feather_hair_color: MadelineFeatherHairColor diff --git a/worlds/celeste_open_world/__init__.py b/worlds/celeste_open_world/__init__.py new file mode 100644 index 00000000..38c3778e --- /dev/null +++ b/worlds/celeste_open_world/__init__.py @@ -0,0 +1,351 @@ +from copy import deepcopy +import math + +from BaseClasses import ItemClassification, Location, MultiWorld, Region, Tutorial +from Utils import visualize_regions +from worlds.AutoWorld import WebWorld, World + +from .Items import CelesteItem, generate_item_table, generate_item_data_table, generate_item_groups, level_item_lists, level_cassette_items,\ + cassette_item_data_table, crystal_heart_item_data_table, trap_item_data_table +from .Locations import CelesteLocation, location_data_table, generate_location_groups, checkpoint_location_data_table, location_id_offsets +from .Names import ItemName +from .Options import CelesteOptions, celeste_option_groups, resolve_options +from .Levels import Level, LocationType, load_logic_data, goal_area_option_to_name, goal_area_option_to_display_name, goal_area_to_location_name + + +class CelesteOpenWebWorld(WebWorld): + theme = "ice" + + setup_en = Tutorial( + tutorial_name="Start Guide", + description="A guide to playing Celeste (Open World) in Archipelago.", + language="English", + file_name="guide_en.md", + link="guide/en", + authors=["PoryGone"] + ) + + tutorials = [setup_en] + + option_groups = celeste_option_groups + + +class CelesteOpenWorld(World): + """ + Celeste (Open World) is a randomizer for the original Celeste. In this acclaimed platformer created by ExOK Games, you control Madeline as she attempts to climb the titular mountain, meeting friends and obstacles along the way. Progression is found in unlocking the ability to interact with various objects in the areas, such as springs, traffic blocks, feathers, and many more. Please be safe on the climb. + """ + + # Class Data + game = "Celeste (Open World)" + web = CelesteOpenWebWorld() + options_dataclass = CelesteOptions + options: CelesteOptions + + level_data: dict[str, Level] = load_logic_data() + + location_name_to_id: dict[str, int] = location_data_table + location_name_groups: dict[str, list[str]] = generate_location_groups() + item_name_to_id: dict[str, int] = generate_item_table() + item_name_groups: dict[str, list[str]] = generate_item_groups() + + + # Instance Data + madeline_one_dash_hair_color: int + madeline_two_dash_hair_color: int + madeline_no_dash_hair_color: int + madeline_feather_hair_color: int + + active_levels: set[str] + active_items: set[str] + + + def generate_early(self) -> None: + if not self.player_name.isascii(): + raise RuntimeError(f"Invalid player_name {self.player_name} for game {self.game}. Name must be ascii.") + + resolve_options(self) + + self.goal_area: str = goal_area_option_to_name[self.options.goal_area.value] + + self.active_levels = {"0a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a"} + if self.options.include_core: + self.active_levels.add("9a") + if self.options.include_farewell >= 1: + self.active_levels.add("10a") + if self.options.include_farewell == 2: + self.active_levels.add("10b") + if self.options.include_b_sides: + self.active_levels.update({"1b", "2b", "3b", "4b", "5b", "6b", "7b"}) + if self.options.include_core: + self.active_levels.add("9b") + if self.options.include_c_sides: + self.active_levels.update({"1c", "2c", "3c", "4c", "5c", "6c", "7c"}) + if self.options.include_core: + self.active_levels.add("9c") + + self.active_levels.add(self.goal_area) + if self.goal_area == "10c": + self.active_levels.add("10a") + self.active_levels.add("10b") + elif self.goal_area == "10b": + self.active_levels.add("10a") + + self.active_items = set() + for level in self.active_levels: + self.active_items.update(level_item_lists[level]) + + + def create_regions(self) -> None: + from .Locations import create_regions_and_locations + + create_regions_and_locations(self) + + + def create_item(self, name: str, force_useful: bool = False) -> CelesteItem: + item_data_table = generate_item_data_table() + + if name == ItemName.strawberry and force_useful: + return CelesteItem(name, ItemClassification.useful, item_data_table[name].code, self.player) + elif name in item_data_table: + return CelesteItem(name, item_data_table[name].type, item_data_table[name].code, self.player) + else: + return CelesteItem(name, ItemClassification.progression, None, self.player) + + def create_items(self) -> None: + item_pool: list[CelesteItem] = [] + + location_count: int = len(self.get_locations()) + goal_area_location_count: int = sum(goal_area_option_to_display_name[self.options.goal_area] in loc.name for loc in self.get_locations()) + + # Goal Items + goal_item_loc: Location = self.get_location(goal_area_to_location_name[self.goal_area]) + goal_item_loc.place_locked_item(self.create_item(ItemName.house_keys)) + location_count -= 1 + + epilogue_region: Region = self.get_region(self.epilogue_start_region) + epilogue_region.add_locations({ItemName.victory: None }, CelesteLocation) + victory_loc: Location = self.get_location(ItemName.victory) + victory_loc.place_locked_item(self.create_item(ItemName.victory)) + + # Checkpoints + for item_name in self.active_checkpoint_names: + if self.options.checkpointsanity: + if not self.options.goal_area_checkpointsanity and goal_area_option_to_display_name[self.options.goal_area] in item_name: + checkpoint_loc: Location = self.get_location(item_name) + checkpoint_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + else: + item_pool.append(self.create_item(item_name)) + else: + checkpoint_loc: Location = self.get_location(item_name) + checkpoint_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Keys + if self.options.keysanity: + item_pool += [self.create_item(item_name) for item_name in self.active_key_names] + else: + for item_name in self.active_key_names: + key_loc: Location = self.get_location(item_name) + key_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Summit Gems + if self.options.gemsanity: + item_pool += [self.create_item(item_name) for item_name in self.active_gem_names] + else: + for item_name in self.active_gem_names: + gem_loc: Location = self.get_location(item_name) + gem_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Clutter Events + for item_name in self.active_clutter_names: + clutter_loc: Location = self.get_location(item_name) + clutter_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Interactables + item_pool += [self.create_item(item_name) for item_name in sorted(self.active_items)] + + # Strawberries + real_total_strawberries: int = min(self.options.total_strawberries.value, location_count - goal_area_location_count - len(item_pool)) + self.strawberries_required = int(real_total_strawberries * (self.options.strawberries_required_percentage / 100)) + + menu_region = self.get_region("Menu") + if getattr(self, "goal_start_region", None): + menu_region.add_exits([self.goal_start_region], {self.goal_start_region: lambda state: state.has(ItemName.strawberry, self.player, self.strawberries_required)}) + if getattr(self, "goal_checkpoint_names", None): + for region_name, location_name in self.goal_checkpoint_names.items(): + checkpoint_rule = lambda state, location_name=location_name: state.has(location_name, self.player) and state.has(ItemName.strawberry, self.player, self.strawberries_required) + menu_region.add_exits([region_name], {region_name: checkpoint_rule}) + + menu_region.add_exits([self.epilogue_start_region], {self.epilogue_start_region: lambda state: (state.has(ItemName.strawberry, self.player, self.strawberries_required) and state.has(ItemName.house_keys, self.player))}) + + item_pool += [self.create_item(ItemName.strawberry) for _ in range(self.strawberries_required)] + + # Filler and Traps + non_required_strawberries = (real_total_strawberries - self.strawberries_required) + replacement_filler_count = math.floor(non_required_strawberries * (self.options.junk_fill_percentage.value / 100.0)) + remaining_extra_strawberries = non_required_strawberries - replacement_filler_count + item_pool += [self.create_item(ItemName.strawberry, True) for _ in range(remaining_extra_strawberries)] + + trap_weights = [] + trap_weights += ([ItemName.bald_trap] * self.options.bald_trap_weight.value) + trap_weights += ([ItemName.literature_trap] * self.options.literature_trap_weight.value) + trap_weights += ([ItemName.stun_trap] * self.options.stun_trap_weight.value) + trap_weights += ([ItemName.invisible_trap] * self.options.invisible_trap_weight.value) + trap_weights += ([ItemName.fast_trap] * self.options.fast_trap_weight.value) + trap_weights += ([ItemName.slow_trap] * self.options.slow_trap_weight.value) + trap_weights += ([ItemName.ice_trap] * self.options.ice_trap_weight.value) + trap_weights += ([ItemName.reverse_trap] * self.options.reverse_trap_weight.value) + trap_weights += ([ItemName.screen_flip_trap] * self.options.screen_flip_trap_weight.value) + trap_weights += ([ItemName.laughter_trap] * self.options.laughter_trap_weight.value) + trap_weights += ([ItemName.hiccup_trap] * self.options.hiccup_trap_weight.value) + trap_weights += ([ItemName.zoom_trap] * self.options.zoom_trap_weight.value) + + total_filler_count: int = (location_count - len(item_pool)) + + # Cassettes + if self.options.require_cassettes: + shuffled_active_levels = sorted(self.active_levels) + self.random.shuffle(shuffled_active_levels) + for level_name in shuffled_active_levels: + if level_name == "10b" or level_name == "10c": + continue + if level_name not in self.multiworld.precollected_items[self.player]: + if total_filler_count > 0: + item_pool.append(self.create_item(level_cassette_items[level_name])) + total_filler_count -= 1 + else: + self.multiworld.push_precollected(self.create_item(level_cassette_items[level_name])) + + # Crystal Hearts + for name in crystal_heart_item_data_table.keys(): + if total_filler_count > 0: + if name not in self.multiworld.precollected_items[self.player]: + item_pool.append(self.create_item(name)) + total_filler_count -= 1 + + trap_count = 0 if (len(trap_weights) == 0) else math.ceil(total_filler_count * (self.options.trap_fill_percentage.value / 100.0)) + total_filler_count -= trap_count + + item_pool += [self.create_item(ItemName.raspberry) for _ in range(total_filler_count)] + + trap_pool = [] + for i in range(trap_count): + trap_item = self.random.choice(trap_weights) + trap_pool.append(self.create_item(trap_item)) + + item_pool += trap_pool + + self.multiworld.itempool += item_pool + + def get_filler_item_name(self) -> str: + return ItemName.raspberry + + + def set_rules(self) -> None: + self.multiworld.completion_condition[self.player] = lambda state: state.has(ItemName.victory, self.player) + + + def fill_slot_data(self): + return { + "apworld_version": 10004, + "min_mod_version": 10000, + + "death_link": self.options.death_link.value, + "death_link_amnesty": self.options.death_link_amnesty.value, + "trap_link": self.options.trap_link.value, + + "active_levels": self.active_levels, + "goal_area": self.goal_area, + "lock_goal_area": self.options.lock_goal_area.value, + "strawberries_required": self.strawberries_required, + + "checkpointsanity": self.options.checkpointsanity.value, + "binosanity": self.options.binosanity.value, + "keysanity": self.options.keysanity.value, + "gemsanity": self.options.gemsanity.value, + "carsanity": self.options.carsanity.value, + "roomsanity": self.options.roomsanity.value, + "include_goldens": self.options.include_goldens.value, + + "include_core": self.options.include_core.value, + "include_farewell": self.options.include_farewell.value, + "include_b_sides": self.options.include_b_sides.value, + "include_c_sides": self.options.include_c_sides.value, + + "trap_expiration_action": self.options.trap_expiration_action.value, + "trap_expiration_amount": self.options.trap_expiration_amount.value, + "active_traps": self.output_active_traps(), + + "madeline_hair_length": self.options.madeline_hair_length.value, + "madeline_one_dash_hair_color": self.madeline_one_dash_hair_color, + "madeline_two_dash_hair_color": self.madeline_two_dash_hair_color, + "madeline_no_dash_hair_color": self.madeline_no_dash_hair_color, + "madeline_feather_hair_color": self.madeline_feather_hair_color, + + "music_shuffle": self.options.music_shuffle.value, + "music_map": self.generate_music_data(), + "require_cassettes": self.options.require_cassettes.value, + "chosen_poem": self.random.randint(0, 119), + } + + def output_active_traps(self) -> dict[int, int]: + trap_data = {} + + trap_data[0x20] = self.options.bald_trap_weight.value + trap_data[0x21] = self.options.literature_trap_weight.value + trap_data[0x22] = self.options.stun_trap_weight.value + trap_data[0x23] = self.options.invisible_trap_weight.value + trap_data[0x24] = self.options.fast_trap_weight.value + trap_data[0x25] = self.options.slow_trap_weight.value + trap_data[0x26] = self.options.ice_trap_weight.value + trap_data[0x28] = self.options.reverse_trap_weight.value + trap_data[0x29] = self.options.screen_flip_trap_weight.value + trap_data[0x2A] = self.options.laughter_trap_weight.value + trap_data[0x2B] = self.options.hiccup_trap_weight.value + trap_data[0x2C] = self.options.zoom_trap_weight.value + + return trap_data + + def generate_music_data(self) -> dict[int, int]: + if self.options.music_shuffle == "consistent": + musiclist_o = list(range(0, 48)) + musiclist_s = musiclist_o.copy() + self.random.shuffle(musiclist_s) + + return dict(zip(musiclist_o, musiclist_s)) + elif self.options.music_shuffle == "singularity": + musiclist_o = list(range(0, 48)) + musiclist_s = [self.random.choice(musiclist_o)] * len(musiclist_o) + + return dict(zip(musiclist_o, musiclist_s)) + else: + musiclist_o = list(range(0, 48)) + musiclist_s = musiclist_o.copy() + + return dict(zip(musiclist_o, musiclist_s)) + + + # Useful Debugging tools, kept around for later. + #@classmethod + #def stage_assert_generate(cls, _multiworld: MultiWorld) -> None: + # with open("./worlds/celeste_open_world/data/IDs.txt", "w") as f: + # print("Items:", file=f) + # for name in sorted(CelesteOpenWorld.item_name_to_id, key=CelesteOpenWorld.item_name_to_id.get): + # id = CelesteOpenWorld.item_name_to_id[name] + # print(f"{{ 0x{id:X}, \"{name}\" }},", file=f) + # print("\nLocations:", file=f) + # for name in sorted(CelesteOpenWorld.location_name_to_id, key=CelesteOpenWorld.location_name_to_id.get): + # id = CelesteOpenWorld.location_name_to_id[name] + # print(f"{{ 0x{id:X}, \"{name}\" }},", file=f) + # print("\nLocations 2:", file=f) + # for name in sorted(CelesteOpenWorld.location_name_to_id, key=CelesteOpenWorld.location_name_to_id.get): + # id = CelesteOpenWorld.location_name_to_id[name] + # print(f"{{ \"{name}\", 0x{id:X} }},", file=f) + # + #def generate_output(self, output_directory: str): + # visualize_regions(self.get_region("Menu"), f"Player{self.player}.puml", show_entrance_names=False, + # regions_to_highlight=self.multiworld.get_all_state(self.player).reachable_regions[self.player]) diff --git a/worlds/celeste_open_world/data/CelesteLevelData.json b/worlds/celeste_open_world/data/CelesteLevelData.json new file mode 100644 index 00000000..5b4edd9b --- /dev/null +++ b/worlds/celeste_open_world/data/CelesteLevelData.json @@ -0,0 +1,41232 @@ +{ + "levels": [ + { + "name": "0a", + "display_name": "Prologue", + "rooms": [ + { + "name": "-1", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "car", + "display_name": "Car", + "type": "car", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "0b", + "regions": [ + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "-1", + "source_door": "east", + "dest_room": "0", + "dest_door": "west" + }, + { + "source_room": "0", + "source_door": "north", + "dest_room": "0b", + "dest_door": "south" + }, + { + "source_room": "0", + "source_door": "east", + "dest_room": "1", + "dest_door": "west" + }, + { + "source_room": "1", + "source_door": "east", + "dest_room": "2", + "dest_door": "west" + }, + { + "source_room": "2", + "source_door": "east", + "dest_room": "3", + "dest_door": "west" + } + ] + }, + { + "name": "1a", + "display_name": "Forsaken City A", + "rooms": [ + { + "name": "1", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5a", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Crossing", + "checkpoint_region": "south-west" + }, + { + "name": "6z", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6zb", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7zb", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6b", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s0", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s1", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + }, + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8zb", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7a", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Chasm", + "checkpoint_region": "west" + }, + { + "name": "9c", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10z", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10zb", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10a", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12a", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills" ] ] + }, + { + "name": "winged_golden", + "display_name": "Winged Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "1", + "source_door": "east", + "dest_room": "2", + "dest_door": "west" + }, + { + "source_room": "2", + "source_door": "east", + "dest_room": "3", + "dest_door": "west" + }, + { + "source_room": "3", + "source_door": "east", + "dest_room": "4", + "dest_door": "west" + }, + { + "source_room": "4", + "source_door": "east", + "dest_room": "3b", + "dest_door": "west" + }, + { + "source_room": "3b", + "source_door": "top", + "dest_room": "5", + "dest_door": "bottom" + }, + { + "source_room": "5", + "source_door": "west", + "dest_room": "5z", + "dest_door": "east" + }, + { + "source_room": "5", + "source_door": "south-east", + "dest_room": "5a", + "dest_door": "west" + }, + { + "source_room": "5", + "source_door": "top", + "dest_room": "6", + "dest_door": "south-west" + }, + { + "source_room": "6", + "source_door": "west", + "dest_room": "6z", + "dest_door": "east" + }, + { + "source_room": "6", + "source_door": "east", + "dest_room": "6a", + "dest_door": "west" + }, + { + "source_room": "6z", + "source_door": "north-west", + "dest_room": "7zb", + "dest_door": "east" + }, + { + "source_room": "6z", + "source_door": "west", + "dest_room": "6zb", + "dest_door": "east" + }, + { + "source_room": "7zb", + "source_door": "west", + "dest_room": "6zb", + "dest_door": "north-west" + }, + { + "source_room": "6a", + "source_door": "east", + "dest_room": "6b", + "dest_door": "south-west" + }, + { + "source_room": "6b", + "source_door": "north-west", + "dest_room": "s0", + "dest_door": "east" + }, + { + "source_room": "6b", + "source_door": "north-east", + "dest_room": "6c", + "dest_door": "south-west" + }, + { + "source_room": "s0", + "source_door": "west", + "dest_room": "s1", + "dest_door": "east" + }, + { + "source_room": "6c", + "source_door": "north-west", + "dest_room": "7z", + "dest_door": "bottom" + }, + { + "source_room": "6c", + "source_door": "north-east", + "dest_room": "7", + "dest_door": "west" + }, + { + "source_room": "7", + "source_door": "east", + "dest_room": "8", + "dest_door": "south-west" + }, + { + "source_room": "7z", + "source_door": "top", + "dest_room": "8z", + "dest_door": "bottom" + }, + { + "source_room": "8z", + "source_door": "top", + "dest_room": "8zb", + "dest_door": "west" + }, + { + "source_room": "8zb", + "source_door": "east", + "dest_room": "8", + "dest_door": "west" + }, + { + "source_room": "8", + "source_door": "south", + "dest_room": "7a", + "dest_door": "west" + }, + { + "source_room": "8", + "source_door": "north", + "dest_room": "9z", + "dest_door": "east" + }, + { + "source_room": "8", + "source_door": "north-east", + "dest_room": "8b", + "dest_door": "west" + }, + { + "source_room": "7a", + "source_door": "east", + "dest_room": "8", + "dest_door": "south-east" + }, + { + "source_room": "8b", + "source_door": "east", + "dest_room": "9", + "dest_door": "west" + }, + { + "source_room": "9", + "source_door": "east", + "dest_room": "9b", + "dest_door": "west" + }, + { + "source_room": "9b", + "source_door": "north-west", + "dest_room": "10", + "dest_door": "south-east" + }, + { + "source_room": "9b", + "source_door": "north-east", + "dest_room": "10a", + "dest_door": "bottom" + }, + { + "source_room": "9b", + "source_door": "east", + "dest_room": "9c", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "south-west", + "dest_room": "10z", + "dest_door": "east" + }, + { + "source_room": "10", + "source_door": "north-west", + "dest_room": "11", + "dest_door": "south-west" + }, + { + "source_room": "10z", + "source_door": "west", + "dest_room": "10zb", + "dest_door": "east" + }, + { + "source_room": "11", + "source_door": "south", + "dest_room": "10", + "dest_door": "north-east" + }, + { + "source_room": "11", + "source_door": "west", + "dest_room": "11z", + "dest_door": "east" + }, + { + "source_room": "10a", + "source_door": "top", + "dest_room": "11", + "dest_door": "south-east" + }, + { + "source_room": "11", + "source_door": "north", + "dest_room": "12", + "dest_door": "south-west" + }, + { + "source_room": "12", + "source_door": "north-west", + "dest_room": "12z", + "dest_door": "east" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "12a", + "dest_door": "bottom" + }, + { + "source_room": "12a", + "source_door": "top", + "dest_room": "end", + "dest_door": "south" + } + ] + }, + { + "name": "1b", + "display_name": "Forsaken City B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Contraption", + "checkpoint_region": "west" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Scrap Pit", + "checkpoint_region": "west" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "02b", + "dest_door": "west" + }, + { + "source_room": "02b", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "05b", + "dest_door": "west" + }, + { + "source_room": "05b", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "bottom" + }, + { + "source_room": "07", + "source_door": "top", + "dest_room": "08", + "dest_door": "west" + }, + { + "source_room": "08", + "source_door": "east", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "bottom" + }, + { + "source_room": "11", + "source_door": "top", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "1c", + "display_name": "Forsaken City C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "traffic_blocks", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "2a", + "display_name": "Old Site A", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "s0", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s1", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s2", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "1", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d0", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south-east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d7", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d8", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d9", + "regions": [ + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "dream_blocks", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d1", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks", "strawberry_seeds" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d6", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks", "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d5", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3x", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Intervention", + "checkpoint_region": "bottom" + }, + { + "name": "4", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "coins" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "2", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12c", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12d", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "phone", + "rule": [] + } + ] + }, + { + "name": "phone", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "phone", + "direction": "special", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_0", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "main", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_s0", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_s1", + "regions": [ + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_2", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Awake", + "checkpoint_region": "west" + }, + { + "name": "end_4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "springs" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3cb", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3c", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_5", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_6", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dream_blocks", "coins", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "top", + "dest_room": "s0", + "dest_door": "bottom" + }, + { + "source_room": "start", + "source_door": "east", + "dest_room": "0", + "dest_door": "south-west" + }, + { + "source_room": "s0", + "source_door": "top", + "dest_room": "s1", + "dest_door": "bottom" + }, + { + "source_room": "s1", + "source_door": "top", + "dest_room": "s2", + "dest_door": "bottom" + }, + { + "source_room": "0", + "source_door": "north-west", + "dest_room": "3x", + "dest_door": "bottom" + }, + { + "source_room": "0", + "source_door": "north-east", + "dest_room": "1", + "dest_door": "north-west" + }, + { + "source_room": "0", + "source_door": "south-east", + "dest_room": "1", + "dest_door": "south-west" + }, + { + "source_room": "1", + "source_door": "south", + "dest_room": "d0", + "dest_door": "north" + }, + { + "source_room": "1", + "source_door": "south-east", + "dest_room": "2", + "dest_door": "south-west" + }, + { + "source_room": "d0", + "source_door": "north-west", + "dest_room": "d1", + "dest_door": "north-east" + }, + { + "source_room": "d0", + "source_door": "west", + "dest_room": "d1", + "dest_door": "south-east" + }, + { + "source_room": "d0", + "source_door": "south-west", + "dest_room": "d6", + "dest_door": "east" + }, + { + "source_room": "d0", + "source_door": "south", + "dest_room": "d9", + "dest_door": "north-west" + }, + { + "source_room": "d0", + "source_door": "south-east", + "dest_room": "d7", + "dest_door": "west" + }, + { + "source_room": "d0", + "source_door": "east", + "dest_room": "d2", + "dest_door": "west" + }, + { + "source_room": "d0", + "source_door": "north-east", + "dest_room": "d4", + "dest_door": "west" + }, + { + "source_room": "d1", + "source_door": "south-west", + "dest_room": "d6", + "dest_door": "west" + }, + { + "source_room": "d7", + "source_door": "east", + "dest_room": "d8", + "dest_door": "west" + }, + { + "source_room": "d2", + "source_door": "east", + "dest_room": "d3", + "dest_door": "north" + }, + { + "source_room": "d4", + "source_door": "east", + "dest_room": "d5", + "dest_door": "west" + }, + { + "source_room": "d4", + "source_door": "south", + "dest_room": "d2", + "dest_door": "north-west" + }, + { + "source_room": "d8", + "source_door": "north-east", + "dest_room": "d3", + "dest_door": "west" + }, + { + "source_room": "d8", + "source_door": "south-east", + "dest_room": "d3", + "dest_door": "south" + }, + { + "source_room": "3x", + "source_door": "top", + "dest_room": "3", + "dest_door": "bottom" + }, + { + "source_room": "3", + "source_door": "top", + "dest_room": "4", + "dest_door": "bottom" + }, + { + "source_room": "4", + "source_door": "top", + "dest_room": "5", + "dest_door": "bottom" + }, + { + "source_room": "5", + "source_door": "top", + "dest_room": "6", + "dest_door": "bottom" + }, + { + "source_room": "6", + "source_door": "top", + "dest_room": "7", + "dest_door": "bottom" + }, + { + "source_room": "7", + "source_door": "top", + "dest_room": "8", + "dest_door": "bottom" + }, + { + "source_room": "8", + "source_door": "top", + "dest_room": "9", + "dest_door": "west" + }, + { + "source_room": "9", + "source_door": "north", + "dest_room": "9b", + "dest_door": "east" + }, + { + "source_room": "9", + "source_door": "south-east", + "dest_room": "10", + "dest_door": "top" + }, + { + "source_room": "9b", + "source_door": "west", + "dest_room": "9", + "dest_door": "north-west" + }, + { + "source_room": "10", + "source_door": "bottom", + "dest_room": "2", + "dest_door": "north-west" + }, + { + "source_room": "2", + "source_door": "south-east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "12b", + "dest_door": "west" + }, + { + "source_room": "12b", + "source_door": "north", + "dest_room": "12c", + "dest_door": "south" + }, + { + "source_room": "12b", + "source_door": "south", + "dest_room": "12d", + "dest_door": "north-west" + }, + { + "source_room": "12b", + "source_door": "east", + "dest_room": "12", + "dest_door": "west" + }, + { + "source_room": "12d", + "source_door": "north", + "dest_room": "12b", + "dest_door": "south-east" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "phone", + "dest_room": "end_0", + "dest_door": "main" + }, + { + "source_room": "end_0", + "source_door": "top", + "dest_room": "end_s0", + "dest_door": "bottom" + }, + { + "source_room": "end_0", + "source_door": "east", + "dest_room": "end_1", + "dest_door": "west" + }, + { + "source_room": "end_s0", + "source_door": "top", + "dest_room": "end_s1", + "dest_door": "bottom" + }, + { + "source_room": "end_1", + "source_door": "east", + "dest_room": "end_2", + "dest_door": "west" + }, + { + "source_room": "end_1", + "source_door": "north-east", + "dest_room": "end_2", + "dest_door": "north-west" + }, + { + "source_room": "end_2", + "source_door": "east", + "dest_room": "end_3", + "dest_door": "west" + }, + { + "source_room": "end_2", + "source_door": "north-east", + "dest_room": "end_3", + "dest_door": "north-west" + }, + { + "source_room": "end_3", + "source_door": "east", + "dest_room": "end_4", + "dest_door": "west" + }, + { + "source_room": "end_4", + "source_door": "east", + "dest_room": "end_3b", + "dest_door": "west" + }, + { + "source_room": "end_3b", + "source_door": "north", + "dest_room": "end_3cb", + "dest_door": "bottom" + }, + { + "source_room": "end_3b", + "source_door": "east", + "dest_room": "end_5", + "dest_door": "west" + }, + { + "source_room": "end_3cb", + "source_door": "top", + "dest_room": "end_3c", + "dest_door": "bottom" + }, + { + "source_room": "end_5", + "source_door": "east", + "dest_room": "end_6", + "dest_door": "west" + } + ] + }, + { + "name": "2b", + "display_name": "Old Site B", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Combination Lock", + "checkpoint_region": "west" + }, + { + "name": "04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Dream Altar", + "checkpoint_region": "west" + }, + { + "name": "08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dream_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dream_blocks", "dash_refills", "coins", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "east", + "dest_room": "00", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "01b", + "dest_door": "west" + }, + { + "source_room": "01b", + "source_door": "east", + "dest_room": "02b", + "dest_door": "west" + }, + { + "source_room": "02b", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "bottom" + }, + { + "source_room": "04", + "source_door": "top", + "dest_room": "05", + "dest_door": "bottom" + }, + { + "source_room": "05", + "source_door": "top", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "bottom" + }, + { + "source_room": "07", + "source_door": "top", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "08", + "dest_door": "west" + }, + { + "source_room": "08", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "bottom" + }, + { + "source_room": "11", + "source_door": "top", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "2c", + "display_name": "Old Site C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "dream_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dream_blocks", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "3a", + "display_name": "Celestial Resort A", + "rooms": [ + { + "name": "s0", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "s1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Front Door Key" ] ] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Front Door Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0x-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [ + [ "sinking_platforms" ], + [ "dash_refills" ] + ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "main", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "Hallway Key 1" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "hallway_key_1", + "display_name": "Hallway Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "far-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "far-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-b", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0x-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Hallway Key 2", "dash_refills" ] ] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "Hallway Key 2", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07-b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Hallway Key 2", + "type": "key", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05-c", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "moving_platforms", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + } + ] + }, + { + "name": "bottom", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Huge Mess", + "checkpoint_region": "west" + }, + { + "name": "09-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [ [ "Huge Mess Key" ] ] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "Huge Mess Key" ] ] + }, + { + "dest": "south-west", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east-right", + "rule": [] + }, + { + "dest": "north-east-top", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "key_4", + "display_name": "Huge Mess Key", + "type": "key", + "rule": [ [ "brown_clutter", "green_clutter", "pink_clutter" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east-right", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east-top", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "brown_clutter" ] ] + } + ], + "locations": [ + { + "name": "brown_clutter", + "display_name": "Brown Clutter", + "type": "clutter", + "rule": [] + } + ] + }, + { + "name": "north-east-top", + "connections": [ + { + "dest": "north-east-right", + "rule": [] + } + ] + }, + { + "name": "north-east-right", + "connections": [ + { + "dest": "north-east-top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east-top", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east-right", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-y", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-y", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-z", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-y", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-c", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-d", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [ [ "green_clutter" ] ] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "green_clutter", + "display_name": "Green Clutter", + "type": "clutter", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clutter" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-b", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "pink_clutter", + "display_name": "Pink Clutter", + "type": "clutter", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east-bottom", + "connections": [ + { + "dest": "south-east-right", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-bottom", + "rule": [ [ "pink_clutter" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east-bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09-d", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Elevator Shaft", + "checkpoint_region": "bottom" + }, + { + "name": "08-d", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-d", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "Presidential Suite Key" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "Presidential Suite Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_5", + "display_name": "Presidential Suite Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01-c", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Presidential Suite", + "checkpoint_region": "east" + }, + { + "name": "roof00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof06b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "Front Door Key", "Hallway Key 1", "Hallway Key 2", "Huge Mess Key", "Presidential Suite Key", "sinking_platforms", "dash_refills", "brown_clutter", "green_clutter", "pink_clutter", "coins", "moving_platforms", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "s0", + "source_door": "east", + "dest_room": "s1", + "dest_door": "west" + }, + { + "source_room": "s1", + "source_door": "east", + "dest_room": "s2", + "dest_door": "west" + }, + { + "source_room": "s1", + "source_door": "north-east", + "dest_room": "s2", + "dest_door": "north-west" + }, + { + "source_room": "s2", + "source_door": "east", + "dest_room": "s3", + "dest_door": "west" + }, + { + "source_room": "s3", + "source_door": "east", + "dest_room": "0x-a", + "dest_door": "west" + }, + { + "source_room": "0x-a", + "source_door": "east", + "dest_room": "00-a", + "dest_door": "west" + }, + { + "source_room": "00-a", + "source_door": "east", + "dest_room": "02-a", + "dest_door": "west" + }, + { + "source_room": "02-a", + "source_door": "east", + "dest_room": "03-a", + "dest_door": "west" + }, + { + "source_room": "02-a", + "source_door": "top", + "dest_room": "02-b", + "dest_door": "east" + }, + { + "source_room": "02-b", + "source_door": "west", + "dest_room": "01-b", + "dest_door": "east" + }, + { + "source_room": "01-b", + "source_door": "north-west", + "dest_room": "00-b", + "dest_door": "east" + }, + { + "source_room": "01-b", + "source_door": "west", + "dest_room": "00-b", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "south-west", + "dest_room": "0x-b", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "north", + "dest_room": "00-c", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "west", + "dest_room": "0x-b", + "dest_door": "north-east" + }, + { + "source_room": "00-c", + "source_door": "south-west", + "dest_room": "00-b", + "dest_door": "north-west" + }, + { + "source_room": "00-c", + "source_door": "north-east", + "dest_room": "01-c", + "dest_door": "west" + }, + { + "source_room": "0x-b", + "source_door": "west", + "dest_room": "s3", + "dest_door": "north" + }, + { + "source_room": "03-a", + "source_door": "top", + "dest_room": "04-b", + "dest_door": "east" + }, + { + "source_room": "03-a", + "source_door": "east", + "dest_room": "05-a", + "dest_door": "west" + }, + { + "source_room": "05-a", + "source_door": "east", + "dest_room": "06-a", + "dest_door": "west" + }, + { + "source_room": "06-a", + "source_door": "east", + "dest_room": "07-a", + "dest_door": "west" + }, + { + "source_room": "07-a", + "source_door": "top", + "dest_room": "07-b", + "dest_door": "bottom" + }, + { + "source_room": "07-a", + "source_door": "east", + "dest_room": "08-a", + "dest_door": "west" + }, + { + "source_room": "07-b", + "source_door": "west", + "dest_room": "06-b", + "dest_door": "east" + }, + { + "source_room": "06-b", + "source_door": "west", + "dest_room": "06-c", + "dest_door": "south-west" + }, + { + "source_room": "06-c", + "source_door": "north-west", + "dest_room": "05-c", + "dest_door": "east" + }, + { + "source_room": "06-c", + "source_door": "east", + "dest_room": "08-c", + "dest_door": "west" + }, + { + "source_room": "06-c", + "source_door": "south-east", + "dest_room": "07-b", + "dest_door": "top" + }, + { + "source_room": "08-c", + "source_door": "east", + "dest_room": "08-b", + "dest_door": "east" + }, + { + "source_room": "08-b", + "source_door": "west", + "dest_room": "07-b", + "dest_door": "east" + }, + { + "source_room": "08-a", + "source_door": "bottom", + "dest_room": "08-x", + "dest_door": "west" + }, + { + "source_room": "08-a", + "source_door": "east", + "dest_room": "09-b", + "dest_door": "west" + }, + { + "source_room": "09-b", + "source_door": "south-east", + "dest_room": "10-x", + "dest_door": "north-east-top" + }, + { + "source_room": "09-b", + "source_door": "north-west", + "dest_room": "09-d", + "dest_door": "bottom" + }, + { + "source_room": "09-b", + "source_door": "north-east-top", + "dest_room": "10-c", + "dest_door": "south-east" + }, + { + "source_room": "09-b", + "source_door": "east", + "dest_room": "11-a", + "dest_door": "west" + }, + { + "source_room": "09-b", + "source_door": "north-east-right", + "dest_room": "11-b", + "dest_door": "west" + }, + { + "source_room": "10-x", + "source_door": "north-east-right", + "dest_room": "11-x", + "dest_door": "west" + }, + { + "source_room": "11-x", + "source_door": "south", + "dest_room": "11-y", + "dest_door": "west" + }, + { + "source_room": "11-y", + "source_door": "east", + "dest_room": "12-y", + "dest_door": "west" + }, + { + "source_room": "11-y", + "source_door": "south", + "dest_room": "11-z", + "dest_door": "east" + }, + { + "source_room": "11-z", + "source_door": "west", + "dest_room": "10-z", + "dest_door": "bottom" + }, + { + "source_room": "10-z", + "source_door": "top", + "dest_room": "10-y", + "dest_door": "bottom" + }, + { + "source_room": "10-y", + "source_door": "top", + "dest_room": "10-x", + "dest_door": "south-east" + }, + { + "source_room": "10-x", + "source_door": "west", + "dest_room": "09-b", + "dest_door": "south" + }, + { + "source_room": "10-c", + "source_door": "north-east", + "dest_room": "11-c", + "dest_door": "west" + }, + { + "source_room": "10-c", + "source_door": "south-west", + "dest_room": "09-b", + "dest_door": "north" + }, + { + "source_room": "11-c", + "source_door": "east", + "dest_room": "12-c", + "dest_door": "west" + }, + { + "source_room": "11-c", + "source_door": "south-west", + "dest_room": "11-b", + "dest_door": "north-west" + }, + { + "source_room": "12-c", + "source_door": "top", + "dest_room": "12-d", + "dest_door": "bottom" + }, + { + "source_room": "12-d", + "source_door": "top", + "dest_room": "11-d", + "dest_door": "east" + }, + { + "source_room": "11-d", + "source_door": "west", + "dest_room": "10-d", + "dest_door": "east" + }, + { + "source_room": "10-d", + "source_door": "west", + "dest_room": "10-c", + "dest_door": "north-west" + }, + { + "source_room": "11-b", + "source_door": "north-east", + "dest_room": "11-c", + "dest_door": "south-east" + }, + { + "source_room": "11-b", + "source_door": "east", + "dest_room": "12-b", + "dest_door": "west" + }, + { + "source_room": "12-b", + "source_door": "east", + "dest_room": "13-b", + "dest_door": "top" + }, + { + "source_room": "13-b", + "source_door": "bottom", + "dest_room": "13-a", + "dest_door": "west" + }, + { + "source_room": "13-a", + "source_door": "east", + "dest_room": "13-x", + "dest_door": "east" + }, + { + "source_room": "13-x", + "source_door": "west", + "dest_room": "12-x", + "dest_door": "east" + }, + { + "source_room": "12-x", + "source_door": "north-east", + "dest_room": "11-a", + "dest_door": "south-east-bottom" + }, + { + "source_room": "12-x", + "source_door": "west", + "dest_room": "11-a", + "dest_door": "south" + }, + { + "source_room": "11-a", + "source_door": "south-east-right", + "dest_room": "13-a", + "dest_door": "south-west" + }, + { + "source_room": "08-x", + "source_door": "east", + "dest_room": "09-b", + "dest_door": "south-west" + }, + { + "source_room": "09-d", + "source_door": "top", + "dest_room": "08-d", + "dest_door": "east" + }, + { + "source_room": "08-d", + "source_door": "west", + "dest_room": "06-d", + "dest_door": "east" + }, + { + "source_room": "06-d", + "source_door": "west", + "dest_room": "04-d", + "dest_door": "east" + }, + { + "source_room": "04-d", + "source_door": "west", + "dest_room": "02-d", + "dest_door": "east" + }, + { + "source_room": "04-d", + "source_door": "south", + "dest_room": "04-c", + "dest_door": "east" + }, + { + "source_room": "04-c", + "source_door": "west", + "dest_room": "02-c", + "dest_door": "east" + }, + { + "source_room": "04-c", + "source_door": "north-west", + "dest_room": "04-d", + "dest_door": "south-west" + }, + { + "source_room": "02-c", + "source_door": "west", + "dest_room": "01-c", + "dest_door": "east" + }, + { + "source_room": "02-c", + "source_door": "south-east", + "dest_room": "03-b", + "dest_door": "north" + }, + { + "source_room": "03-b", + "source_door": "east", + "dest_room": "04-b", + "dest_door": "west" + }, + { + "source_room": "03-b", + "source_door": "west", + "dest_room": "02-b", + "dest_door": "far-east" + }, + { + "source_room": "02-d", + "source_door": "west", + "dest_room": "00-d", + "dest_door": "east" + }, + { + "source_room": "00-d", + "source_door": "west", + "dest_room": "roof00", + "dest_door": "west" + }, + { + "source_room": "roof00", + "source_door": "east", + "dest_room": "roof01", + "dest_door": "west" + }, + { + "source_room": "roof01", + "source_door": "east", + "dest_room": "roof02", + "dest_door": "west" + }, + { + "source_room": "roof02", + "source_door": "east", + "dest_room": "roof03", + "dest_door": "west" + }, + { + "source_room": "roof03", + "source_door": "east", + "dest_room": "roof04", + "dest_door": "west" + }, + { + "source_room": "roof04", + "source_door": "east", + "dest_room": "roof05", + "dest_door": "west" + }, + { + "source_room": "roof05", + "source_door": "east", + "dest_room": "roof06b", + "dest_door": "west" + }, + { + "source_room": "roof06b", + "source_door": "east", + "dest_room": "roof06", + "dest_door": "west" + }, + { + "source_room": "roof06", + "source_door": "east", + "dest_room": "roof07", + "dest_door": "west" + } + ] + }, + { + "name": "3b", + "display_name": "Celestial Resort B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "back", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms", "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Staff Quarters", + "checkpoint_region": "west" + }, + { + "name": "07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Library", + "checkpoint_region": "west" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "Rooftop", + "checkpoint_region": "west" + }, + { + "name": "17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "21", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins", "moving_platforms", "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "west", + "dest_room": "back", + "dest_door": "east" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "east", + "dest_room": "08", + "dest_door": "bottom" + }, + { + "source_room": "08", + "source_door": "top", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "east", + "dest_room": "14", + "dest_door": "west" + }, + { + "source_room": "14", + "source_door": "east", + "dest_room": "15", + "dest_door": "west" + }, + { + "source_room": "15", + "source_door": "east", + "dest_room": "12", + "dest_door": "west" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "16", + "dest_door": "west" + }, + { + "source_room": "16", + "source_door": "top", + "dest_room": "17", + "dest_door": "west" + }, + { + "source_room": "17", + "source_door": "east", + "dest_room": "18", + "dest_door": "west" + }, + { + "source_room": "18", + "source_door": "east", + "dest_room": "19", + "dest_door": "west" + }, + { + "source_room": "19", + "source_door": "east", + "dest_room": "21", + "dest_door": "west" + }, + { + "source_room": "21", + "source_door": "east", + "dest_room": "20", + "dest_door": "west" + }, + { + "source_room": "20", + "source_door": "east", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "3c", + "display_name": "Celestial Resort C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "sinking_platforms", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "4a", + "display_name": "Golden Ridge A", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds", "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "blue_clouds", "blue_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-11", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "west", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Shrine", + "checkpoint_region": "south" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south-west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + }, + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-sec", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "white_block" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-secb", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [ [ "pink_clouds", "move_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "center", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + }, + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Old Trail", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters", "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters", "blue_clouds", "move_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "move_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-10", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Cliff Face", + "checkpoint_region": "west" + }, + { + "name": "d-00b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + }, + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "coins", "pink_clouds", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "blue_clouds", "pink_clouds", "blue_boosters", "move_blocks", "dash_refills", "springs", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-01x", + "dest_door": "west" + }, + { + "source_room": "a-01x", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-06", + "source_door": "east", + "dest_room": "a-07", + "dest_door": "west" + }, + { + "source_room": "a-07", + "source_door": "east", + "dest_room": "a-08", + "dest_door": "west" + }, + { + "source_room": "a-08", + "source_door": "north-west", + "dest_room": "a-10", + "dest_door": "east" + }, + { + "source_room": "a-08", + "source_door": "east", + "dest_room": "a-09", + "dest_door": "bottom" + }, + { + "source_room": "a-10", + "source_door": "west", + "dest_room": "a-11", + "dest_door": "east" + }, + { + "source_room": "a-09", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "south-east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north-west", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-06", + "source_door": "west", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "south-west" + }, + { + "source_room": "b-00", + "source_door": "north-east", + "dest_room": "b-02", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-sec", + "dest_door": "west" + }, + { + "source_room": "b-sec", + "source_door": "east", + "dest_room": "b-secb", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "center" + }, + { + "source_room": "b-05", + "source_door": "west", + "dest_room": "b-04", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "east" + }, + { + "source_room": "b-05", + "source_door": "north-east", + "dest_room": "b-08b", + "dest_door": "west" + }, + { + "source_room": "b-08b", + "source_door": "east", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-west", + "dest_room": "c-01", + "dest_door": "east" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-05", + "source_door": "east", + "dest_room": "c-06", + "dest_door": "bottom" + }, + { + "source_room": "c-06", + "source_door": "west", + "dest_room": "c-06b", + "dest_door": "east" + }, + { + "source_room": "c-06", + "source_door": "top", + "dest_room": "c-09", + "dest_door": "west" + }, + { + "source_room": "c-09", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "bottom" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-10", + "dest_door": "bottom" + }, + { + "source_room": "c-08", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "c-10", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "north-west", + "dest_room": "d-00b", + "dest_door": "east" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "east", + "dest_room": "d-06", + "dest_door": "west" + }, + { + "source_room": "d-06", + "source_door": "east", + "dest_room": "d-07", + "dest_door": "west" + }, + { + "source_room": "d-07", + "source_door": "east", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + } + ] + }, + { + "name": "4b", + "display_name": "Golden Ridge B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Stepping Stones", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks", "springs", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "moving_platforms", "springs", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Gusty Canyon", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Eye of the Storm", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "blue_boosters", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins", "moving_platforms", "blue_boosters", "blue_clouds", "pink_clouds", "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "bottom" + }, + { + "source_room": "b-02", + "source_door": "top", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "4c", + "display_name": "Golden Ridge C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_clouds", "blue_boosters", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_clouds", "blue_boosters", "move_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "5a", + "display_name": "Mirror Temple A", + "rooms": [ + { + "name": "a-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-00x", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [ [ "swap_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-07", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Entrance Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-11", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-12", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-15", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-14", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Entrance Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "Entrance Key" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Depths", + "checkpoint_region": "west" + }, + { + "name": "b-18", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-20", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-21", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east-upper", + "rule": [] + }, + { + "dest": "east-lower", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east-upper", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east-lower", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east-upper", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east-lower", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Depths Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-10", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-11", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dash_switches", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-22", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "red_boosters", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "Depths Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "Depths Key" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [ [ "Depths Key" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "Depths Key" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-15", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-16", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "mirror", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "mirror", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "void", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "bottom", + "connections": [] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "special", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Unravelling", + "checkpoint_region": "top" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "seekers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Search", + "checkpoint_region": "south" + }, + { + "name": "d-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "south-east-down", + "rule": [] + }, + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "south-west-left", + "connections": [ + { + "dest": "south-west-down", + "rule": [] + } + ] + }, + { + "name": "south-west-down", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "south-west-left", + "rule": [] + } + ] + }, + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-down", + "rule": [] + } + ] + }, + { + "name": "south-east-down", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "south-east-right", + "rule": [ [ "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west-left", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-right", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "south-east-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "Search Key 1", "Search Key 2" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "south-west-left", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_3", + "display_name": "Search Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-west-right", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_4", + "display_name": "Search Key 2", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-left", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-right", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "north-east", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ + [ "springs" ], + [ "seekers" ] + ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "coins", "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-15", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + }, + { + "name": "key_5", + "display_name": "Search Key 3", + "type": "key", + "rule": [ [ "swap_blocks", "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-13", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-19b", + "regions": [ + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-down", + "rule": [] + } + ] + }, + { + "name": "south-east-down", + "connections": [ + { + "dest": "south-east-right", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-19", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "Search Key 3" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Rescue", + "checkpoint_region": "west" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks", "springs", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "red_boosters", "swap_blocks", "dash_switches", "Entrance Key", "Depths Key", "Search Key 1", "Search Key 2", "seekers", "coins", "theo_crystal" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00b", + "source_door": "west", + "dest_room": "a-00x", + "dest_door": "east" + }, + { + "source_room": "a-00b", + "source_door": "east", + "dest_room": "a-00d", + "dest_door": "west" + }, + { + "source_room": "a-00d", + "source_door": "east", + "dest_room": "a-00c", + "dest_door": "west" + }, + { + "source_room": "a-00c", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-13", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "south-west", + "dest_room": "a-04", + "dest_door": "north" + }, + { + "source_room": "a-01", + "source_door": "south-east", + "dest_room": "a-02", + "dest_door": "north" + }, + { + "source_room": "a-01", + "source_door": "north", + "dest_room": "a-08", + "dest_door": "south" + }, + { + "source_room": "a-02", + "source_door": "west", + "dest_room": "a-03", + "dest_door": "east" + }, + { + "source_room": "a-02", + "source_door": "south", + "dest_room": "a-05", + "dest_door": "north-east" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "south", + "dest_room": "a-05", + "dest_door": "north-west" + }, + { + "source_room": "a-05", + "source_door": "south-west", + "dest_room": "a-07", + "dest_door": "east" + }, + { + "source_room": "a-05", + "source_door": "south-east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-08", + "source_door": "west", + "dest_room": "a-10", + "dest_door": "east" + }, + { + "source_room": "a-08", + "source_door": "north", + "dest_room": "a-14", + "dest_door": "south" + }, + { + "source_room": "a-08", + "source_door": "north-east", + "dest_room": "a-12", + "dest_door": "north-west" + }, + { + "source_room": "a-08", + "source_door": "south-east", + "dest_room": "a-12", + "dest_door": "south-west" + }, + { + "source_room": "a-10", + "source_door": "west", + "dest_room": "a-09", + "dest_door": "east" + }, + { + "source_room": "a-09", + "source_door": "west", + "dest_room": "a-11", + "dest_door": "east" + }, + { + "source_room": "a-12", + "source_door": "west", + "dest_room": "a-08", + "dest_door": "east" + }, + { + "source_room": "a-12", + "source_door": "east", + "dest_room": "a-15", + "dest_door": "south" + }, + { + "source_room": "a-13", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + + { + "source_room": "b-00", + "source_door": "north-west", + "dest_room": "b-18", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "south-west" + }, + { + "source_room": "b-01", + "source_door": "west", + "dest_room": "b-20", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "north", + "dest_room": "b-20", + "dest_door": "south" + }, + { + "source_room": "b-01", + "source_door": "north-east", + "dest_room": "b-20", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-01b", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "south", + "dest_room": "b-01c", + "dest_door": "west" + }, + { + "source_room": "b-01c", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "south-east" + }, + { + "source_room": "b-20", + "source_door": "south-west", + "dest_room": "b-01", + "dest_door": "north-west" + }, + { + "source_room": "b-20", + "source_door": "north-west", + "dest_room": "b-21", + "dest_door": "east" + }, + { + "source_room": "b-01b", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-03", + "dest_door": "east" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-04", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east-upper", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east-lower", + "dest_room": "b-11", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "south-east", + "dest_room": "b-11", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "south", + "dest_room": "b-10", + "dest_door": "east" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-07", + "dest_door": "south" + }, + { + "source_room": "b-07", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "b-09", + "dest_door": "north" + }, + { + "source_room": "b-09", + "source_door": "south", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-11", + "source_door": "south-west", + "dest_room": "b-12", + "dest_door": "west" + }, + { + "source_room": "b-11", + "source_door": "south-east", + "dest_room": "b-12", + "dest_door": "east" + }, + { + "source_room": "b-11", + "source_door": "east", + "dest_room": "b-13", + "dest_door": "west" + }, + { + "source_room": "b-13", + "source_door": "east", + "dest_room": "b-17", + "dest_door": "west" + }, + { + "source_room": "b-13", + "source_door": "north-east", + "dest_room": "b-17", + "dest_door": "north-west" + }, + { + "source_room": "b-17", + "source_door": "east", + "dest_room": "b-22", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-19", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "north-east", + "dest_room": "b-19", + "dest_door": "north-west" + }, + { + "source_room": "b-19", + "source_door": "east", + "dest_room": "b-14", + "dest_door": "west" + }, + { + "source_room": "b-14", + "source_door": "south", + "dest_room": "b-15", + "dest_door": "west" + }, + { + "source_room": "b-14", + "source_door": "north", + "dest_room": "b-16", + "dest_door": "bottom" + }, + { + "source_room": "b-16", + "source_door": "mirror", + "dest_room": "void", + "dest_door": "east" + }, + { + "source_room": "void", + "source_door": "west", + "dest_room": "c-00", + "dest_door": "top" + }, + { + "source_room": "c-00", + "source_door": "bottom", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-01b", + "dest_door": "west" + }, + { + "source_room": "c-01b", + "source_door": "east", + "dest_room": "c-01c", + "dest_door": "west" + }, + { + "source_room": "c-01c", + "source_door": "east", + "dest_room": "c-08b", + "dest_door": "west" + }, + { + "source_room": "c-08b", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-10", + "dest_door": "west" + }, + { + "source_room": "c-10", + "source_door": "east", + "dest_room": "c-12", + "dest_door": "west" + }, + { + "source_room": "c-12", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-11", + "dest_door": "west" + }, + { + "source_room": "c-11", + "source_door": "east", + "dest_room": "c-09", + "dest_door": "west" + }, + { + "source_room": "c-09", + "source_door": "east", + "dest_room": "c-13", + "dest_door": "west" + }, + { + "source_room": "c-13", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "south" + }, + + { + "source_room": "d-00", + "source_door": "north", + "dest_room": "d-01", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "west", + "dest_room": "d-05", + "dest_door": "east" + }, + { + "source_room": "d-05", + "source_door": "south", + "dest_room": "d-02", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "north-west", + "dest_room": "d-09", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "west", + "dest_room": "d-09", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "south-west-down", + "dest_room": "d-05", + "dest_door": "north" + }, + { + "source_room": "d-01", + "source_door": "south-east-down", + "dest_room": "d-07", + "dest_door": "north" + }, + { + "source_room": "d-01", + "source_door": "south-east-right", + "dest_room": "d-15", + "dest_door": "south-west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-15", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "north-east", + "dest_room": "d-15", + "dest_door": "north-west" + }, + { + "source_room": "d-09", + "source_door": "west", + "dest_room": "d-04", + "dest_door": "north" + }, + { + "source_room": "d-04", + "source_door": "west", + "dest_room": "d-19b", + "dest_door": "south-east-right" + }, + { + "source_room": "d-04", + "source_door": "south-east", + "dest_room": "d-01", + "dest_door": "south-west-left" + }, + { + "source_room": "d-05", + "source_door": "west", + "dest_room": "d-06", + "dest_door": "south-east" + }, + { + "source_room": "d-05", + "source_door": "south", + "dest_room": "d-02", + "dest_door": "east" + }, + { + "source_room": "d-06", + "source_door": "north-east", + "dest_room": "d-04", + "dest_door": "south-west-right" + }, + { + "source_room": "d-06", + "source_door": "north-west", + "dest_room": "d-04", + "dest_door": "south-west-left" + }, + { + "source_room": "d-07", + "source_door": "west", + "dest_room": "d-00", + "dest_door": "east" + }, + { + "source_room": "d-02", + "source_door": "west", + "dest_room": "d-03", + "dest_door": "east" + }, + { + "source_room": "d-03", + "source_door": "west", + "dest_room": "d-06", + "dest_door": "south-west" + }, + { + "source_room": "d-15", + "source_door": "south-east", + "dest_room": "d-13", + "dest_door": "east" + }, + { + "source_room": "d-13", + "source_door": "west", + "dest_room": "d-15", + "dest_door": "south" + }, + { + "source_room": "d-19b", + "source_door": "south-east-down", + "dest_room": "d-19", + "dest_door": "east" + }, + { + "source_room": "d-19b", + "source_door": "north-east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-19", + "source_door": "west", + "dest_room": "d-19b", + "dest_door": "south-west" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-20", + "dest_door": "west" + }, + { + "source_room": "d-20", + "source_door": "east", + "dest_room": "e-00", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "west" + }, + { + "source_room": "e-01", + "source_door": "east", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "west" + }, + { + "source_room": "e-07", + "source_door": "east", + "dest_room": "e-08", + "dest_door": "west" + }, + { + "source_room": "e-08", + "source_door": "east", + "dest_room": "e-09", + "dest_door": "west" + }, + { + "source_room": "e-09", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "west" + }, + { + "source_room": "e-10", + "source_door": "east", + "dest_room": "e-11", + "dest_door": "west" + } + ] + }, + { + "name": "5b", + "display_name": "Mirror Temple B", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "Central Chamber Key 2" ] ] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Central Chamber", + "checkpoint_region": "south" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "Central Chamber Key 2" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills", "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "red_boosters", "Central Chamber Key 1" ] ] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Central Chamber Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Central Chamber Key 2", + "type": "key", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "swap_blocks", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "north", + "connections": [] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "main", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters", "dash_switches", "Central Chamber Key 1" ] ] + }, + { + "dest": "west", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "main", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "south", + "connections": [] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "swap_blocks", "springs" ] ] + }, + { + "dest": "north", + "rule": [ [ "dash_switches", "swap_blocks", "springs", "Central Chamber Key 1" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "mirror", + "rule": [ [ "swap_blocks", "red_boosters", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "mirror", + "connections": [] + } + ], + "doors": [ + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "bottom", + "connections": [] + }, + { + "name": "mirror", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Through the Mirror", + "checkpoint_region": "mirror" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "dash_switches", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Mix Master", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_switches", "seekers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "swap_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "springs", "swap_blocks" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "Central Chamber Key 1", "Central Chamber Key 2", "pink_cassette_blocks", "blue_cassette_blocks", "theo_crystal", "dash_refills", "springs", "coins", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-02", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "north", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "south" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-02", + "dest_door": "south-east" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-05", + "dest_door": "north" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "south" + }, + { + "source_room": "b-05", + "source_door": "south", + "dest_room": "b-02", + "dest_door": "south-west" + }, + { + "source_room": "b-07", + "source_door": "north", + "dest_room": "b-03", + "dest_door": "east" + }, + { + "source_room": "b-03", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "east" + }, + { + "source_room": "b-08", + "source_door": "north", + "dest_room": "b-09", + "dest_door": "bottom" + }, + { + "source_room": "b-09", + "source_door": "mirror", + "dest_room": "c-00", + "dest_door": "mirror" + }, + { + "source_room": "c-00", + "source_door": "bottom", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + } + ] + }, + { + "name": "5c", + "display_name": "Mirror Temple C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "red_boosters", "dash_refills", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "red_boosters", "dash_refills", "dash_switches", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "6a", + "display_name": "Reflection A", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "kevin_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "bottom-west", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "bottom-west", + "connections": [] + }, + { + "name": "top-west", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "top-west", + "rule": [ [ "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "kevin_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Hollows", + "checkpoint_region": "south" + }, + { + "name": "04b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04c", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04d", + "regions": [ + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04e", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "cannot_access" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "feathers" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reflection", + "checkpoint_region": "west" + }, + { + "name": "b-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00c", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02b", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Rock Bottom", + "checkpoint_region": "west" + }, + { + "name": "boss-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "feathers", "dash_refills", "kevin_blocks", "bumpers", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "after-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Resolution", + "checkpoint_region": "bottom" + }, + { + "name": "after-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "badeline_boosters" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "west", + "dest_room": "01", + "dest_door": "bottom" + }, + { + "source_room": "01", + "source_door": "top", + "dest_room": "02", + "dest_door": "bottom" + }, + { + "source_room": "02", + "source_door": "bottom-west", + "dest_room": "03", + "dest_door": "bottom" + }, + { + "source_room": "02", + "source_door": "top", + "dest_room": "02b", + "dest_door": "bottom" + }, + { + "source_room": "03", + "source_door": "top", + "dest_room": "02", + "dest_door": "top-west" + }, + { + "source_room": "02b", + "source_door": "top", + "dest_room": "04", + "dest_door": "south" + }, + + { + "source_room": "04", + "source_door": "north-west", + "dest_room": "04b", + "dest_door": "east" + }, + { + "source_room": "04", + "source_door": "south-east", + "dest_room": "04d", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "south-west", + "dest_room": "04e", + "dest_door": "east" + }, + { + "source_room": "04b", + "source_door": "west", + "dest_room": "04c", + "dest_door": "east" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "east", + "dest_room": "08a", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "north-east", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08a", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "09", + "dest_door": "north-west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10a", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "north-east", + "dest_room": "10b", + "dest_door": "west" + }, + { + "source_room": "10a", + "source_door": "east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "10b", + "source_door": "east", + "dest_room": "11", + "dest_door": "north-west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "12a", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "north-east", + "dest_room": "12b", + "dest_door": "west" + }, + { + "source_room": "12a", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "12b", + "source_door": "east", + "dest_room": "13", + "dest_door": "north-west" + }, + { + "source_room": "13", + "source_door": "east", + "dest_room": "14a", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "north-east", + "dest_room": "14b", + "dest_door": "west" + }, + { + "source_room": "14a", + "source_door": "east", + "dest_room": "15", + "dest_door": "west" + }, + { + "source_room": "14b", + "source_door": "east", + "dest_room": "15", + "dest_door": "north-west" + }, + { + "source_room": "15", + "source_door": "east", + "dest_room": "16a", + "dest_door": "west" + }, + { + "source_room": "15", + "source_door": "north-east", + "dest_room": "16b", + "dest_door": "west" + }, + { + "source_room": "16a", + "source_door": "east", + "dest_room": "17", + "dest_door": "west" + }, + { + "source_room": "16b", + "source_door": "east", + "dest_room": "17", + "dest_door": "north-west" + }, + { + "source_room": "17", + "source_door": "east", + "dest_room": "18a", + "dest_door": "west" + }, + { + "source_room": "17", + "source_door": "north-east", + "dest_room": "18b", + "dest_door": "west" + }, + { + "source_room": "18a", + "source_door": "east", + "dest_room": "19", + "dest_door": "west" + }, + { + "source_room": "18b", + "source_door": "east", + "dest_room": "19", + "dest_door": "north-west" + }, + { + "source_room": "19", + "source_door": "east", + "dest_room": "20", + "dest_door": "west" + }, + { + "source_room": "20", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-00b", + "dest_door": "bottom" + }, + { + "source_room": "b-00b", + "source_door": "top", + "dest_room": "b-00c", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "top" + }, + { + "source_room": "b-02", + "source_door": "bottom", + "dest_room": "b-02b", + "dest_door": "top" + }, + { + "source_room": "b-02b", + "source_door": "bottom", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "boss-00", + "dest_door": "west" + }, + { + "source_room": "boss-00", + "source_door": "east", + "dest_room": "boss-01", + "dest_door": "west" + }, + { + "source_room": "boss-01", + "source_door": "east", + "dest_room": "boss-02", + "dest_door": "west" + }, + { + "source_room": "boss-02", + "source_door": "east", + "dest_room": "boss-03", + "dest_door": "west" + }, + { + "source_room": "boss-03", + "source_door": "east", + "dest_room": "boss-04", + "dest_door": "west" + }, + { + "source_room": "boss-04", + "source_door": "east", + "dest_room": "boss-05", + "dest_door": "west" + }, + { + "source_room": "boss-05", + "source_door": "east", + "dest_room": "boss-06", + "dest_door": "west" + }, + { + "source_room": "boss-06", + "source_door": "east", + "dest_room": "boss-07", + "dest_door": "west" + }, + { + "source_room": "boss-07", + "source_door": "east", + "dest_room": "boss-08", + "dest_door": "west" + }, + { + "source_room": "boss-08", + "source_door": "east", + "dest_room": "boss-09", + "dest_door": "west" + }, + { + "source_room": "boss-09", + "source_door": "east", + "dest_room": "boss-10", + "dest_door": "west" + }, + { + "source_room": "boss-10", + "source_door": "east", + "dest_room": "boss-11", + "dest_door": "west" + }, + { + "source_room": "boss-11", + "source_door": "east", + "dest_room": "boss-12", + "dest_door": "west" + }, + { + "source_room": "boss-12", + "source_door": "east", + "dest_room": "boss-13", + "dest_door": "west" + }, + { + "source_room": "boss-13", + "source_door": "east", + "dest_room": "boss-14", + "dest_door": "west" + }, + { + "source_room": "boss-14", + "source_door": "east", + "dest_room": "boss-15", + "dest_door": "west" + }, + { + "source_room": "boss-15", + "source_door": "east", + "dest_room": "boss-16", + "dest_door": "west" + }, + { + "source_room": "boss-16", + "source_door": "east", + "dest_room": "boss-17", + "dest_door": "west" + }, + { + "source_room": "boss-17", + "source_door": "east", + "dest_room": "boss-18", + "dest_door": "west" + }, + { + "source_room": "boss-18", + "source_door": "east", + "dest_room": "boss-19", + "dest_door": "west" + }, + { + "source_room": "boss-19", + "source_door": "east", + "dest_room": "boss-20", + "dest_door": "west" + }, + { + "source_room": "boss-20", + "source_door": "east", + "dest_room": "after-00", + "dest_door": "bottom" + }, + { + "source_room": "after-00", + "source_door": "top", + "dest_room": "after-01", + "dest_door": "bottom" + } + ] + }, + { + "name": "6b", + "display_name": "Reflection B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "bottom" + }, + { + "name": "a-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "bumpers", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reflection", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Rock Bottom", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reprieve", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "feathers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "blue_cassette_blocks", "bumpers", "dash_refills", "springs", "coins", "kevin_blocks", "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "top", + "dest_room": "a-01", + "dest_door": "bottom" + }, + { + "source_room": "a-01", + "source_door": "top", + "dest_room": "a-02", + "dest_door": "bottom" + }, + { + "source_room": "a-02", + "source_door": "top", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-06", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "top" + }, + { + "source_room": "b-01", + "source_door": "bottom", + "dest_room": "b-02", + "dest_door": "top" + }, + { + "source_room": "b-02", + "source_door": "bottom", + "dest_room": "b-03", + "dest_door": "top" + }, + { + "source_room": "b-03", + "source_door": "bottom", + "dest_room": "b-04", + "dest_door": "top" + }, + { + "source_room": "b-04", + "source_door": "bottom", + "dest_room": "b-05", + "dest_door": "top" + }, + { + "source_room": "b-05", + "source_door": "bottom", + "dest_room": "b-06", + "dest_door": "top" + }, + { + "source_room": "b-06", + "source_door": "bottom", + "dest_room": "b-07", + "dest_door": "top" + }, + { + "source_room": "b-07", + "source_door": "bottom", + "dest_room": "b-08", + "dest_door": "top" + }, + { + "source_room": "b-08", + "source_door": "bottom", + "dest_room": "b-10", + "dest_door": "west" + }, + { + "source_room": "b-10", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + } + ] + }, + { + "name": "6c", + "display_name": "Reflection C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers", "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "7a", + "display_name": "The Summit A", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "springs" ] ] + }, + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "springs", "dash_refills" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "springs" ] ] + }, + { + "dest": "top-side", + "rule": [ [ "badeline_boosters", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "top-side", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "gem_1", + "display_name": "Gem 1", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "500 M", + "checkpoint_region": "bottom" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02e", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02d", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "gem_2", + "display_name": "Gem 2", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "top-side", + "rule": [] + } + ] + }, + { + "name": "top-side", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1000 M", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "springs", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06c", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "gem_3", + "display_name": "Gem 3", + "type": "gem", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1500 M", + "checkpoint_region": "bottom" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ + [ "coins" ], + [ "dash_refills" ] + ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05b", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "gem_4", + "display_name": "Gem 4", + "type": "gem", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2000 M", + "checkpoint_region": "bottom" + }, + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + }, + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "gem_5", + "display_name": "Gem 5", + "type": "gem", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "moving_platforms" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + }, + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-09", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-11", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-12", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-13", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "dash_refills", "move_blocks", "blue_boosters", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2500 M", + "checkpoint_region": "south" + }, + { + "name": "f-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_refills", "swap_blocks", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "gem_6", + "display_name": "Gem 6", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "2500 M Key" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-06", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + }, + { + "name": "south-east", + "connections": [], + "locations": [ + { + "name": "key", + "display_name": "2500 M Key", + "type": "key", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters", "dash_refills" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "swap_blocks", "springs", "red_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "3000 M", + "checkpoint_region": "bottom" + }, + { + "name": "g-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "c26", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "Gem 1", "Gem 2", "Gem 3", "Gem 4", "Gem 5", "Gem 6" ] ] + } + ] + }, + { + "name": "c26", + "connections": [ + { + "dest": "c24", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "c24", + "connections": [ + { + "dest": "c21", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "c21", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "c18", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "c18", + "connections": [ + { + "dest": "c16", + "rule": [ [ "dash_refills", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "dash_refills", "blue_clouds" ] ] + } + ] + }, + { + "name": "c16", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "coins", "dash_refills", "pink_clouds", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_clouds", "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "springs", "dash_refills", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "springs" ] ] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs", "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dash_refills", "feathers", "blue_clouds", "pink_clouds", "coins", "badeline_boosters", "red_boosters", "swap_blocks", "dash_switches", "2500 M Key", "move_blocks", "blue_boosters", "dream_blocks", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "north", + "dest_room": "a-02b", + "dest_door": "east" + }, + { + "source_room": "a-02b", + "source_door": "west", + "dest_room": "a-02", + "dest_door": "north-west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "north", + "dest_room": "a-04b", + "dest_door": "east" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "bottom" + }, + { + "source_room": "a-06", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "bottom" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-02b", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-02d", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-02b", + "source_door": "north-west", + "dest_room": "b-02e", + "dest_door": "east" + }, + { + "source_room": "b-02b", + "source_door": "north-east", + "dest_room": "b-02c", + "dest_door": "west" + }, + { + "source_room": "b-02c", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "north-west" + }, + { + "source_room": "b-02c", + "source_door": "south-east", + "dest_room": "b-02d", + "dest_door": "north" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "b-09", + "dest_door": "bottom" + }, + { + "source_room": "b-09", + "source_door": "top", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "bottom" + }, + { + "source_room": "c-01", + "source_door": "top", + "dest_room": "c-02", + "dest_door": "bottom" + }, + { + "source_room": "c-02", + "source_door": "top", + "dest_room": "c-03", + "dest_door": "south" + }, + { + "source_room": "c-03", + "source_door": "west", + "dest_room": "c-03b", + "dest_door": "east" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "north-west", + "dest_room": "c-06", + "dest_door": "south" + }, + { + "source_room": "c-04", + "source_door": "north-east", + "dest_room": "c-06b", + "dest_door": "south" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "east", + "dest_room": "c-06b", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "north", + "dest_room": "c-07", + "dest_door": "south-west" + }, + { + "source_room": "c-06b", + "source_door": "east", + "dest_room": "c-06c", + "dest_door": "west" + }, + { + "source_room": "c-06b", + "source_door": "north", + "dest_room": "c-07", + "dest_door": "south-east" + }, + { + "source_room": "c-07", + "source_door": "west", + "dest_room": "c-07b", + "dest_door": "east" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-09", + "dest_door": "bottom" + }, + { + "source_room": "c-09", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "top", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-01b", + "dest_door": "west" + }, + { + "source_room": "d-01b", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-01b", + "source_door": "south-west", + "dest_room": "d-01c", + "dest_door": "west" + }, + { + "source_room": "d-01c", + "source_door": "south", + "dest_room": "d-01d", + "dest_door": "west" + }, + { + "source_room": "d-01c", + "source_door": "east", + "dest_room": "d-01b", + "dest_door": "south-east" + }, + { + "source_room": "d-01d", + "source_door": "east", + "dest_room": "d-01c", + "dest_door": "south-east" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "north-east", + "dest_room": "d-03b", + "dest_door": "east" + }, + { + "source_room": "d-03b", + "source_door": "west", + "dest_room": "d-03", + "dest_door": "north-west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "east", + "dest_room": "d-05b", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "north-east", + "dest_room": "d-06", + "dest_door": "south-west" + }, + { + "source_room": "d-06", + "source_door": "west", + "dest_room": "d-07", + "dest_door": "east" + }, + { + "source_room": "d-06", + "source_door": "south-east", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-06", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "north-west" + }, + { + "source_room": "d-10", + "source_door": "north-east", + "dest_room": "d-10b", + "dest_door": "east" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-11", + "dest_door": "bottom" + }, + { + "source_room": "d-10b", + "source_door": "west", + "dest_room": "d-10", + "dest_door": "north" + }, + { + "source_room": "d-11", + "source_door": "top", + "dest_room": "e-00b", + "dest_door": "bottom" + }, + { + "source_room": "e-00b", + "source_door": "top", + "dest_room": "e-00", + "dest_door": "south-west" + }, + { + "source_room": "e-00", + "source_door": "west", + "dest_room": "e-01", + "dest_door": "east" + }, + { + "source_room": "e-00", + "source_door": "north-west", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "south-west" + }, + { + "source_room": "e-01", + "source_door": "west", + "dest_room": "e-01b", + "dest_door": "east" + }, + { + "source_room": "e-01b", + "source_door": "west", + "dest_room": "e-01c", + "dest_door": "west" + }, + { + "source_room": "e-01c", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "north" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "bottom" + }, + { + "source_room": "e-07", + "source_door": "top", + "dest_room": "e-08", + "dest_door": "south" + }, + { + "source_room": "e-08", + "source_door": "west", + "dest_room": "e-09", + "dest_door": "east" + }, + { + "source_room": "e-08", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "south" + }, + { + "source_room": "e-09", + "source_door": "north", + "dest_room": "e-11", + "dest_door": "south" + }, + { + "source_room": "e-11", + "source_door": "north", + "dest_room": "e-12", + "dest_door": "west" + }, + { + "source_room": "e-11", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "north" + }, + { + "source_room": "e-10", + "source_door": "east", + "dest_room": "e-10b", + "dest_door": "west" + }, + { + "source_room": "e-10b", + "source_door": "east", + "dest_room": "e-13", + "dest_door": "bottom" + }, + { + "source_room": "e-13", + "source_door": "top", + "dest_room": "f-00", + "dest_door": "south" + }, + { + "source_room": "f-00", + "source_door": "west", + "dest_room": "f-01", + "dest_door": "south" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "north-east", + "dest_room": "f-02", + "dest_door": "north-west" + }, + { + "source_room": "f-01", + "source_door": "north", + "dest_room": "f-00", + "dest_door": "north-west" + }, + { + "source_room": "f-02", + "source_door": "north-east", + "dest_room": "f-02b", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-04", + "dest_door": "west" + }, + { + "source_room": "f-02b", + "source_door": "east", + "dest_room": "f-07", + "dest_door": "west" + }, + { + "source_room": "f-04", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "west" + }, + { + "source_room": "f-03", + "source_door": "east", + "dest_room": "f-05", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "east", + "dest_room": "f-08", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "south-west", + "dest_room": "f-06", + "dest_door": "north-west" + }, + { + "source_room": "f-05", + "source_door": "south", + "dest_room": "f-06", + "dest_door": "north" + }, + { + "source_room": "f-05", + "source_door": "south-east", + "dest_room": "f-06", + "dest_door": "north-east" + }, + { + "source_room": "f-05", + "source_door": "north-west", + "dest_room": "f-07", + "dest_door": "south-west" + }, + { + "source_room": "f-05", + "source_door": "north", + "dest_room": "f-07", + "dest_door": "south" + }, + { + "source_room": "f-05", + "source_door": "north-east", + "dest_room": "f-07", + "dest_door": "south-east" + }, + { + "source_room": "f-08", + "source_door": "north-west", + "dest_room": "f-08b", + "dest_door": "west" + }, + { + "source_room": "f-08", + "source_door": "east", + "dest_room": "f-09", + "dest_door": "west" + }, + { + "source_room": "f-09", + "source_door": "east", + "dest_room": "f-10", + "dest_door": "west" + }, + { + "source_room": "f-08b", + "source_door": "east", + "dest_room": "f-08d", + "dest_door": "west" + }, + { + "source_room": "f-08d", + "source_door": "east", + "dest_room": "f-08c", + "dest_door": "west" + }, + { + "source_room": "f-08c", + "source_door": "east", + "dest_room": "f-10", + "dest_door": "north-east" + }, + { + "source_room": "f-10", + "source_door": "east", + "dest_room": "f-10b", + "dest_door": "west" + }, + { + "source_room": "f-10b", + "source_door": "east", + "dest_room": "f-11", + "dest_door": "bottom" + }, + { + "source_room": "f-11", + "source_door": "top", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-00b", + "dest_door": "bottom" + }, + { + "source_room": "g-00b", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "bottom" + }, + { + "source_room": "g-02", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + } + ] + }, + { + "name": "7b", + "display_name": "The Summit B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "500 M", + "checkpoint_region": "bottom" + }, + { + "name": "b-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1000 M", + "checkpoint_region": "west" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1500 M", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "moving_platforms", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2000 M", + "checkpoint_region": "west" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_clouds", "pink_clouds", "coins", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2500 M", + "checkpoint_region": "west" + }, + { + "name": "f-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "swap_blocks", "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "3000 M", + "checkpoint_region": "bottom" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "pink_clouds", "blue_clouds", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "pink_clouds", "blue_clouds", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "blue_clouds" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dash_refills", "blue_clouds", "pink_clouds", "coins", "badeline_boosters", "red_boosters", "swap_blocks", "move_blocks", "blue_boosters", "dream_blocks", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "bottom" + }, + { + "source_room": "a-03", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "bottom" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-01", + "dest_door": "bottom" + }, + { + "source_room": "b-01", + "source_door": "top", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "bottom" + }, + { + "source_room": "b-03", + "source_door": "top", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "bottom" + }, + { + "source_room": "d-03", + "source_door": "top", + "dest_room": "e-00", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "west" + }, + { + "source_room": "e-01", + "source_door": "east", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "bottom" + }, + { + "source_room": "e-03", + "source_door": "top", + "dest_room": "f-00", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-01", + "dest_door": "west" + }, + { + "source_room": "f-01", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "bottom" + }, + { + "source_room": "f-03", + "source_door": "top", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "bottom" + }, + { + "source_room": "g-02", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + } + ] + }, + { + "name": "7c", + "display_name": "The Summit C", + "rooms": [ + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "badeline_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_clouds", "dash_refills", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_clouds", "dash_refills", "springs", "coins", "badeline_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + } + ] + }, + { + "name": "8a", + "display_name": "Epilogue", + "rooms": [ + { + "name": "outside", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "bridge", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "secret", + "regions": [ + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "outside", + "source_door": "east", + "dest_room": "bridge", + "dest_door": "west" + }, + { + "source_room": "bridge", + "source_door": "east", + "dest_room": "secret", + "dest_door": "west" + } + ] + }, + { + "name": "9a", + "display_name": "Core A", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "0x", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "car", + "display_name": "Car", + "type": "car", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Into the Core", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls", "core_toggles", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks", "dash_refills", "bumpers", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "core_toggles", "core_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles", "core_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Hot and Cold", + "checkpoint_region": "west" + }, + { + "name": "c-00b", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "fire_ice_balls", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "core_toggles", "fire_ice_balls", "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "core_toggles" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Heart of the Mountain", + "checkpoint_region": "bottom" + }, + { + "name": "d-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "fire_ice_balls", "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "fire_ice_balls", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "bumpers", "core_toggles", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [ [ "core_blocks", "core_toggles", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dash_refills", "springs", "coins", "bumpers", "feathers", "badeline_boosters", "core_blocks", "core_toggles", "fire_ice_balls", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "west", + "dest_room": "0x", + "dest_door": "east" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "bottom" + }, + { + "source_room": "a-03", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-07b", + "dest_door": "bottom" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "east" + }, + { + "source_room": "b-05", + "source_door": "west", + "dest_room": "b-04", + "dest_door": "north-west" + }, + { + "source_room": "b-07b", + "source_door": "top", + "dest_room": "b-07", + "dest_door": "bottom" + }, + { + "source_room": "b-07", + "source_door": "top", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-east", + "dest_room": "c-00b", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "north", + "dest_room": "c-03b", + "dest_door": "south" + }, + { + "source_room": "c-03b", + "source_door": "west", + "dest_room": "c-03", + "dest_door": "north-west" + }, + { + "source_room": "c-03b", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "north-east" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "top", + "dest_room": "d-01", + "dest_door": "bottom" + }, + { + "source_room": "d-01", + "source_door": "top", + "dest_room": "d-02", + "dest_door": "bottom" + }, + { + "source_room": "d-02", + "source_door": "top", + "dest_room": "d-03", + "dest_door": "bottom" + }, + { + "source_room": "d-03", + "source_door": "top", + "dest_room": "d-04", + "dest_door": "bottom" + }, + { + "source_room": "d-04", + "source_door": "top", + "dest_room": "d-05", + "dest_door": "bottom" + }, + { + "source_room": "d-05", + "source_door": "top", + "dest_room": "d-06", + "dest_door": "bottom" + }, + { + "source_room": "d-06", + "source_door": "top", + "dest_room": "d-07", + "dest_door": "bottom" + }, + { + "source_room": "d-07", + "source_door": "top", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-10b", + "dest_door": "west" + }, + { + "source_room": "d-10b", + "source_door": "east", + "dest_room": "d-10c", + "dest_door": "west" + }, + { + "source_room": "d-10c", + "source_door": "east", + "dest_room": "d-11", + "dest_door": "west" + }, + { + "source_room": "d-11", + "source_door": "east", + "dest_room": "space", + "dest_door": "west" + } + ] + }, + { + "name": "9b", + "display_name": "Core B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Into the Core", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "fire_ice_balls" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Burning or Freezing", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles", "fire_ice_balls", "bumpers", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Heartbeat", + "checkpoint_region": "bottom" + }, + { + "name": "c-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles", "bumpers", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "springs", "traffic_blocks", "dream_blocks", "moving_platforms", "blue_clouds", "swap_blocks", "kevin_blocks", "core_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles", "core_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "dash_refills", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dash_refills", "bumpers", "coins", "springs", "traffic_blocks", "dream_blocks", "moving_platforms", "blue_clouds", "swap_blocks", "kevin_blocks", "core_blocks", "badeline_boosters", "core_toggles", "fire_ice_balls", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "bottom" + }, + { + "source_room": "c-01", + "source_door": "top", + "dest_room": "c-02", + "dest_door": "bottom" + }, + { + "source_room": "c-02", + "source_door": "top", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "c-04", + "dest_door": "bottom" + }, + { + "source_room": "c-04", + "source_door": "top", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-05", + "source_door": "east", + "dest_room": "c-06", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "space", + "dest_door": "west" + } + ] + }, + { + "name": "9c", + "display_name": "Core C", + "rooms": [ + { + "name": "intro", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "dash_refills", "core_toggles", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "core_toggles", "dream_blocks", "bumpers", "pink_clouds", "swap_blocks", "kevin_blocks", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "core_toggles", "dream_blocks", "bumpers", "pink_clouds", "swap_blocks", "kevin_blocks", "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "intro", + "source_door": "east", + "dest_room": "00", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "10a", + "display_name": "Farewell", + "rooms": [ + { + "name": "intro-00-past", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "intro-01-future", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "badeline_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "intro-02-launch", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "intro-03-space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Singular", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins", "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "dream_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "jellyfish", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Power Source", + "checkpoint_region": "west" + }, + { + "name": "c-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-alt-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-alt-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters", "Power Source Key 1", "Power Source Key 2", "Power Source Key 3", "Power Source Key 4", "Power Source Key 5" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "Power Source Key 5" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [ [ "double_dash_refills", "dash_switches" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "double_dash_refills", "springs", "dash_switches" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "jellyfish", "dash_switches" ] ] + }, + { + "dest": "breaker", + "rule": [ [ "jellyfish", "springs", "dash_switches", "breaker_boxes" ] ] + } + ] + }, + { + "name": "breaker", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-east-door", + "rule": [] + }, + { + "dest": "south-east-door", + "rule": [] + }, + { + "dest": "south-west-door", + "rule": [] + }, + { + "dest": "west-door", + "rule": [] + }, + { + "dest": "north-west-door", + "rule": [] + } + ] + }, + { + "name": "north-east-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "south-east-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "south-west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "north-west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-door", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-door", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-door", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west-door", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west-door", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_1", + "display_name": "Power Source Key 1", + "type": "key", + "rule": [ [ "double_dash_refills", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "breaker_boxes" ] ] + }, + { + "name": "key_2", + "display_name": "Power Source Key 2", + "type": "key", + "rule": [ [ "breaker_boxes", "double_dash_refills", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_3", + "display_name": "Power Source Key 3", + "type": "key", + "rule": [ [ "dash_refills", "dash_switches", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "breaker_boxes" ] ] + }, + { + "name": "key_4", + "display_name": "Power Source Key 4", + "type": "key", + "rule": [ [ "breaker_boxes", "double_dash_refills", "springs", "move_blocks", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_5", + "display_name": "Power Source Key 5", + "type": "key", + "rule": [ [ "double_dash_refills", "coins", "red_boosters", "jellyfish" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00y", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00yb", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters", "dash_refills", "double_dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00z", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Remembered", + "checkpoint_region": "south" + }, + { + "name": "e-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "blue_clouds", "pufferfish", "coins", "double_dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "car", + "display_name": "Secret Car", + "type": "car", + "rule": [ [ "jellyfish", "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "coins", "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart?", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "intro-00-past", + "source_door": "east", + "dest_room": "intro-01-future", + "dest_door": "west" + }, + { + "source_room": "intro-01-future", + "source_door": "east", + "dest_room": "intro-02-launch", + "dest_door": "bottom" + }, + { + "source_room": "intro-02-launch", + "source_door": "top", + "dest_room": "intro-03-space", + "dest_door": "west" + }, + { + "source_room": "intro-03-space", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-00b", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-east", + "dest_room": "c-alt-00", + "dest_door": "west" + }, + { + "source_room": "c-00b", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "south" + }, + { + "source_room": "c-alt-00", + "source_door": "east", + "dest_room": "c-alt-01", + "dest_door": "west" + }, + { + "source_room": "c-alt-01", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "south-west" + }, + { + "source_room": "c-03", + "source_door": "north", + "dest_room": "d-00", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "north-east-door", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "south-east-door", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "south-west-door", + "dest_room": "d-01", + "dest_door": "east" + }, + { + "source_room": "d-00", + "source_door": "west-door", + "dest_room": "d-02", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "north-west-door", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "north", + "dest_room": "d-05", + "dest_door": "south" + }, + { + "source_room": "d-05", + "source_door": "north", + "dest_room": "e-00y", + "dest_door": "south" + }, + { + "source_room": "e-00y", + "source_door": "north", + "dest_room": "e-00z", + "dest_door": "south" + }, + { + "source_room": "e-00y", + "source_door": "south-east", + "dest_room": "e-00yb", + "dest_door": "south" + }, + { + "source_room": "e-00yb", + "source_door": "north", + "dest_room": "e-00y", + "dest_door": "north-east" + }, + { + "source_room": "e-00z", + "source_door": "north", + "dest_room": "e-00", + "dest_door": "south" + }, + { + "source_room": "e-00", + "source_door": "north", + "dest_room": "e-00b", + "dest_door": "south" + }, + { + "source_room": "e-00b", + "source_door": "north", + "dest_room": "e-01", + "dest_door": "south" + }, + { + "source_room": "e-01", + "source_door": "north", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-05b", + "dest_door": "west" + }, + { + "source_room": "e-05b", + "source_door": "east", + "dest_room": "e-05c", + "dest_door": "west" + }, + { + "source_room": "e-05c", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "west" + }, + { + "source_room": "e-07", + "source_door": "east", + "dest_room": "e-08", + "dest_door": "west" + } + ] + }, + { + "name": "10b", + "display_name": "Farewell", + "rooms": [ + { + "name": "f-door", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Event Horizon", + "checkpoint_region": "west" + }, + { + "name": "f-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "car", + "display_name": "Internet Car", + "type": "car", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "kevin_blocks", "dream_blocks", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "double_dash_refills", "dash_refills", "springs", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Determination", + "checkpoint_region": "west" + }, + { + "name": "h-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "springs", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "double_dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-03b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "double_dash_refills", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-04", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-04b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-06b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "fire_ice_balls", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "springs", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [ [ "blue_boosters", "springs", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins", "feathers", "kevin_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Stubbornness", + "checkpoint_region": "west" + }, + { + "name": "i-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "springs", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "springs", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reconciliation", + "checkpoint_region": "west" + }, + { + "name": "j-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "springs", "jellyfish", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bird", "badeline_boosters", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "feathers", "springs", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks", "dash_refills", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "move_blocks", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills", "double_dash_refills", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "feathers", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "pufferfish", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-14b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "jellyfish", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "pufferfish", "springs", "dash_refills", "double_dash_refills", "coins", "feathers", "bird", "badeline_boosters", "breaker_boxes" ] ] + }, + { + "dest": "top", + "rule": [ [ "jellyfish", "pufferfish", "springs", "dash_refills", "double_dash_refills", "coins", "feathers", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Farewell", + "checkpoint_region": "west" + }, + { + "name": "j-17", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-19", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "jellyfish", "springs", "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "moon_berry", + "display_name": "Moon Berry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "GOAL", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "moon", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + }, + { + "name": "moon", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "main", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "moon", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "f-door", + "source_door": "east", + "dest_room": "f-00", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-01", + "dest_door": "west" + }, + { + "source_room": "f-01", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "west" + }, + { + "source_room": "f-03", + "source_door": "east", + "dest_room": "f-04", + "dest_door": "west" + }, + { + "source_room": "f-04", + "source_door": "east", + "dest_room": "f-05", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "east", + "dest_room": "f-06", + "dest_door": "west" + }, + { + "source_room": "f-06", + "source_door": "east", + "dest_room": "f-07", + "dest_door": "west" + }, + { + "source_room": "f-07", + "source_door": "east", + "dest_room": "f-08", + "dest_door": "west" + }, + { + "source_room": "f-08", + "source_door": "east", + "dest_room": "f-09", + "dest_door": "west" + }, + { + "source_room": "f-09", + "source_door": "east", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + }, + { + "source_room": "g-03", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "west" + }, + { + "source_room": "g-02", + "source_door": "east", + "dest_room": "g-04", + "dest_door": "west" + }, + { + "source_room": "g-04", + "source_door": "east", + "dest_room": "g-05", + "dest_door": "west" + }, + { + "source_room": "g-05", + "source_door": "east", + "dest_room": "g-06", + "dest_door": "west" + }, + { + "source_room": "g-06", + "source_door": "east", + "dest_room": "h-00b", + "dest_door": "west" + }, + { + "source_room": "h-00b", + "source_door": "east", + "dest_room": "h-00", + "dest_door": "west" + }, + { + "source_room": "h-00", + "source_door": "east", + "dest_room": "h-01", + "dest_door": "west" + }, + { + "source_room": "h-01", + "source_door": "east", + "dest_room": "h-02", + "dest_door": "west" + }, + { + "source_room": "h-02", + "source_door": "east", + "dest_room": "h-03", + "dest_door": "west" + }, + { + "source_room": "h-03", + "source_door": "east", + "dest_room": "h-03b", + "dest_door": "west" + }, + { + "source_room": "h-03b", + "source_door": "east", + "dest_room": "h-04", + "dest_door": "top" + }, + { + "source_room": "h-04", + "source_door": "east", + "dest_room": "h-04b", + "dest_door": "west" + }, + { + "source_room": "h-04", + "source_door": "bottom", + "dest_room": "h-05", + "dest_door": "west" + }, + { + "source_room": "h-04b", + "source_door": "east", + "dest_room": "h-05", + "dest_door": "top" + }, + { + "source_room": "h-05", + "source_door": "east", + "dest_room": "h-06", + "dest_door": "west" + }, + { + "source_room": "h-06", + "source_door": "east", + "dest_room": "h-06b", + "dest_door": "bottom" + }, + { + "source_room": "h-06b", + "source_door": "top", + "dest_room": "h-07", + "dest_door": "west" + }, + { + "source_room": "h-07", + "source_door": "east", + "dest_room": "h-08", + "dest_door": "west" + }, + { + "source_room": "h-08", + "source_door": "east", + "dest_room": "h-09", + "dest_door": "west" + }, + { + "source_room": "h-09", + "source_door": "east", + "dest_room": "h-10", + "dest_door": "west" + }, + { + "source_room": "h-10", + "source_door": "east", + "dest_room": "i-00", + "dest_door": "west" + }, + { + "source_room": "i-00", + "source_door": "east", + "dest_room": "i-00b", + "dest_door": "west" + }, + { + "source_room": "i-00b", + "source_door": "east", + "dest_room": "i-01", + "dest_door": "west" + }, + { + "source_room": "i-01", + "source_door": "east", + "dest_room": "i-02", + "dest_door": "west" + }, + { + "source_room": "i-02", + "source_door": "east", + "dest_room": "i-03", + "dest_door": "west" + }, + { + "source_room": "i-03", + "source_door": "east", + "dest_room": "i-04", + "dest_door": "west" + }, + { + "source_room": "i-04", + "source_door": "east", + "dest_room": "i-05", + "dest_door": "west" + }, + { + "source_room": "i-05", + "source_door": "east", + "dest_room": "j-00", + "dest_door": "west" + }, + { + "source_room": "j-00", + "source_door": "east", + "dest_room": "j-00b", + "dest_door": "west" + }, + { + "source_room": "j-00b", + "source_door": "east", + "dest_room": "j-01", + "dest_door": "west" + }, + { + "source_room": "j-01", + "source_door": "east", + "dest_room": "j-02", + "dest_door": "west" + }, + { + "source_room": "j-02", + "source_door": "east", + "dest_room": "j-03", + "dest_door": "west" + }, + { + "source_room": "j-03", + "source_door": "east", + "dest_room": "j-04", + "dest_door": "west" + }, + { + "source_room": "j-04", + "source_door": "east", + "dest_room": "j-05", + "dest_door": "west" + }, + { + "source_room": "j-05", + "source_door": "east", + "dest_room": "j-06", + "dest_door": "west" + }, + { + "source_room": "j-06", + "source_door": "east", + "dest_room": "j-07", + "dest_door": "west" + }, + { + "source_room": "j-07", + "source_door": "east", + "dest_room": "j-08", + "dest_door": "west" + }, + { + "source_room": "j-08", + "source_door": "east", + "dest_room": "j-09", + "dest_door": "west" + }, + { + "source_room": "j-09", + "source_door": "east", + "dest_room": "j-10", + "dest_door": "west" + }, + { + "source_room": "j-10", + "source_door": "east", + "dest_room": "j-11", + "dest_door": "west" + }, + { + "source_room": "j-11", + "source_door": "east", + "dest_room": "j-12", + "dest_door": "west" + }, + { + "source_room": "j-12", + "source_door": "east", + "dest_room": "j-13", + "dest_door": "west" + }, + { + "source_room": "j-13", + "source_door": "east", + "dest_room": "j-14", + "dest_door": "west" + }, + { + "source_room": "j-14", + "source_door": "east", + "dest_room": "j-14b", + "dest_door": "west" + }, + { + "source_room": "j-14b", + "source_door": "east", + "dest_room": "j-15", + "dest_door": "west" + }, + { + "source_room": "j-15", + "source_door": "east", + "dest_room": "j-16", + "dest_door": "west" + }, + { + "source_room": "j-16", + "source_door": "east", + "dest_room": "GOAL", + "dest_door": "main" + }, + { + "source_room": "j-16", + "source_door": "top", + "dest_room": "j-17", + "dest_door": "south" + }, + { + "source_room": "j-17", + "source_door": "west", + "dest_room": "j-18", + "dest_door": "west" + }, + { + "source_room": "j-17", + "source_door": "east", + "dest_room": "j-19", + "dest_door": "bottom" + }, + { + "source_room": "j-18", + "source_door": "east", + "dest_room": "j-17", + "dest_door": "north" + }, + { + "source_room": "j-19", + "source_door": "top", + "dest_room": "GOAL", + "dest_door": "moon" + } + ] + }, + { + "name": "10c", + "display_name": "Farewell", + "rooms": [ + { + "name": "end-golden", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "double_dash_refills", "jellyfish", "springs", "pufferfish", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_3", + "display_name": "Binoculars 3", + "type": "binoculars", + "rule": [ [ "double_dash_refills", "jellyfish", "springs", "pufferfish" ] ] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "traffic_blocks", "dash_refills", "double_dash_refills", "dream_blocks", "swap_blocks", "move_blocks", "blue_boosters", "springs", "feathers", "coins", "red_boosters", "kevin_blocks", "core_blocks", "fire_ice_balls", "badeline_boosters", "bird", "breaker_boxes", "pufferfish", "jellyfish", "pink_cassette_blocks", "blue_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [] + } + ] +} \ No newline at end of file diff --git a/worlds/celeste_open_world/data/CelesteLevelData.py b/worlds/celeste_open_world/data/CelesteLevelData.py new file mode 100644 index 00000000..f4c492dd --- /dev/null +++ b/worlds/celeste_open_world/data/CelesteLevelData.py @@ -0,0 +1,9792 @@ +# THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MANUALLY EDIT. + +from ..Levels import Level, Room, PreRegion, LevelLocation, RegionConnection, RoomConnection, Door, DoorDirection, LocationType +from ..Names import ItemName + +all_doors: dict[str, Door] = { + "0a_-1_east": Door("0a_-1_east", "0a_-1", DoorDirection.right, False, False), + + "0a_0_west": Door("0a_0_west", "0a_0", DoorDirection.left, False, False), + "0a_0_east": Door("0a_0_east", "0a_0", DoorDirection.right, False, False), + "0a_0_north": Door("0a_0_north", "0a_0", DoorDirection.up, False, False), + + "0a_0b_south": Door("0a_0b_south", "0a_0b", DoorDirection.down, False, False), + + "0a_1_west": Door("0a_1_west", "0a_1", DoorDirection.left, False, False), + "0a_1_east": Door("0a_1_east", "0a_1", DoorDirection.right, False, False), + + "0a_2_west": Door("0a_2_west", "0a_2", DoorDirection.left, False, False), + "0a_2_east": Door("0a_2_east", "0a_2", DoorDirection.right, False, False), + + "0a_3_west": Door("0a_3_west", "0a_3", DoorDirection.left, False, False), + + "1a_1_east": Door("1a_1_east", "1a_1", DoorDirection.up, False, False), + + "1a_2_west": Door("1a_2_west", "1a_2", DoorDirection.down, False, True), + "1a_2_east": Door("1a_2_east", "1a_2", DoorDirection.up, False, False), + + "1a_3_west": Door("1a_3_west", "1a_3", DoorDirection.down, False, True), + "1a_3_east": Door("1a_3_east", "1a_3", DoorDirection.up, False, False), + + "1a_4_west": Door("1a_4_west", "1a_4", DoorDirection.down, False, True), + "1a_4_east": Door("1a_4_east", "1a_4", DoorDirection.up, False, False), + + "1a_3b_west": Door("1a_3b_west", "1a_3b", DoorDirection.down, False, True), + "1a_3b_top": Door("1a_3b_top", "1a_3b", DoorDirection.up, False, False), + + "1a_5_bottom": Door("1a_5_bottom", "1a_5", DoorDirection.down, False, True), + "1a_5_west": Door("1a_5_west", "1a_5", DoorDirection.left, False, False), + "1a_5_south-east": Door("1a_5_south-east", "1a_5", DoorDirection.right, True, False), + "1a_5_top": Door("1a_5_top", "1a_5", DoorDirection.up, False, False), + + "1a_5z_east": Door("1a_5z_east", "1a_5z", DoorDirection.right, False, False), + + "1a_5a_west": Door("1a_5a_west", "1a_5a", DoorDirection.left, False, False), + + "1a_6_south-west": Door("1a_6_south-west", "1a_6", DoorDirection.down, False, True), + "1a_6_west": Door("1a_6_west", "1a_6", DoorDirection.left, False, False), + "1a_6_east": Door("1a_6_east", "1a_6", DoorDirection.right, False, False), + + "1a_6z_north-west": Door("1a_6z_north-west", "1a_6z", DoorDirection.up, False, False), + "1a_6z_west": Door("1a_6z_west", "1a_6z", DoorDirection.left, False, False), + "1a_6z_east": Door("1a_6z_east", "1a_6z", DoorDirection.right, False, False), + + "1a_6zb_north-west": Door("1a_6zb_north-west", "1a_6zb", DoorDirection.up, False, True), + "1a_6zb_east": Door("1a_6zb_east", "1a_6zb", DoorDirection.right, False, False), + + "1a_7zb_west": Door("1a_7zb_west", "1a_7zb", DoorDirection.down, False, False), + "1a_7zb_east": Door("1a_7zb_east", "1a_7zb", DoorDirection.down, False, False), + + "1a_6a_west": Door("1a_6a_west", "1a_6a", DoorDirection.left, False, False), + "1a_6a_east": Door("1a_6a_east", "1a_6a", DoorDirection.right, False, False), + + "1a_6b_north-west": Door("1a_6b_north-west", "1a_6b", DoorDirection.left, False, False), + "1a_6b_south-west": Door("1a_6b_south-west", "1a_6b", DoorDirection.left, False, False), + "1a_6b_north-east": Door("1a_6b_north-east", "1a_6b", DoorDirection.right, False, False), + + "1a_s0_west": Door("1a_s0_west", "1a_s0", DoorDirection.left, False, False), + "1a_s0_east": Door("1a_s0_east", "1a_s0", DoorDirection.right, False, False), + + "1a_s1_east": Door("1a_s1_east", "1a_s1", DoorDirection.right, False, False), + + "1a_6c_south-west": Door("1a_6c_south-west", "1a_6c", DoorDirection.left, False, False), + "1a_6c_north-west": Door("1a_6c_north-west", "1a_6c", DoorDirection.left, True, False), + "1a_6c_north-east": Door("1a_6c_north-east", "1a_6c", DoorDirection.up, False, False), + + "1a_7_west": Door("1a_7_west", "1a_7", DoorDirection.down, False, True), + "1a_7_east": Door("1a_7_east", "1a_7", DoorDirection.up, False, False), + + "1a_7z_bottom": Door("1a_7z_bottom", "1a_7z", DoorDirection.right, False, False), + "1a_7z_top": Door("1a_7z_top", "1a_7z", DoorDirection.up, True, False), + + "1a_8z_bottom": Door("1a_8z_bottom", "1a_8z", DoorDirection.down, False, False), + "1a_8z_top": Door("1a_8z_top", "1a_8z", DoorDirection.right, False, False), + + "1a_8zb_west": Door("1a_8zb_west", "1a_8zb", DoorDirection.left, False, False), + "1a_8zb_east": Door("1a_8zb_east", "1a_8zb", DoorDirection.right, False, False), + + "1a_8_south-west": Door("1a_8_south-west", "1a_8", DoorDirection.down, False, True), + "1a_8_west": Door("1a_8_west", "1a_8", DoorDirection.left, False, True), + "1a_8_south": Door("1a_8_south", "1a_8", DoorDirection.down, False, False), + "1a_8_south-east": Door("1a_8_south-east", "1a_8", DoorDirection.down, False, True), + "1a_8_north": Door("1a_8_north", "1a_8", DoorDirection.up, False, False), + "1a_8_north-east": Door("1a_8_north-east", "1a_8", DoorDirection.right, False, False), + + "1a_7a_west": Door("1a_7a_west", "1a_7a", DoorDirection.up, False, False), + "1a_7a_east": Door("1a_7a_east", "1a_7a", DoorDirection.up, False, False), + + "1a_9z_east": Door("1a_9z_east", "1a_9z", DoorDirection.down, False, False), + + "1a_8b_west": Door("1a_8b_west", "1a_8b", DoorDirection.left, False, False), + "1a_8b_east": Door("1a_8b_east", "1a_8b", DoorDirection.up, False, False), + + "1a_9_west": Door("1a_9_west", "1a_9", DoorDirection.down, False, True), + "1a_9_east": Door("1a_9_east", "1a_9", DoorDirection.right, False, False), + + "1a_9b_west": Door("1a_9b_west", "1a_9b", DoorDirection.left, False, False), + "1a_9b_north-west": Door("1a_9b_north-west", "1a_9b", DoorDirection.up, False, False), + "1a_9b_east": Door("1a_9b_east", "1a_9b", DoorDirection.right, False, False), + "1a_9b_north-east": Door("1a_9b_north-east", "1a_9b", DoorDirection.up, False, False), + + "1a_9c_west": Door("1a_9c_west", "1a_9c", DoorDirection.left, False, True), + + "1a_10_south-east": Door("1a_10_south-east", "1a_10", DoorDirection.down, False, False), + "1a_10_south-west": Door("1a_10_south-west", "1a_10", DoorDirection.left, False, False), + "1a_10_north-west": Door("1a_10_north-west", "1a_10", DoorDirection.up, False, False), + "1a_10_north-east": Door("1a_10_north-east", "1a_10", DoorDirection.up, False, True), + + "1a_10z_west": Door("1a_10z_west", "1a_10z", DoorDirection.left, False, False), + "1a_10z_east": Door("1a_10z_east", "1a_10z", DoorDirection.right, False, False), + + "1a_10zb_east": Door("1a_10zb_east", "1a_10zb", DoorDirection.right, False, False), + + "1a_11_south": Door("1a_11_south", "1a_11", DoorDirection.down, False, False), + "1a_11_south-west": Door("1a_11_south-west", "1a_11", DoorDirection.down, False, False), + "1a_11_west": Door("1a_11_west", "1a_11", DoorDirection.left, False, False), + "1a_11_south-east": Door("1a_11_south-east", "1a_11", DoorDirection.down, False, True), + "1a_11_north": Door("1a_11_north", "1a_11", DoorDirection.up, False, False), + + "1a_11z_east": Door("1a_11z_east", "1a_11z", DoorDirection.right, False, False), + + "1a_10a_bottom": Door("1a_10a_bottom", "1a_10a", DoorDirection.down, False, False), + "1a_10a_top": Door("1a_10a_top", "1a_10a", DoorDirection.up, False, False), + + "1a_12_south-west": Door("1a_12_south-west", "1a_12", DoorDirection.down, False, True), + "1a_12_north-west": Door("1a_12_north-west", "1a_12", DoorDirection.left, False, False), + "1a_12_east": Door("1a_12_east", "1a_12", DoorDirection.right, False, True), + + "1a_12z_east": Door("1a_12z_east", "1a_12z", DoorDirection.right, False, False), + + "1a_12a_bottom": Door("1a_12a_bottom", "1a_12a", DoorDirection.left, False, False), + "1a_12a_top": Door("1a_12a_top", "1a_12a", DoorDirection.up, False, False), + + "1a_end_south": Door("1a_end_south", "1a_end", DoorDirection.down, False, True), + + "1b_00_east": Door("1b_00_east", "1b_00", DoorDirection.up, False, False), + + "1b_01_west": Door("1b_01_west", "1b_01", DoorDirection.down, False, True), + "1b_01_east": Door("1b_01_east", "1b_01", DoorDirection.up, False, False), + + "1b_02_west": Door("1b_02_west", "1b_02", DoorDirection.down, False, True), + "1b_02_east": Door("1b_02_east", "1b_02", DoorDirection.up, False, False), + + "1b_02b_west": Door("1b_02b_west", "1b_02b", DoorDirection.down, False, True), + "1b_02b_east": Door("1b_02b_east", "1b_02b", DoorDirection.up, False, False), + + "1b_03_west": Door("1b_03_west", "1b_03", DoorDirection.down, False, True), + "1b_03_east": Door("1b_03_east", "1b_03", DoorDirection.right, False, False), + + "1b_04_west": Door("1b_04_west", "1b_04", DoorDirection.left, False, True), + "1b_04_east": Door("1b_04_east", "1b_04", DoorDirection.up, False, False), + + "1b_05_west": Door("1b_05_west", "1b_05", DoorDirection.down, False, True), + "1b_05_east": Door("1b_05_east", "1b_05", DoorDirection.up, False, False), + + "1b_05b_west": Door("1b_05b_west", "1b_05b", DoorDirection.down, False, True), + "1b_05b_east": Door("1b_05b_east", "1b_05b", DoorDirection.up, False, False), + + "1b_06_west": Door("1b_06_west", "1b_06", DoorDirection.down, False, True), + "1b_06_east": Door("1b_06_east", "1b_06", DoorDirection.right, False, False), + + "1b_07_bottom": Door("1b_07_bottom", "1b_07", DoorDirection.left, False, False), + "1b_07_top": Door("1b_07_top", "1b_07", DoorDirection.up, False, False), + + "1b_08_west": Door("1b_08_west", "1b_08", DoorDirection.down, False, True), + "1b_08_east": Door("1b_08_east", "1b_08", DoorDirection.up, False, False), + + "1b_08b_west": Door("1b_08b_west", "1b_08b", DoorDirection.down, False, True), + "1b_08b_east": Door("1b_08b_east", "1b_08b", DoorDirection.up, False, False), + + "1b_09_west": Door("1b_09_west", "1b_09", DoorDirection.down, False, True), + "1b_09_east": Door("1b_09_east", "1b_09", DoorDirection.right, False, False), + + "1b_10_west": Door("1b_10_west", "1b_10", DoorDirection.left, False, False), + "1b_10_east": Door("1b_10_east", "1b_10", DoorDirection.right, False, False), + + "1b_11_bottom": Door("1b_11_bottom", "1b_11", DoorDirection.left, False, False), + "1b_11_top": Door("1b_11_top", "1b_11", DoorDirection.up, False, False), + + "1b_end_west": Door("1b_end_west", "1b_end", DoorDirection.down, False, True), + + "1c_00_east": Door("1c_00_east", "1c_00", DoorDirection.right, False, False), + + "1c_01_west": Door("1c_01_west", "1c_01", DoorDirection.left, False, True), + "1c_01_east": Door("1c_01_east", "1c_01", DoorDirection.right, False, False), + + "1c_02_west": Door("1c_02_west", "1c_02", DoorDirection.left, False, True), + + "2a_start_east": Door("2a_start_east", "2a_start", DoorDirection.right, False, False), + "2a_start_top": Door("2a_start_top", "2a_start", DoorDirection.up, False, False), + + "2a_s0_bottom": Door("2a_s0_bottom", "2a_s0", DoorDirection.down, False, False), + "2a_s0_top": Door("2a_s0_top", "2a_s0", DoorDirection.up, False, False), + + "2a_s1_bottom": Door("2a_s1_bottom", "2a_s1", DoorDirection.down, False, False), + "2a_s1_top": Door("2a_s1_top", "2a_s1", DoorDirection.up, False, False), + + "2a_s2_bottom": Door("2a_s2_bottom", "2a_s2", DoorDirection.down, False, False), + + "2a_0_south-west": Door("2a_0_south-west", "2a_0", DoorDirection.left, False, False), + "2a_0_south-east": Door("2a_0_south-east", "2a_0", DoorDirection.right, False, False), + "2a_0_north-west": Door("2a_0_north-west", "2a_0", DoorDirection.up, False, False), + "2a_0_north-east": Door("2a_0_north-east", "2a_0", DoorDirection.right, False, False), + + "2a_1_south-west": Door("2a_1_south-west", "2a_1", DoorDirection.left, False, False), + "2a_1_south-east": Door("2a_1_south-east", "2a_1", DoorDirection.right, False, False), + "2a_1_north-west": Door("2a_1_north-west", "2a_1", DoorDirection.left, False, False), + "2a_1_south": Door("2a_1_south", "2a_1", DoorDirection.down, False, False), + + "2a_d0_north": Door("2a_d0_north", "2a_d0", DoorDirection.up, False, False), + "2a_d0_north-west": Door("2a_d0_north-west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_west": Door("2a_d0_west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_south-west": Door("2a_d0_south-west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_south": Door("2a_d0_south", "2a_d0", DoorDirection.down, False, False), + "2a_d0_south-east": Door("2a_d0_south-east", "2a_d0", DoorDirection.right, True, False), + "2a_d0_east": Door("2a_d0_east", "2a_d0", DoorDirection.right, False, False), + "2a_d0_north-east": Door("2a_d0_north-east", "2a_d0", DoorDirection.right, False, False), + + "2a_d7_west": Door("2a_d7_west", "2a_d7", DoorDirection.left, False, False), + "2a_d7_east": Door("2a_d7_east", "2a_d7", DoorDirection.right, False, False), + + "2a_d8_west": Door("2a_d8_west", "2a_d8", DoorDirection.left, False, False), + "2a_d8_south-east": Door("2a_d8_south-east", "2a_d8", DoorDirection.right, False, False), + "2a_d8_north-east": Door("2a_d8_north-east", "2a_d8", DoorDirection.right, False, False), + + "2a_d3_west": Door("2a_d3_west", "2a_d3", DoorDirection.left, False, False), + "2a_d3_south": Door("2a_d3_south", "2a_d3", DoorDirection.left, False, False), + "2a_d3_north": Door("2a_d3_north", "2a_d3", DoorDirection.left, False, False), + + "2a_d2_west": Door("2a_d2_west", "2a_d2", DoorDirection.left, False, False), + "2a_d2_north-west": Door("2a_d2_north-west", "2a_d2", DoorDirection.up, False, True), + "2a_d2_east": Door("2a_d2_east", "2a_d2", DoorDirection.right, False, False), + + "2a_d9_north-west": Door("2a_d9_north-west", "2a_d9", DoorDirection.up, False, False), + + "2a_d1_north-east": Door("2a_d1_north-east", "2a_d1", DoorDirection.right, False, False), + "2a_d1_south-east": Door("2a_d1_south-east", "2a_d1", DoorDirection.right, False, False), + "2a_d1_south-west": Door("2a_d1_south-west", "2a_d1", DoorDirection.down, True, False), + + "2a_d6_west": Door("2a_d6_west", "2a_d6", DoorDirection.up, False, False), + "2a_d6_east": Door("2a_d6_east", "2a_d6", DoorDirection.right, False, False), + + "2a_d4_west": Door("2a_d4_west", "2a_d4", DoorDirection.left, False, False), + "2a_d4_east": Door("2a_d4_east", "2a_d4", DoorDirection.right, False, False), + "2a_d4_south": Door("2a_d4_south", "2a_d4", DoorDirection.down, False, False), + + "2a_d5_west": Door("2a_d5_west", "2a_d5", DoorDirection.left, False, False), + + "2a_3x_bottom": Door("2a_3x_bottom", "2a_3x", DoorDirection.down, False, False), + "2a_3x_top": Door("2a_3x_top", "2a_3x", DoorDirection.up, False, False), + + "2a_3_bottom": Door("2a_3_bottom", "2a_3", DoorDirection.down, False, True), + "2a_3_top": Door("2a_3_top", "2a_3", DoorDirection.up, False, False), + + "2a_4_bottom": Door("2a_4_bottom", "2a_4", DoorDirection.down, False, True), + "2a_4_top": Door("2a_4_top", "2a_4", DoorDirection.up, False, False), + + "2a_5_bottom": Door("2a_5_bottom", "2a_5", DoorDirection.down, False, True), + "2a_5_top": Door("2a_5_top", "2a_5", DoorDirection.up, False, False), + + "2a_6_bottom": Door("2a_6_bottom", "2a_6", DoorDirection.down, False, True), + "2a_6_top": Door("2a_6_top", "2a_6", DoorDirection.up, False, False), + + "2a_7_bottom": Door("2a_7_bottom", "2a_7", DoorDirection.down, False, True), + "2a_7_top": Door("2a_7_top", "2a_7", DoorDirection.up, False, False), + + "2a_8_bottom": Door("2a_8_bottom", "2a_8", DoorDirection.down, False, True), + "2a_8_top": Door("2a_8_top", "2a_8", DoorDirection.right, False, False), + + "2a_9_west": Door("2a_9_west", "2a_9", DoorDirection.left, False, False), + "2a_9_north": Door("2a_9_north", "2a_9", DoorDirection.up, False, False), + "2a_9_north-west": Door("2a_9_north-west", "2a_9", DoorDirection.up, False, False), + "2a_9_south-east": Door("2a_9_south-east", "2a_9", DoorDirection.down, False, False), + + "2a_9b_east": Door("2a_9b_east", "2a_9b", DoorDirection.down, False, True), + "2a_9b_west": Door("2a_9b_west", "2a_9b", DoorDirection.down, False, False), + + "2a_10_bottom": Door("2a_10_bottom", "2a_10", DoorDirection.down, False, True), + "2a_10_top": Door("2a_10_top", "2a_10", DoorDirection.up, False, False), + + "2a_2_north-west": Door("2a_2_north-west", "2a_2", DoorDirection.up, False, False), + "2a_2_south-west": Door("2a_2_south-west", "2a_2", DoorDirection.left, False, False), + "2a_2_south-east": Door("2a_2_south-east", "2a_2", DoorDirection.right, False, False), + + "2a_11_west": Door("2a_11_west", "2a_11", DoorDirection.left, False, False), + "2a_11_east": Door("2a_11_east", "2a_11", DoorDirection.right, False, False), + + "2a_12b_west": Door("2a_12b_west", "2a_12b", DoorDirection.left, False, False), + "2a_12b_north": Door("2a_12b_north", "2a_12b", DoorDirection.up, False, False), + "2a_12b_south": Door("2a_12b_south", "2a_12b", DoorDirection.down, False, False), + "2a_12b_south-east": Door("2a_12b_south-east", "2a_12b", DoorDirection.down, False, True), + "2a_12b_east": Door("2a_12b_east", "2a_12b", DoorDirection.right, False, True), + + "2a_12c_south": Door("2a_12c_south", "2a_12c", DoorDirection.down, False, False), + + "2a_12d_north-west": Door("2a_12d_north-west", "2a_12d", DoorDirection.up, False, False), + "2a_12d_north": Door("2a_12d_north", "2a_12d", DoorDirection.up, False, False), + + "2a_12_west": Door("2a_12_west", "2a_12", DoorDirection.left, False, False), + "2a_12_east": Door("2a_12_east", "2a_12", DoorDirection.right, False, False), + + "2a_13_west": Door("2a_13_west", "2a_13", DoorDirection.left, False, False), + "2a_13_phone": Door("2a_13_phone", "2a_13", DoorDirection.special, False, True), + + "2a_end_0_main": Door("2a_end_0_main", "2a_end_0", DoorDirection.special, False, True), + "2a_end_0_east": Door("2a_end_0_east", "2a_end_0", DoorDirection.right, False, False), + "2a_end_0_top": Door("2a_end_0_top", "2a_end_0", DoorDirection.up, False, False), + + "2a_end_s0_bottom": Door("2a_end_s0_bottom", "2a_end_s0", DoorDirection.down, False, False), + "2a_end_s0_top": Door("2a_end_s0_top", "2a_end_s0", DoorDirection.up, False, False), + + "2a_end_s1_bottom": Door("2a_end_s1_bottom", "2a_end_s1", DoorDirection.down, False, False), + + "2a_end_1_west": Door("2a_end_1_west", "2a_end_1", DoorDirection.left, False, False), + "2a_end_1_north-east": Door("2a_end_1_north-east", "2a_end_1", DoorDirection.right, False, False), + "2a_end_1_east": Door("2a_end_1_east", "2a_end_1", DoorDirection.right, False, False), + + "2a_end_2_north-west": Door("2a_end_2_north-west", "2a_end_2", DoorDirection.left, False, False), + "2a_end_2_west": Door("2a_end_2_west", "2a_end_2", DoorDirection.left, False, False), + "2a_end_2_north-east": Door("2a_end_2_north-east", "2a_end_2", DoorDirection.right, False, False), + "2a_end_2_east": Door("2a_end_2_east", "2a_end_2", DoorDirection.right, False, False), + + "2a_end_3_north-west": Door("2a_end_3_north-west", "2a_end_3", DoorDirection.left, False, True), + "2a_end_3_west": Door("2a_end_3_west", "2a_end_3", DoorDirection.left, False, True), + "2a_end_3_east": Door("2a_end_3_east", "2a_end_3", DoorDirection.right, False, False), + + "2a_end_4_west": Door("2a_end_4_west", "2a_end_4", DoorDirection.left, False, False), + "2a_end_4_east": Door("2a_end_4_east", "2a_end_4", DoorDirection.right, False, False), + + "2a_end_3b_west": Door("2a_end_3b_west", "2a_end_3b", DoorDirection.left, False, False), + "2a_end_3b_north": Door("2a_end_3b_north", "2a_end_3b", DoorDirection.up, False, False), + "2a_end_3b_east": Door("2a_end_3b_east", "2a_end_3b", DoorDirection.right, False, False), + + "2a_end_3cb_bottom": Door("2a_end_3cb_bottom", "2a_end_3cb", DoorDirection.down, False, False), + "2a_end_3cb_top": Door("2a_end_3cb_top", "2a_end_3cb", DoorDirection.up, False, False), + + "2a_end_3c_bottom": Door("2a_end_3c_bottom", "2a_end_3c", DoorDirection.down, False, False), + + "2a_end_5_west": Door("2a_end_5_west", "2a_end_5", DoorDirection.left, False, False), + "2a_end_5_east": Door("2a_end_5_east", "2a_end_5", DoorDirection.right, False, False), + + "2a_end_6_west": Door("2a_end_6_west", "2a_end_6", DoorDirection.left, False, False), + + "2b_start_east": Door("2b_start_east", "2b_start", DoorDirection.right, False, False), + + "2b_00_west": Door("2b_00_west", "2b_00", DoorDirection.left, False, False), + "2b_00_east": Door("2b_00_east", "2b_00", DoorDirection.right, False, False), + + "2b_01_west": Door("2b_01_west", "2b_01", DoorDirection.left, False, False), + "2b_01_east": Door("2b_01_east", "2b_01", DoorDirection.up, False, False), + + "2b_01b_west": Door("2b_01b_west", "2b_01b", DoorDirection.down, False, True), + "2b_01b_east": Door("2b_01b_east", "2b_01b", DoorDirection.up, False, False), + + "2b_02b_west": Door("2b_02b_west", "2b_02b", DoorDirection.down, False, True), + "2b_02b_east": Door("2b_02b_east", "2b_02b", DoorDirection.up, False, False), + + "2b_02_west": Door("2b_02_west", "2b_02", DoorDirection.down, False, True), + "2b_02_east": Door("2b_02_east", "2b_02", DoorDirection.up, False, False), + + "2b_03_west": Door("2b_03_west", "2b_03", DoorDirection.down, False, True), + "2b_03_east": Door("2b_03_east", "2b_03", DoorDirection.up, False, False), + + "2b_04_bottom": Door("2b_04_bottom", "2b_04", DoorDirection.down, False, True), + "2b_04_top": Door("2b_04_top", "2b_04", DoorDirection.up, False, False), + + "2b_05_bottom": Door("2b_05_bottom", "2b_05", DoorDirection.down, False, True), + "2b_05_top": Door("2b_05_top", "2b_05", DoorDirection.up, False, False), + + "2b_06_west": Door("2b_06_west", "2b_06", DoorDirection.down, False, True), + "2b_06_east": Door("2b_06_east", "2b_06", DoorDirection.right, False, False), + + "2b_07_bottom": Door("2b_07_bottom", "2b_07", DoorDirection.left, False, False), + "2b_07_top": Door("2b_07_top", "2b_07", DoorDirection.up, False, False), + + "2b_08b_west": Door("2b_08b_west", "2b_08b", DoorDirection.down, False, True), + "2b_08b_east": Door("2b_08b_east", "2b_08b", DoorDirection.up, False, False), + + "2b_08_west": Door("2b_08_west", "2b_08", DoorDirection.down, False, True), + "2b_08_east": Door("2b_08_east", "2b_08", DoorDirection.up, False, False), + + "2b_09_west": Door("2b_09_west", "2b_09", DoorDirection.down, False, True), + "2b_09_east": Door("2b_09_east", "2b_09", DoorDirection.right, False, False), + + "2b_10_west": Door("2b_10_west", "2b_10", DoorDirection.left, False, False), + "2b_10_east": Door("2b_10_east", "2b_10", DoorDirection.up, False, False), + + "2b_11_bottom": Door("2b_11_bottom", "2b_11", DoorDirection.down, False, True), + "2b_11_top": Door("2b_11_top", "2b_11", DoorDirection.up, False, False), + + "2b_end_west": Door("2b_end_west", "2b_end", DoorDirection.down, False, True), + + "2c_00_east": Door("2c_00_east", "2c_00", DoorDirection.right, False, False), + + "2c_01_west": Door("2c_01_west", "2c_01", DoorDirection.left, False, False), + "2c_01_east": Door("2c_01_east", "2c_01", DoorDirection.right, False, False), + + "2c_02_west": Door("2c_02_west", "2c_02", DoorDirection.left, False, True), + + "3a_s0_east": Door("3a_s0_east", "3a_s0", DoorDirection.right, False, False), + + "3a_s1_west": Door("3a_s1_west", "3a_s1", DoorDirection.left, False, False), + "3a_s1_east": Door("3a_s1_east", "3a_s1", DoorDirection.right, False, False), + "3a_s1_north-east": Door("3a_s1_north-east", "3a_s1", DoorDirection.right, False, False), + + "3a_s2_west": Door("3a_s2_west", "3a_s2", DoorDirection.left, False, False), + "3a_s2_north-west": Door("3a_s2_north-west", "3a_s2", DoorDirection.left, False, False), + "3a_s2_east": Door("3a_s2_east", "3a_s2", DoorDirection.right, False, False), + + "3a_s3_west": Door("3a_s3_west", "3a_s3", DoorDirection.left, False, False), + "3a_s3_north": Door("3a_s3_north", "3a_s3", DoorDirection.right, False, False), + "3a_s3_east": Door("3a_s3_east", "3a_s3", DoorDirection.right, False, False), + + "3a_0x-a_west": Door("3a_0x-a_west", "3a_0x-a", DoorDirection.left, False, True), + "3a_0x-a_east": Door("3a_0x-a_east", "3a_0x-a", DoorDirection.right, False, False), + + "3a_00-a_west": Door("3a_00-a_west", "3a_00-a", DoorDirection.left, False, False), + "3a_00-a_east": Door("3a_00-a_east", "3a_00-a", DoorDirection.right, False, False), + + "3a_02-a_west": Door("3a_02-a_west", "3a_02-a", DoorDirection.left, False, True), + "3a_02-a_top": Door("3a_02-a_top", "3a_02-a", DoorDirection.up, False, False), + "3a_02-a_east": Door("3a_02-a_east", "3a_02-a", DoorDirection.right, True, False), + + "3a_02-b_west": Door("3a_02-b_west", "3a_02-b", DoorDirection.left, False, False), + "3a_02-b_east": Door("3a_02-b_east", "3a_02-b", DoorDirection.down, False, False), + "3a_02-b_far-east": Door("3a_02-b_far-east", "3a_02-b", DoorDirection.right, False, False), + + "3a_01-b_west": Door("3a_01-b_west", "3a_01-b", DoorDirection.left, False, False), + "3a_01-b_north-west": Door("3a_01-b_north-west", "3a_01-b", DoorDirection.left, False, False), + "3a_01-b_east": Door("3a_01-b_east", "3a_01-b", DoorDirection.right, False, False), + + "3a_00-b_south-west": Door("3a_00-b_south-west", "3a_00-b", DoorDirection.left, False, False), + "3a_00-b_south-east": Door("3a_00-b_south-east", "3a_00-b", DoorDirection.right, False, False), + "3a_00-b_west": Door("3a_00-b_west", "3a_00-b", DoorDirection.left, False, False), + "3a_00-b_north-west": Door("3a_00-b_north-west", "3a_00-b", DoorDirection.up, False, False), + "3a_00-b_east": Door("3a_00-b_east", "3a_00-b", DoorDirection.right, False, False), + "3a_00-b_north": Door("3a_00-b_north", "3a_00-b", DoorDirection.up, True, False), + + "3a_00-c_south-west": Door("3a_00-c_south-west", "3a_00-c", DoorDirection.down, False, False), + "3a_00-c_south-east": Door("3a_00-c_south-east", "3a_00-c", DoorDirection.down, False, False), + "3a_00-c_north-east": Door("3a_00-c_north-east", "3a_00-c", DoorDirection.right, False, False), + + "3a_0x-b_west": Door("3a_0x-b_west", "3a_0x-b", DoorDirection.left, False, False), + "3a_0x-b_south-east": Door("3a_0x-b_south-east", "3a_0x-b", DoorDirection.right, False, False), + "3a_0x-b_north-east": Door("3a_0x-b_north-east", "3a_0x-b", DoorDirection.right, False, False), + + "3a_03-a_west": Door("3a_03-a_west", "3a_03-a", DoorDirection.left, False, False), + "3a_03-a_top": Door("3a_03-a_top", "3a_03-a", DoorDirection.up, False, False), + "3a_03-a_east": Door("3a_03-a_east", "3a_03-a", DoorDirection.right, False, False), + + "3a_04-b_west": Door("3a_04-b_west", "3a_04-b", DoorDirection.left, False, False), + "3a_04-b_east": Door("3a_04-b_east", "3a_04-b", DoorDirection.down, False, False), + + "3a_05-a_west": Door("3a_05-a_west", "3a_05-a", DoorDirection.left, False, False), + "3a_05-a_east": Door("3a_05-a_east", "3a_05-a", DoorDirection.right, False, False), + + "3a_06-a_west": Door("3a_06-a_west", "3a_06-a", DoorDirection.left, False, False), + "3a_06-a_east": Door("3a_06-a_east", "3a_06-a", DoorDirection.right, False, False), + + "3a_07-a_west": Door("3a_07-a_west", "3a_07-a", DoorDirection.left, False, False), + "3a_07-a_top": Door("3a_07-a_top", "3a_07-a", DoorDirection.up, False, False), + "3a_07-a_east": Door("3a_07-a_east", "3a_07-a", DoorDirection.right, False, False), + + "3a_07-b_bottom": Door("3a_07-b_bottom", "3a_07-b", DoorDirection.down, False, False), + "3a_07-b_west": Door("3a_07-b_west", "3a_07-b", DoorDirection.left, False, False), + "3a_07-b_top": Door("3a_07-b_top", "3a_07-b", DoorDirection.up, False, False), + "3a_07-b_east": Door("3a_07-b_east", "3a_07-b", DoorDirection.right, False, False), + + "3a_06-b_west": Door("3a_06-b_west", "3a_06-b", DoorDirection.up, False, False), + "3a_06-b_east": Door("3a_06-b_east", "3a_06-b", DoorDirection.right, False, False), + + "3a_06-c_south-west": Door("3a_06-c_south-west", "3a_06-c", DoorDirection.down, False, True), + "3a_06-c_north-west": Door("3a_06-c_north-west", "3a_06-c", DoorDirection.left, False, False), + "3a_06-c_south-east": Door("3a_06-c_south-east", "3a_06-c", DoorDirection.down, True, False), + "3a_06-c_east": Door("3a_06-c_east", "3a_06-c", DoorDirection.right, False, False), + + "3a_05-c_east": Door("3a_05-c_east", "3a_05-c", DoorDirection.right, False, False), + + "3a_08-c_west": Door("3a_08-c_west", "3a_08-c", DoorDirection.left, False, False), + "3a_08-c_east": Door("3a_08-c_east", "3a_08-c", DoorDirection.down, False, False), + + "3a_08-b_west": Door("3a_08-b_west", "3a_08-b", DoorDirection.left, False, False), + "3a_08-b_east": Door("3a_08-b_east", "3a_08-b", DoorDirection.up, False, False), + + "3a_08-a_west": Door("3a_08-a_west", "3a_08-a", DoorDirection.left, False, True), + "3a_08-a_bottom": Door("3a_08-a_bottom", "3a_08-a", DoorDirection.down, False, False), + "3a_08-a_east": Door("3a_08-a_east", "3a_08-a", DoorDirection.right, False, False), + + "3a_09-b_west": Door("3a_09-b_west", "3a_09-b", DoorDirection.left, False, False), + "3a_09-b_north-west": Door("3a_09-b_north-west", "3a_09-b", DoorDirection.up, False, False), + "3a_09-b_south-west": Door("3a_09-b_south-west", "3a_09-b", DoorDirection.down, False, True), + "3a_09-b_south": Door("3a_09-b_south", "3a_09-b", DoorDirection.down, False, True), + "3a_09-b_south-east": Door("3a_09-b_south-east", "3a_09-b", DoorDirection.down, False, False), + "3a_09-b_east": Door("3a_09-b_east", "3a_09-b", DoorDirection.right, False, False), + "3a_09-b_north-east-right": Door("3a_09-b_north-east-right", "3a_09-b", DoorDirection.right, False, False), + "3a_09-b_north-east-top": Door("3a_09-b_north-east-top", "3a_09-b", DoorDirection.up, False, False), + "3a_09-b_north": Door("3a_09-b_north", "3a_09-b", DoorDirection.up, False, True), + + "3a_10-x_west": Door("3a_10-x_west", "3a_10-x", DoorDirection.up, False, False), + "3a_10-x_south-east": Door("3a_10-x_south-east", "3a_10-x", DoorDirection.down, False, True), + "3a_10-x_north-east-top": Door("3a_10-x_north-east-top", "3a_10-x", DoorDirection.up, False, True), + "3a_10-x_north-east-right": Door("3a_10-x_north-east-right", "3a_10-x", DoorDirection.right, False, True), + + "3a_11-x_west": Door("3a_11-x_west", "3a_11-x", DoorDirection.left, False, False), + "3a_11-x_south": Door("3a_11-x_south", "3a_11-x", DoorDirection.down, False, False), + + "3a_11-y_west": Door("3a_11-y_west", "3a_11-y", DoorDirection.up, False, False), + "3a_11-y_east": Door("3a_11-y_east", "3a_11-y", DoorDirection.right, False, False), + "3a_11-y_south": Door("3a_11-y_south", "3a_11-y", DoorDirection.down, False, False), + + "3a_12-y_west": Door("3a_12-y_west", "3a_12-y", DoorDirection.left, False, False), + + "3a_11-z_west": Door("3a_11-z_west", "3a_11-z", DoorDirection.left, False, False), + "3a_11-z_east": Door("3a_11-z_east", "3a_11-z", DoorDirection.up, False, False), + + "3a_10-z_bottom": Door("3a_10-z_bottom", "3a_10-z", DoorDirection.right, False, False), + "3a_10-z_top": Door("3a_10-z_top", "3a_10-z", DoorDirection.up, False, False), + + "3a_10-y_bottom": Door("3a_10-y_bottom", "3a_10-y", DoorDirection.down, False, True), + "3a_10-y_top": Door("3a_10-y_top", "3a_10-y", DoorDirection.up, False, False), + + "3a_10-c_south-east": Door("3a_10-c_south-east", "3a_10-c", DoorDirection.down, False, False), + "3a_10-c_north-east": Door("3a_10-c_north-east", "3a_10-c", DoorDirection.right, False, False), + "3a_10-c_north-west": Door("3a_10-c_north-west", "3a_10-c", DoorDirection.up, False, False), + "3a_10-c_south-west": Door("3a_10-c_south-west", "3a_10-c", DoorDirection.down, False, False), + + "3a_11-c_south-east": Door("3a_11-c_south-east", "3a_11-c", DoorDirection.down, False, True), + "3a_11-c_east": Door("3a_11-c_east", "3a_11-c", DoorDirection.right, False, False), + "3a_11-c_west": Door("3a_11-c_west", "3a_11-c", DoorDirection.left, False, False), + "3a_11-c_south-west": Door("3a_11-c_south-west", "3a_11-c", DoorDirection.down, False, False), + + "3a_12-c_west": Door("3a_12-c_west", "3a_12-c", DoorDirection.left, False, False), + "3a_12-c_top": Door("3a_12-c_top", "3a_12-c", DoorDirection.up, False, False), + + "3a_12-d_bottom": Door("3a_12-d_bottom", "3a_12-d", DoorDirection.down, False, True), + "3a_12-d_top": Door("3a_12-d_top", "3a_12-d", DoorDirection.left, False, False), + + "3a_11-d_west": Door("3a_11-d_west", "3a_11-d", DoorDirection.left, False, False), + "3a_11-d_east": Door("3a_11-d_east", "3a_11-d", DoorDirection.right, False, False), + + "3a_10-d_west": Door("3a_10-d_west", "3a_10-d", DoorDirection.down, False, False), + "3a_10-d_east": Door("3a_10-d_east", "3a_10-d", DoorDirection.right, False, False), + + "3a_11-b_west": Door("3a_11-b_west", "3a_11-b", DoorDirection.left, False, False), + "3a_11-b_north-west": Door("3a_11-b_north-west", "3a_11-b", DoorDirection.up, False, False), + "3a_11-b_east": Door("3a_11-b_east", "3a_11-b", DoorDirection.right, False, False), + "3a_11-b_north-east": Door("3a_11-b_north-east", "3a_11-b", DoorDirection.up, False, False), + + "3a_12-b_west": Door("3a_12-b_west", "3a_12-b", DoorDirection.left, False, False), + "3a_12-b_east": Door("3a_12-b_east", "3a_12-b", DoorDirection.right, False, False), + + "3a_13-b_top": Door("3a_13-b_top", "3a_13-b", DoorDirection.left, False, False), + "3a_13-b_bottom": Door("3a_13-b_bottom", "3a_13-b", DoorDirection.down, False, False), + + "3a_13-a_west": Door("3a_13-a_west", "3a_13-a", DoorDirection.up, False, False), + "3a_13-a_south-west": Door("3a_13-a_south-west", "3a_13-a", DoorDirection.left, False, False), + "3a_13-a_east": Door("3a_13-a_east", "3a_13-a", DoorDirection.down, False, False), + + "3a_13-x_west": Door("3a_13-x_west", "3a_13-x", DoorDirection.left, False, False), + "3a_13-x_east": Door("3a_13-x_east", "3a_13-x", DoorDirection.up, False, False), + + "3a_12-x_west": Door("3a_12-x_west", "3a_12-x", DoorDirection.up, False, False), + "3a_12-x_north-east": Door("3a_12-x_north-east", "3a_12-x", DoorDirection.up, False, False), + "3a_12-x_east": Door("3a_12-x_east", "3a_12-x", DoorDirection.right, False, False), + + "3a_11-a_west": Door("3a_11-a_west", "3a_11-a", DoorDirection.left, False, False), + "3a_11-a_south": Door("3a_11-a_south", "3a_11-a", DoorDirection.down, False, True), + "3a_11-a_south-east-bottom": Door("3a_11-a_south-east-bottom", "3a_11-a", DoorDirection.down, False, False), + "3a_11-a_south-east-right": Door("3a_11-a_south-east-right", "3a_11-a", DoorDirection.right, False, False), + + "3a_08-x_west": Door("3a_08-x_west", "3a_08-x", DoorDirection.up, False, False), + "3a_08-x_east": Door("3a_08-x_east", "3a_08-x", DoorDirection.up, False, False), + + "3a_09-d_bottom": Door("3a_09-d_bottom", "3a_09-d", DoorDirection.down, False, True), + "3a_09-d_top": Door("3a_09-d_top", "3a_09-d", DoorDirection.left, False, False), + + "3a_08-d_west": Door("3a_08-d_west", "3a_08-d", DoorDirection.left, False, False), + "3a_08-d_east": Door("3a_08-d_east", "3a_08-d", DoorDirection.right, False, False), + + "3a_06-d_west": Door("3a_06-d_west", "3a_06-d", DoorDirection.left, False, False), + "3a_06-d_east": Door("3a_06-d_east", "3a_06-d", DoorDirection.right, False, False), + + "3a_04-d_west": Door("3a_04-d_west", "3a_04-d", DoorDirection.left, False, False), + "3a_04-d_south-west": Door("3a_04-d_south-west", "3a_04-d", DoorDirection.down, False, False), + "3a_04-d_south": Door("3a_04-d_south", "3a_04-d", DoorDirection.down, False, False), + "3a_04-d_east": Door("3a_04-d_east", "3a_04-d", DoorDirection.right, False, False), + + "3a_04-c_west": Door("3a_04-c_west", "3a_04-c", DoorDirection.left, False, False), + "3a_04-c_north-west": Door("3a_04-c_north-west", "3a_04-c", DoorDirection.up, False, False), + "3a_04-c_east": Door("3a_04-c_east", "3a_04-c", DoorDirection.up, False, False), + + "3a_02-c_west": Door("3a_02-c_west", "3a_02-c", DoorDirection.left, False, False), + "3a_02-c_east": Door("3a_02-c_east", "3a_02-c", DoorDirection.right, False, False), + "3a_02-c_south-east": Door("3a_02-c_south-east", "3a_02-c", DoorDirection.down, False, False), + + "3a_03-b_west": Door("3a_03-b_west", "3a_03-b", DoorDirection.left, False, False), + "3a_03-b_east": Door("3a_03-b_east", "3a_03-b", DoorDirection.right, False, False), + "3a_03-b_north": Door("3a_03-b_north", "3a_03-b", DoorDirection.up, False, False), + + "3a_01-c_west": Door("3a_01-c_west", "3a_01-c", DoorDirection.left, False, False), + "3a_01-c_east": Door("3a_01-c_east", "3a_01-c", DoorDirection.right, False, False), + + "3a_02-d_west": Door("3a_02-d_west", "3a_02-d", DoorDirection.left, False, False), + "3a_02-d_east": Door("3a_02-d_east", "3a_02-d", DoorDirection.right, False, False), + + "3a_00-d_west": Door("3a_00-d_west", "3a_00-d", DoorDirection.up, False, False), + "3a_00-d_east": Door("3a_00-d_east", "3a_00-d", DoorDirection.right, False, True), + + "3a_roof00_west": Door("3a_roof00_west", "3a_roof00", DoorDirection.down, False, True), + "3a_roof00_east": Door("3a_roof00_east", "3a_roof00", DoorDirection.right, False, False), + + "3a_roof01_west": Door("3a_roof01_west", "3a_roof01", DoorDirection.left, False, False), + "3a_roof01_east": Door("3a_roof01_east", "3a_roof01", DoorDirection.right, False, False), + + "3a_roof02_west": Door("3a_roof02_west", "3a_roof02", DoorDirection.left, False, False), + "3a_roof02_east": Door("3a_roof02_east", "3a_roof02", DoorDirection.right, False, False), + + "3a_roof03_west": Door("3a_roof03_west", "3a_roof03", DoorDirection.left, False, False), + "3a_roof03_east": Door("3a_roof03_east", "3a_roof03", DoorDirection.right, False, False), + + "3a_roof04_west": Door("3a_roof04_west", "3a_roof04", DoorDirection.left, False, False), + "3a_roof04_east": Door("3a_roof04_east", "3a_roof04", DoorDirection.right, False, False), + + "3a_roof05_west": Door("3a_roof05_west", "3a_roof05", DoorDirection.left, False, False), + "3a_roof05_east": Door("3a_roof05_east", "3a_roof05", DoorDirection.right, False, False), + + "3a_roof06b_west": Door("3a_roof06b_west", "3a_roof06b", DoorDirection.left, False, False), + "3a_roof06b_east": Door("3a_roof06b_east", "3a_roof06b", DoorDirection.right, False, False), + + "3a_roof06_west": Door("3a_roof06_west", "3a_roof06", DoorDirection.left, False, False), + "3a_roof06_east": Door("3a_roof06_east", "3a_roof06", DoorDirection.right, False, False), + + "3a_roof07_west": Door("3a_roof07_west", "3a_roof07", DoorDirection.left, False, False), + + "3b_00_west": Door("3b_00_west", "3b_00", DoorDirection.left, False, False), + "3b_00_east": Door("3b_00_east", "3b_00", DoorDirection.right, False, False), + + "3b_back_east": Door("3b_back_east", "3b_back", DoorDirection.right, False, False), + + "3b_01_west": Door("3b_01_west", "3b_01", DoorDirection.left, False, False), + "3b_01_east": Door("3b_01_east", "3b_01", DoorDirection.right, False, False), + + "3b_02_west": Door("3b_02_west", "3b_02", DoorDirection.left, False, True), + "3b_02_east": Door("3b_02_east", "3b_02", DoorDirection.right, False, False), + + "3b_03_west": Door("3b_03_west", "3b_03", DoorDirection.left, False, False), + "3b_03_east": Door("3b_03_east", "3b_03", DoorDirection.right, False, False), + + "3b_04_west": Door("3b_04_west", "3b_04", DoorDirection.left, False, False), + "3b_04_east": Door("3b_04_east", "3b_04", DoorDirection.right, False, False), + + "3b_05_west": Door("3b_05_west", "3b_05", DoorDirection.left, False, False), + "3b_05_east": Door("3b_05_east", "3b_05", DoorDirection.right, False, False), + + "3b_06_west": Door("3b_06_west", "3b_06", DoorDirection.left, False, True), + "3b_06_east": Door("3b_06_east", "3b_06", DoorDirection.right, False, False), + + "3b_07_west": Door("3b_07_west", "3b_07", DoorDirection.left, False, False), + "3b_07_east": Door("3b_07_east", "3b_07", DoorDirection.right, False, False), + + "3b_08_bottom": Door("3b_08_bottom", "3b_08", DoorDirection.left, False, False), + "3b_08_top": Door("3b_08_top", "3b_08", DoorDirection.up, False, False), + + "3b_09_west": Door("3b_09_west", "3b_09", DoorDirection.down, False, True), + "3b_09_east": Door("3b_09_east", "3b_09", DoorDirection.right, False, False), + + "3b_10_west": Door("3b_10_west", "3b_10", DoorDirection.left, False, False), + "3b_10_east": Door("3b_10_east", "3b_10", DoorDirection.right, False, False), + + "3b_11_west": Door("3b_11_west", "3b_11", DoorDirection.left, False, True), + "3b_11_east": Door("3b_11_east", "3b_11", DoorDirection.right, False, False), + + "3b_13_west": Door("3b_13_west", "3b_13", DoorDirection.left, False, False), + "3b_13_east": Door("3b_13_east", "3b_13", DoorDirection.right, False, False), + + "3b_14_west": Door("3b_14_west", "3b_14", DoorDirection.left, False, False), + "3b_14_east": Door("3b_14_east", "3b_14", DoorDirection.right, False, False), + + "3b_15_west": Door("3b_15_west", "3b_15", DoorDirection.left, False, False), + "3b_15_east": Door("3b_15_east", "3b_15", DoorDirection.right, False, False), + + "3b_12_west": Door("3b_12_west", "3b_12", DoorDirection.left, False, False), + "3b_12_east": Door("3b_12_east", "3b_12", DoorDirection.right, False, False), + + "3b_16_west": Door("3b_16_west", "3b_16", DoorDirection.left, False, True), + "3b_16_top": Door("3b_16_top", "3b_16", DoorDirection.up, True, False), + + "3b_17_west": Door("3b_17_west", "3b_17", DoorDirection.down, False, True), + "3b_17_east": Door("3b_17_east", "3b_17", DoorDirection.right, False, False), + + "3b_18_west": Door("3b_18_west", "3b_18", DoorDirection.left, False, False), + "3b_18_east": Door("3b_18_east", "3b_18", DoorDirection.right, False, False), + + "3b_19_west": Door("3b_19_west", "3b_19", DoorDirection.left, False, False), + "3b_19_east": Door("3b_19_east", "3b_19", DoorDirection.right, False, False), + + "3b_21_west": Door("3b_21_west", "3b_21", DoorDirection.left, False, False), + "3b_21_east": Door("3b_21_east", "3b_21", DoorDirection.right, False, False), + + "3b_20_west": Door("3b_20_west", "3b_20", DoorDirection.left, False, False), + "3b_20_east": Door("3b_20_east", "3b_20", DoorDirection.down, False, False), + + "3b_end_west": Door("3b_end_west", "3b_end", DoorDirection.up, False, True), + + "3c_00_east": Door("3c_00_east", "3c_00", DoorDirection.up, False, False), + + "3c_01_west": Door("3c_01_west", "3c_01", DoorDirection.down, False, False), + "3c_01_east": Door("3c_01_east", "3c_01", DoorDirection.right, False, False), + + "3c_02_west": Door("3c_02_west", "3c_02", DoorDirection.left, False, True), + + "4a_a-00_east": Door("4a_a-00_east", "4a_a-00", DoorDirection.right, False, False), + + "4a_a-01_west": Door("4a_a-01_west", "4a_a-01", DoorDirection.left, False, False), + "4a_a-01_east": Door("4a_a-01_east", "4a_a-01", DoorDirection.right, False, False), + + "4a_a-01x_west": Door("4a_a-01x_west", "4a_a-01x", DoorDirection.left, False, False), + "4a_a-01x_east": Door("4a_a-01x_east", "4a_a-01x", DoorDirection.right, False, False), + + "4a_a-02_west": Door("4a_a-02_west", "4a_a-02", DoorDirection.left, False, False), + "4a_a-02_east": Door("4a_a-02_east", "4a_a-02", DoorDirection.right, False, False), + + "4a_a-03_west": Door("4a_a-03_west", "4a_a-03", DoorDirection.left, False, False), + "4a_a-03_east": Door("4a_a-03_east", "4a_a-03", DoorDirection.right, False, False), + + "4a_a-04_west": Door("4a_a-04_west", "4a_a-04", DoorDirection.left, False, False), + "4a_a-04_east": Door("4a_a-04_east", "4a_a-04", DoorDirection.right, False, False), + + "4a_a-05_west": Door("4a_a-05_west", "4a_a-05", DoorDirection.left, False, False), + "4a_a-05_east": Door("4a_a-05_east", "4a_a-05", DoorDirection.right, False, False), + + "4a_a-06_west": Door("4a_a-06_west", "4a_a-06", DoorDirection.left, False, False), + "4a_a-06_east": Door("4a_a-06_east", "4a_a-06", DoorDirection.right, False, False), + + "4a_a-07_west": Door("4a_a-07_west", "4a_a-07", DoorDirection.left, False, False), + "4a_a-07_east": Door("4a_a-07_east", "4a_a-07", DoorDirection.right, False, False), + + "4a_a-08_west": Door("4a_a-08_west", "4a_a-08", DoorDirection.left, False, False), + "4a_a-08_north-west": Door("4a_a-08_north-west", "4a_a-08", DoorDirection.left, False, False), + "4a_a-08_east": Door("4a_a-08_east", "4a_a-08", DoorDirection.up, False, False), + + "4a_a-10_west": Door("4a_a-10_west", "4a_a-10", DoorDirection.left, False, False), + "4a_a-10_east": Door("4a_a-10_east", "4a_a-10", DoorDirection.right, False, False), + + "4a_a-11_east": Door("4a_a-11_east", "4a_a-11", DoorDirection.right, False, False), + + "4a_a-09_bottom": Door("4a_a-09_bottom", "4a_a-09", DoorDirection.down, False, True), + "4a_a-09_top": Door("4a_a-09_top", "4a_a-09", DoorDirection.up, False, False), + + "4a_b-00_south": Door("4a_b-00_south", "4a_b-00", DoorDirection.down, False, True), + "4a_b-00_south-east": Door("4a_b-00_south-east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_east": Door("4a_b-00_east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_north-east": Door("4a_b-00_north-east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_west": Door("4a_b-00_west", "4a_b-00", DoorDirection.left, False, False), + "4a_b-00_north-west": Door("4a_b-00_north-west", "4a_b-00", DoorDirection.left, False, False), + "4a_b-00_north": Door("4a_b-00_north", "4a_b-00", DoorDirection.up, False, False), + + "4a_b-01_west": Door("4a_b-01_west", "4a_b-01", DoorDirection.left, False, False), + + "4a_b-04_west": Door("4a_b-04_west", "4a_b-04", DoorDirection.left, False, False), + "4a_b-04_north-west": Door("4a_b-04_north-west", "4a_b-04", DoorDirection.up, False, False), + "4a_b-04_east": Door("4a_b-04_east", "4a_b-04", DoorDirection.right, False, False), + + "4a_b-06_west": Door("4a_b-06_west", "4a_b-06", DoorDirection.down, False, False), + "4a_b-06_east": Door("4a_b-06_east", "4a_b-06", DoorDirection.right, False, False), + + "4a_b-07_west": Door("4a_b-07_west", "4a_b-07", DoorDirection.up, False, False), + "4a_b-07_east": Door("4a_b-07_east", "4a_b-07", DoorDirection.right, False, False), + + "4a_b-03_west": Door("4a_b-03_west", "4a_b-03", DoorDirection.left, False, False), + "4a_b-03_east": Door("4a_b-03_east", "4a_b-03", DoorDirection.right, False, False), + + "4a_b-02_south-west": Door("4a_b-02_south-west", "4a_b-02", DoorDirection.left, False, False), + "4a_b-02_north-west": Door("4a_b-02_north-west", "4a_b-02", DoorDirection.left, False, False), + "4a_b-02_north-east": Door("4a_b-02_north-east", "4a_b-02", DoorDirection.right, True, False), + "4a_b-02_north": Door("4a_b-02_north", "4a_b-02", DoorDirection.up, False, False), + + "4a_b-sec_west": Door("4a_b-sec_west", "4a_b-sec", DoorDirection.left, False, False), + "4a_b-sec_east": Door("4a_b-sec_east", "4a_b-sec", DoorDirection.right, True, False), + + "4a_b-secb_west": Door("4a_b-secb_west", "4a_b-secb", DoorDirection.left, False, False), + + "4a_b-05_west": Door("4a_b-05_west", "4a_b-05", DoorDirection.down, False, False), + "4a_b-05_center": Door("4a_b-05_center", "4a_b-05", DoorDirection.down, False, True), + "4a_b-05_north-east": Door("4a_b-05_north-east", "4a_b-05", DoorDirection.up, False, False), + "4a_b-05_east": Door("4a_b-05_east", "4a_b-05", DoorDirection.down, False, False), + + "4a_b-08b_west": Door("4a_b-08b_west", "4a_b-08b", DoorDirection.down, False, False), + "4a_b-08b_east": Door("4a_b-08b_east", "4a_b-08b", DoorDirection.up, False, False), + + "4a_b-08_west": Door("4a_b-08_west", "4a_b-08", DoorDirection.down, False, False), + "4a_b-08_east": Door("4a_b-08_east", "4a_b-08", DoorDirection.up, False, False), + + "4a_c-00_west": Door("4a_c-00_west", "4a_c-00", DoorDirection.down, False, True), + "4a_c-00_north-west": Door("4a_c-00_north-west", "4a_c-00", DoorDirection.left, False, False), + "4a_c-00_east": Door("4a_c-00_east", "4a_c-00", DoorDirection.right, False, False), + + "4a_c-01_east": Door("4a_c-01_east", "4a_c-01", DoorDirection.right, False, False), + + "4a_c-02_west": Door("4a_c-02_west", "4a_c-02", DoorDirection.left, False, False), + "4a_c-02_east": Door("4a_c-02_east", "4a_c-02", DoorDirection.up, False, False), + + "4a_c-04_west": Door("4a_c-04_west", "4a_c-04", DoorDirection.down, False, True), + "4a_c-04_east": Door("4a_c-04_east", "4a_c-04", DoorDirection.right, False, False), + + "4a_c-05_west": Door("4a_c-05_west", "4a_c-05", DoorDirection.left, False, False), + "4a_c-05_east": Door("4a_c-05_east", "4a_c-05", DoorDirection.up, False, False), + + "4a_c-06_bottom": Door("4a_c-06_bottom", "4a_c-06", DoorDirection.down, False, False), + "4a_c-06_west": Door("4a_c-06_west", "4a_c-06", DoorDirection.left, False, False), + "4a_c-06_top": Door("4a_c-06_top", "4a_c-06", DoorDirection.up, False, False), + + "4a_c-06b_east": Door("4a_c-06b_east", "4a_c-06b", DoorDirection.right, False, False), + + "4a_c-09_west": Door("4a_c-09_west", "4a_c-09", DoorDirection.down, False, True), + "4a_c-09_east": Door("4a_c-09_east", "4a_c-09", DoorDirection.up, False, False), + + "4a_c-07_west": Door("4a_c-07_west", "4a_c-07", DoorDirection.down, False, True), + "4a_c-07_east": Door("4a_c-07_east", "4a_c-07", DoorDirection.right, False, False), + + "4a_c-08_bottom": Door("4a_c-08_bottom", "4a_c-08", DoorDirection.left, False, False), + "4a_c-08_east": Door("4a_c-08_east", "4a_c-08", DoorDirection.right, False, False), + "4a_c-08_top": Door("4a_c-08_top", "4a_c-08", DoorDirection.up, False, False), + + "4a_c-10_bottom": Door("4a_c-10_bottom", "4a_c-10", DoorDirection.left, False, False), + "4a_c-10_top": Door("4a_c-10_top", "4a_c-10", DoorDirection.up, False, False), + + "4a_d-00_west": Door("4a_d-00_west", "4a_d-00", DoorDirection.down, False, True), + "4a_d-00_south": Door("4a_d-00_south", "4a_d-00", DoorDirection.down, False, True), + "4a_d-00_north-west": Door("4a_d-00_north-west", "4a_d-00", DoorDirection.left, False, False), + "4a_d-00_east": Door("4a_d-00_east", "4a_d-00", DoorDirection.right, False, False), + + "4a_d-00b_east": Door("4a_d-00b_east", "4a_d-00b", DoorDirection.right, False, False), + + "4a_d-01_west": Door("4a_d-01_west", "4a_d-01", DoorDirection.left, False, False), + "4a_d-01_east": Door("4a_d-01_east", "4a_d-01", DoorDirection.right, False, False), + + "4a_d-02_west": Door("4a_d-02_west", "4a_d-02", DoorDirection.left, False, False), + "4a_d-02_east": Door("4a_d-02_east", "4a_d-02", DoorDirection.right, False, False), + + "4a_d-03_west": Door("4a_d-03_west", "4a_d-03", DoorDirection.left, False, False), + "4a_d-03_east": Door("4a_d-03_east", "4a_d-03", DoorDirection.right, False, False), + + "4a_d-04_west": Door("4a_d-04_west", "4a_d-04", DoorDirection.left, False, False), + "4a_d-04_east": Door("4a_d-04_east", "4a_d-04", DoorDirection.right, False, False), + + "4a_d-05_west": Door("4a_d-05_west", "4a_d-05", DoorDirection.left, False, False), + "4a_d-05_east": Door("4a_d-05_east", "4a_d-05", DoorDirection.right, False, False), + + "4a_d-06_west": Door("4a_d-06_west", "4a_d-06", DoorDirection.left, False, False), + "4a_d-06_east": Door("4a_d-06_east", "4a_d-06", DoorDirection.right, False, False), + + "4a_d-07_west": Door("4a_d-07_west", "4a_d-07", DoorDirection.left, False, False), + "4a_d-07_east": Door("4a_d-07_east", "4a_d-07", DoorDirection.right, False, False), + + "4a_d-08_west": Door("4a_d-08_west", "4a_d-08", DoorDirection.left, False, False), + "4a_d-08_east": Door("4a_d-08_east", "4a_d-08", DoorDirection.right, False, False), + + "4a_d-09_west": Door("4a_d-09_west", "4a_d-09", DoorDirection.left, False, False), + "4a_d-09_east": Door("4a_d-09_east", "4a_d-09", DoorDirection.right, False, False), + + "4a_d-10_west": Door("4a_d-10_west", "4a_d-10", DoorDirection.left, False, True), + + "4b_a-00_east": Door("4b_a-00_east", "4b_a-00", DoorDirection.right, False, False), + + "4b_a-01_west": Door("4b_a-01_west", "4b_a-01", DoorDirection.left, False, False), + "4b_a-01_east": Door("4b_a-01_east", "4b_a-01", DoorDirection.right, False, False), + + "4b_a-02_west": Door("4b_a-02_west", "4b_a-02", DoorDirection.left, False, False), + "4b_a-02_east": Door("4b_a-02_east", "4b_a-02", DoorDirection.right, False, False), + + "4b_a-03_west": Door("4b_a-03_west", "4b_a-03", DoorDirection.left, False, False), + "4b_a-03_east": Door("4b_a-03_east", "4b_a-03", DoorDirection.right, False, False), + + "4b_a-04_west": Door("4b_a-04_west", "4b_a-04", DoorDirection.left, False, False), + "4b_a-04_east": Door("4b_a-04_east", "4b_a-04", DoorDirection.right, False, False), + + "4b_b-00_west": Door("4b_b-00_west", "4b_b-00", DoorDirection.left, False, False), + "4b_b-00_east": Door("4b_b-00_east", "4b_b-00", DoorDirection.right, False, False), + + "4b_b-01_west": Door("4b_b-01_west", "4b_b-01", DoorDirection.left, False, False), + "4b_b-01_east": Door("4b_b-01_east", "4b_b-01", DoorDirection.up, False, False), + + "4b_b-02_bottom": Door("4b_b-02_bottom", "4b_b-02", DoorDirection.down, False, True), + "4b_b-02_top": Door("4b_b-02_top", "4b_b-02", DoorDirection.up, False, False), + + "4b_b-03_west": Door("4b_b-03_west", "4b_b-03", DoorDirection.down, False, True), + "4b_b-03_east": Door("4b_b-03_east", "4b_b-03", DoorDirection.up, False, False), + + "4b_b-04_west": Door("4b_b-04_west", "4b_b-04", DoorDirection.down, False, True), + "4b_b-04_east": Door("4b_b-04_east", "4b_b-04", DoorDirection.right, False, False), + + "4b_c-00_west": Door("4b_c-00_west", "4b_c-00", DoorDirection.left, False, True), + "4b_c-00_east": Door("4b_c-00_east", "4b_c-00", DoorDirection.right, False, False), + + "4b_c-01_west": Door("4b_c-01_west", "4b_c-01", DoorDirection.left, False, False), + "4b_c-01_east": Door("4b_c-01_east", "4b_c-01", DoorDirection.right, False, False), + + "4b_c-02_west": Door("4b_c-02_west", "4b_c-02", DoorDirection.left, False, False), + "4b_c-02_east": Door("4b_c-02_east", "4b_c-02", DoorDirection.right, False, False), + + "4b_c-03_bottom": Door("4b_c-03_bottom", "4b_c-03", DoorDirection.left, False, False), + "4b_c-03_top": Door("4b_c-03_top", "4b_c-03", DoorDirection.up, False, False), + + "4b_c-04_west": Door("4b_c-04_west", "4b_c-04", DoorDirection.down, False, True), + "4b_c-04_east": Door("4b_c-04_east", "4b_c-04", DoorDirection.right, False, False), + + "4b_d-00_west": Door("4b_d-00_west", "4b_d-00", DoorDirection.left, False, False), + "4b_d-00_east": Door("4b_d-00_east", "4b_d-00", DoorDirection.right, False, False), + + "4b_d-01_west": Door("4b_d-01_west", "4b_d-01", DoorDirection.left, False, False), + "4b_d-01_east": Door("4b_d-01_east", "4b_d-01", DoorDirection.right, False, False), + + "4b_d-02_west": Door("4b_d-02_west", "4b_d-02", DoorDirection.left, False, False), + "4b_d-02_east": Door("4b_d-02_east", "4b_d-02", DoorDirection.right, False, False), + + "4b_d-03_west": Door("4b_d-03_west", "4b_d-03", DoorDirection.left, False, False), + "4b_d-03_east": Door("4b_d-03_east", "4b_d-03", DoorDirection.right, False, False), + + "4b_end_west": Door("4b_end_west", "4b_end", DoorDirection.left, False, False), + + "4c_00_east": Door("4c_00_east", "4c_00", DoorDirection.right, False, False), + + "4c_01_west": Door("4c_01_west", "4c_01", DoorDirection.left, False, False), + "4c_01_east": Door("4c_01_east", "4c_01", DoorDirection.right, False, False), + + "4c_02_west": Door("4c_02_west", "4c_02", DoorDirection.left, False, False), + + "5a_a-00b_west": Door("5a_a-00b_west", "5a_a-00b", DoorDirection.left, False, False), + "5a_a-00b_east": Door("5a_a-00b_east", "5a_a-00b", DoorDirection.right, False, False), + + "5a_a-00x_east": Door("5a_a-00x_east", "5a_a-00x", DoorDirection.right, False, False), + + "5a_a-00d_west": Door("5a_a-00d_west", "5a_a-00d", DoorDirection.left, False, False), + "5a_a-00d_east": Door("5a_a-00d_east", "5a_a-00d", DoorDirection.right, False, False), + + "5a_a-00c_west": Door("5a_a-00c_west", "5a_a-00c", DoorDirection.left, False, False), + "5a_a-00c_east": Door("5a_a-00c_east", "5a_a-00c", DoorDirection.right, False, False), + + "5a_a-00_west": Door("5a_a-00_west", "5a_a-00", DoorDirection.left, False, False), + "5a_a-00_east": Door("5a_a-00_east", "5a_a-00", DoorDirection.right, False, False), + + "5a_a-01_west": Door("5a_a-01_west", "5a_a-01", DoorDirection.left, False, True), + "5a_a-01_south-west": Door("5a_a-01_south-west", "5a_a-01", DoorDirection.down, False, False), + "5a_a-01_south-east": Door("5a_a-01_south-east", "5a_a-01", DoorDirection.down, False, False), + "5a_a-01_east": Door("5a_a-01_east", "5a_a-01", DoorDirection.right, False, False), + "5a_a-01_north": Door("5a_a-01_north", "5a_a-01", DoorDirection.up, False, False), + + "5a_a-02_west": Door("5a_a-02_west", "5a_a-02", DoorDirection.left, False, False), + "5a_a-02_north": Door("5a_a-02_north", "5a_a-02", DoorDirection.up, False, False), + "5a_a-02_south": Door("5a_a-02_south", "5a_a-02", DoorDirection.down, False, False), + + "5a_a-03_west": Door("5a_a-03_west", "5a_a-03", DoorDirection.left, False, False), + "5a_a-03_east": Door("5a_a-03_east", "5a_a-03", DoorDirection.right, False, False), + + "5a_a-04_east": Door("5a_a-04_east", "5a_a-04", DoorDirection.right, False, False), + "5a_a-04_north": Door("5a_a-04_north", "5a_a-04", DoorDirection.up, False, False), + "5a_a-04_south": Door("5a_a-04_south", "5a_a-04", DoorDirection.down, False, False), + + "5a_a-05_north-west": Door("5a_a-05_north-west", "5a_a-05", DoorDirection.up, False, False), + "5a_a-05_south-west": Door("5a_a-05_south-west", "5a_a-05", DoorDirection.left, False, False), + "5a_a-05_south-east": Door("5a_a-05_south-east", "5a_a-05", DoorDirection.right, False, False), + "5a_a-05_north-east": Door("5a_a-05_north-east", "5a_a-05", DoorDirection.up, False, False), + + "5a_a-06_west": Door("5a_a-06_west", "5a_a-06", DoorDirection.left, False, False), + + "5a_a-07_east": Door("5a_a-07_east", "5a_a-07", DoorDirection.right, False, False), + + "5a_a-08_west": Door("5a_a-08_west", "5a_a-08", DoorDirection.left, False, False), + "5a_a-08_south": Door("5a_a-08_south", "5a_a-08", DoorDirection.down, False, False), + "5a_a-08_south-east": Door("5a_a-08_south-east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_east": Door("5a_a-08_east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_north-east": Door("5a_a-08_north-east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_north": Door("5a_a-08_north", "5a_a-08", DoorDirection.up, False, False), + + "5a_a-10_west": Door("5a_a-10_west", "5a_a-10", DoorDirection.left, False, False), + "5a_a-10_east": Door("5a_a-10_east", "5a_a-10", DoorDirection.right, False, False), + + "5a_a-09_west": Door("5a_a-09_west", "5a_a-09", DoorDirection.left, False, False), + "5a_a-09_east": Door("5a_a-09_east", "5a_a-09", DoorDirection.right, False, False), + + "5a_a-11_east": Door("5a_a-11_east", "5a_a-11", DoorDirection.right, False, False), + + "5a_a-12_north-west": Door("5a_a-12_north-west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_west": Door("5a_a-12_west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_south-west": Door("5a_a-12_south-west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_east": Door("5a_a-12_east", "5a_a-12", DoorDirection.up, False, False), + + "5a_a-15_south": Door("5a_a-15_south", "5a_a-15", DoorDirection.down, False, False), + + "5a_a-14_south": Door("5a_a-14_south", "5a_a-14", DoorDirection.down, False, False), + + "5a_a-13_west": Door("5a_a-13_west", "5a_a-13", DoorDirection.left, False, False), + "5a_a-13_east": Door("5a_a-13_east", "5a_a-13", DoorDirection.right, False, False), + + "5a_b-00_west": Door("5a_b-00_west", "5a_b-00", DoorDirection.left, False, True), + "5a_b-00_north-west": Door("5a_b-00_north-west", "5a_b-00", DoorDirection.up, False, False), + "5a_b-00_east": Door("5a_b-00_east", "5a_b-00", DoorDirection.right, False, False), + + "5a_b-18_south": Door("5a_b-18_south", "5a_b-18", DoorDirection.down, False, False), + + "5a_b-01_south-west": Door("5a_b-01_south-west", "5a_b-01", DoorDirection.left, False, True), + "5a_b-01_west": Door("5a_b-01_west", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_north-west": Door("5a_b-01_north-west", "5a_b-01", DoorDirection.up, False, True), + "5a_b-01_north": Door("5a_b-01_north", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_north-east": Door("5a_b-01_north-east", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_east": Door("5a_b-01_east", "5a_b-01", DoorDirection.right, False, False), + "5a_b-01_south-east": Door("5a_b-01_south-east", "5a_b-01", DoorDirection.down, False, True), + "5a_b-01_south": Door("5a_b-01_south", "5a_b-01", DoorDirection.down, False, False), + + "5a_b-01c_west": Door("5a_b-01c_west", "5a_b-01c", DoorDirection.up, False, False), + "5a_b-01c_east": Door("5a_b-01c_east", "5a_b-01c", DoorDirection.up, False, False), + + "5a_b-20_north-west": Door("5a_b-20_north-west", "5a_b-20", DoorDirection.left, False, False), + "5a_b-20_west": Door("5a_b-20_west", "5a_b-20", DoorDirection.down, False, True), + "5a_b-20_south-west": Door("5a_b-20_south-west", "5a_b-20", DoorDirection.down, False, False), + "5a_b-20_south": Door("5a_b-20_south", "5a_b-20", DoorDirection.down, False, False), + "5a_b-20_east": Door("5a_b-20_east", "5a_b-20", DoorDirection.down, False, False), + + "5a_b-21_east": Door("5a_b-21_east", "5a_b-21", DoorDirection.right, False, False), + + "5a_b-01b_west": Door("5a_b-01b_west", "5a_b-01b", DoorDirection.left, False, False), + "5a_b-01b_east": Door("5a_b-01b_east", "5a_b-01b", DoorDirection.right, False, False), + + "5a_b-02_west": Door("5a_b-02_west", "5a_b-02", DoorDirection.left, False, True), + "5a_b-02_north-west": Door("5a_b-02_north-west", "5a_b-02", DoorDirection.left, False, True), + "5a_b-02_north": Door("5a_b-02_north", "5a_b-02", DoorDirection.up, False, False), + "5a_b-02_north-east": Door("5a_b-02_north-east", "5a_b-02", DoorDirection.right, False, False), + "5a_b-02_east-upper": Door("5a_b-02_east-upper", "5a_b-02", DoorDirection.right, False, False), + "5a_b-02_east-lower": Door("5a_b-02_east-lower", "5a_b-02", DoorDirection.right, False, True), + "5a_b-02_south-east": Door("5a_b-02_south-east", "5a_b-02", DoorDirection.right, False, True), + "5a_b-02_south": Door("5a_b-02_south", "5a_b-02", DoorDirection.down, False, False), + + "5a_b-03_east": Door("5a_b-03_east", "5a_b-03", DoorDirection.right, False, False), + + "5a_b-05_west": Door("5a_b-05_west", "5a_b-05", DoorDirection.left, False, False), + + "5a_b-04_west": Door("5a_b-04_west", "5a_b-04", DoorDirection.left, False, False), + "5a_b-04_east": Door("5a_b-04_east", "5a_b-04", DoorDirection.right, False, False), + "5a_b-04_south": Door("5a_b-04_south", "5a_b-04", DoorDirection.down, False, False), + + "5a_b-07_north": Door("5a_b-07_north", "5a_b-07", DoorDirection.right, False, False), + "5a_b-07_south": Door("5a_b-07_south", "5a_b-07", DoorDirection.right, False, False), + + "5a_b-08_west": Door("5a_b-08_west", "5a_b-08", DoorDirection.left, False, False), + "5a_b-08_east": Door("5a_b-08_east", "5a_b-08", DoorDirection.right, False, False), + + "5a_b-09_north": Door("5a_b-09_north", "5a_b-09", DoorDirection.left, False, False), + "5a_b-09_south": Door("5a_b-09_south", "5a_b-09", DoorDirection.left, False, False), + + "5a_b-10_east": Door("5a_b-10_east", "5a_b-10", DoorDirection.up, False, False), + + "5a_b-11_north-west": Door("5a_b-11_north-west", "5a_b-11", DoorDirection.left, False, False), + "5a_b-11_west": Door("5a_b-11_west", "5a_b-11", DoorDirection.left, False, False), + "5a_b-11_south-west": Door("5a_b-11_south-west", "5a_b-11", DoorDirection.down, False, False), + "5a_b-11_south-east": Door("5a_b-11_south-east", "5a_b-11", DoorDirection.down, False, False), + "5a_b-11_east": Door("5a_b-11_east", "5a_b-11", DoorDirection.right, False, False), + + "5a_b-12_west": Door("5a_b-12_west", "5a_b-12", DoorDirection.up, False, False), + "5a_b-12_east": Door("5a_b-12_east", "5a_b-12", DoorDirection.up, False, False), + + "5a_b-13_west": Door("5a_b-13_west", "5a_b-13", DoorDirection.left, False, False), + "5a_b-13_east": Door("5a_b-13_east", "5a_b-13", DoorDirection.right, False, False), + "5a_b-13_north-east": Door("5a_b-13_north-east", "5a_b-13", DoorDirection.right, False, False), + + "5a_b-17_west": Door("5a_b-17_west", "5a_b-17", DoorDirection.left, False, False), + "5a_b-17_east": Door("5a_b-17_east", "5a_b-17", DoorDirection.right, False, False), + "5a_b-17_north-west": Door("5a_b-17_north-west", "5a_b-17", DoorDirection.left, False, False), + + "5a_b-22_west": Door("5a_b-22_west", "5a_b-22", DoorDirection.left, False, False), + + "5a_b-06_west": Door("5a_b-06_west", "5a_b-06", DoorDirection.left, False, False), + "5a_b-06_east": Door("5a_b-06_east", "5a_b-06", DoorDirection.right, False, False), + "5a_b-06_north-east": Door("5a_b-06_north-east", "5a_b-06", DoorDirection.right, False, False), + + "5a_b-19_west": Door("5a_b-19_west", "5a_b-19", DoorDirection.left, False, True), + "5a_b-19_east": Door("5a_b-19_east", "5a_b-19", DoorDirection.right, False, False), + "5a_b-19_north-west": Door("5a_b-19_north-west", "5a_b-19", DoorDirection.left, False, False), + + "5a_b-14_west": Door("5a_b-14_west", "5a_b-14", DoorDirection.left, False, True), + "5a_b-14_south": Door("5a_b-14_south", "5a_b-14", DoorDirection.right, False, False), + "5a_b-14_north": Door("5a_b-14_north", "5a_b-14", DoorDirection.up, False, False), + + "5a_b-15_west": Door("5a_b-15_west", "5a_b-15", DoorDirection.left, False, False), + + "5a_b-16_bottom": Door("5a_b-16_bottom", "5a_b-16", DoorDirection.down, False, False), + "5a_b-16_mirror": Door("5a_b-16_mirror", "5a_b-16", DoorDirection.special, False, False), + + "5a_void_east": Door("5a_void_east", "5a_void", DoorDirection.special, False, True), + "5a_void_west": Door("5a_void_west", "5a_void", DoorDirection.special, False, False), + + "5a_c-00_bottom": Door("5a_c-00_bottom", "5a_c-00", DoorDirection.right, False, False), + "5a_c-00_top": Door("5a_c-00_top", "5a_c-00", DoorDirection.special, False, True), + + "5a_c-01_west": Door("5a_c-01_west", "5a_c-01", DoorDirection.left, False, False), + "5a_c-01_east": Door("5a_c-01_east", "5a_c-01", DoorDirection.right, False, False), + + "5a_c-01b_west": Door("5a_c-01b_west", "5a_c-01b", DoorDirection.left, False, True), + "5a_c-01b_east": Door("5a_c-01b_east", "5a_c-01b", DoorDirection.right, False, False), + + "5a_c-01c_west": Door("5a_c-01c_west", "5a_c-01c", DoorDirection.left, False, True), + "5a_c-01c_east": Door("5a_c-01c_east", "5a_c-01c", DoorDirection.right, False, False), + + "5a_c-08b_west": Door("5a_c-08b_west", "5a_c-08b", DoorDirection.left, False, True), + "5a_c-08b_east": Door("5a_c-08b_east", "5a_c-08b", DoorDirection.right, False, False), + + "5a_c-08_west": Door("5a_c-08_west", "5a_c-08", DoorDirection.left, False, True), + "5a_c-08_east": Door("5a_c-08_east", "5a_c-08", DoorDirection.right, False, False), + + "5a_c-10_west": Door("5a_c-10_west", "5a_c-10", DoorDirection.left, False, False), + "5a_c-10_east": Door("5a_c-10_east", "5a_c-10", DoorDirection.right, False, False), + + "5a_c-12_west": Door("5a_c-12_west", "5a_c-12", DoorDirection.left, False, True), + "5a_c-12_east": Door("5a_c-12_east", "5a_c-12", DoorDirection.right, False, False), + + "5a_c-07_west": Door("5a_c-07_west", "5a_c-07", DoorDirection.left, False, True), + "5a_c-07_east": Door("5a_c-07_east", "5a_c-07", DoorDirection.right, False, False), + + "5a_c-11_west": Door("5a_c-11_west", "5a_c-11", DoorDirection.left, False, True), + "5a_c-11_east": Door("5a_c-11_east", "5a_c-11", DoorDirection.right, False, False), + + "5a_c-09_west": Door("5a_c-09_west", "5a_c-09", DoorDirection.left, False, False), + "5a_c-09_east": Door("5a_c-09_east", "5a_c-09", DoorDirection.right, False, False), + + "5a_c-13_west": Door("5a_c-13_west", "5a_c-13", DoorDirection.left, False, False), + "5a_c-13_east": Door("5a_c-13_east", "5a_c-13", DoorDirection.up, False, False), + + "5a_d-00_south": Door("5a_d-00_south", "5a_d-00", DoorDirection.down, False, True), + "5a_d-00_north": Door("5a_d-00_north", "5a_d-00", DoorDirection.up, False, False), + "5a_d-00_west": Door("5a_d-00_west", "5a_d-00", DoorDirection.left, False, False), + "5a_d-00_east": Door("5a_d-00_east", "5a_d-00", DoorDirection.right, False, False), + + "5a_d-01_south": Door("5a_d-01_south", "5a_d-01", DoorDirection.down, False, True), + "5a_d-01_south-west-left": Door("5a_d-01_south-west-left", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_south-west-down": Door("5a_d-01_south-west-down", "5a_d-01", DoorDirection.down, False, False), + "5a_d-01_south-east-right": Door("5a_d-01_south-east-right", "5a_d-01", DoorDirection.right, True, False), + "5a_d-01_south-east-down": Door("5a_d-01_south-east-down", "5a_d-01", DoorDirection.down, False, False), + "5a_d-01_west": Door("5a_d-01_west", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_east": Door("5a_d-01_east", "5a_d-01", DoorDirection.right, False, False), + "5a_d-01_north-west": Door("5a_d-01_north-west", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_north-east": Door("5a_d-01_north-east", "5a_d-01", DoorDirection.right, False, False), + + "5a_d-09_west": Door("5a_d-09_west", "5a_d-09", DoorDirection.down, False, False), + "5a_d-09_east": Door("5a_d-09_east", "5a_d-09", DoorDirection.right, False, False), + + "5a_d-04_west": Door("5a_d-04_west", "5a_d-04", DoorDirection.left, False, False), + "5a_d-04_east": Door("5a_d-04_east", "5a_d-04", DoorDirection.right, False, False), + "5a_d-04_south-west-left": Door("5a_d-04_south-west-left", "5a_d-04", DoorDirection.down, False, False), + "5a_d-04_south-west-right": Door("5a_d-04_south-west-right", "5a_d-04", DoorDirection.down, False, False), + "5a_d-04_south-east": Door("5a_d-04_south-east", "5a_d-04", DoorDirection.right, False, False), + "5a_d-04_north": Door("5a_d-04_north", "5a_d-04", DoorDirection.up, False, False), + + "5a_d-05_west": Door("5a_d-05_west", "5a_d-05", DoorDirection.left, False, False), + "5a_d-05_north": Door("5a_d-05_north", "5a_d-05", DoorDirection.up, False, False), + "5a_d-05_east": Door("5a_d-05_east", "5a_d-05", DoorDirection.right, False, False), + "5a_d-05_south": Door("5a_d-05_south", "5a_d-05", DoorDirection.down, False, False), + + "5a_d-06_north-east": Door("5a_d-06_north-east", "5a_d-06", DoorDirection.up, False, False), + "5a_d-06_south-east": Door("5a_d-06_south-east", "5a_d-06", DoorDirection.right, False, True), + "5a_d-06_south-west": Door("5a_d-06_south-west", "5a_d-06", DoorDirection.down, False, False), + "5a_d-06_north-west": Door("5a_d-06_north-west", "5a_d-06", DoorDirection.up, False, False), + + "5a_d-07_north": Door("5a_d-07_north", "5a_d-07", DoorDirection.up, False, False), + "5a_d-07_west": Door("5a_d-07_west", "5a_d-07", DoorDirection.left, False, False), + + "5a_d-02_west": Door("5a_d-02_west", "5a_d-02", DoorDirection.left, False, False), + "5a_d-02_east": Door("5a_d-02_east", "5a_d-02", DoorDirection.up, False, False), + + "5a_d-03_west": Door("5a_d-03_west", "5a_d-03", DoorDirection.up, False, False), + "5a_d-03_east": Door("5a_d-03_east", "5a_d-03", DoorDirection.right, False, False), + + "5a_d-15_north-west": Door("5a_d-15_north-west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_west": Door("5a_d-15_west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_south-west": Door("5a_d-15_south-west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_south": Door("5a_d-15_south", "5a_d-15", DoorDirection.down, False, False), + "5a_d-15_south-east": Door("5a_d-15_south-east", "5a_d-15", DoorDirection.down, False, False), + + "5a_d-13_west": Door("5a_d-13_west", "5a_d-13", DoorDirection.up, False, False), + "5a_d-13_east": Door("5a_d-13_east", "5a_d-13", DoorDirection.up, False, True), + + "5a_d-19b_south-east-right": Door("5a_d-19b_south-east-right", "5a_d-19b", DoorDirection.right, False, False), + "5a_d-19b_south-east-down": Door("5a_d-19b_south-east-down", "5a_d-19b", DoorDirection.down, False, False), + "5a_d-19b_south-west": Door("5a_d-19b_south-west", "5a_d-19b", DoorDirection.down, False, False), + "5a_d-19b_north-east": Door("5a_d-19b_north-east", "5a_d-19b", DoorDirection.right, False, False), + + "5a_d-19_east": Door("5a_d-19_east", "5a_d-19", DoorDirection.up, False, False), + "5a_d-19_west": Door("5a_d-19_west", "5a_d-19", DoorDirection.up, False, False), + + "5a_d-10_east": Door("5a_d-10_east", "5a_d-10", DoorDirection.up, False, False), + "5a_d-10_west": Door("5a_d-10_west", "5a_d-10", DoorDirection.left, False, False), + + "5a_d-20_east": Door("5a_d-20_east", "5a_d-20", DoorDirection.right, False, False), + "5a_d-20_west": Door("5a_d-20_west", "5a_d-20", DoorDirection.down, False, True), + + "5a_e-00_east": Door("5a_e-00_east", "5a_e-00", DoorDirection.right, False, False), + "5a_e-00_west": Door("5a_e-00_west", "5a_e-00", DoorDirection.left, False, True), + + "5a_e-01_east": Door("5a_e-01_east", "5a_e-01", DoorDirection.right, False, False), + "5a_e-01_west": Door("5a_e-01_west", "5a_e-01", DoorDirection.left, False, True), + + "5a_e-02_east": Door("5a_e-02_east", "5a_e-02", DoorDirection.right, False, False), + "5a_e-02_west": Door("5a_e-02_west", "5a_e-02", DoorDirection.left, False, True), + + "5a_e-03_east": Door("5a_e-03_east", "5a_e-03", DoorDirection.right, False, False), + "5a_e-03_west": Door("5a_e-03_west", "5a_e-03", DoorDirection.left, False, True), + + "5a_e-04_east": Door("5a_e-04_east", "5a_e-04", DoorDirection.right, False, False), + "5a_e-04_west": Door("5a_e-04_west", "5a_e-04", DoorDirection.left, False, True), + + "5a_e-06_east": Door("5a_e-06_east", "5a_e-06", DoorDirection.right, False, False), + "5a_e-06_west": Door("5a_e-06_west", "5a_e-06", DoorDirection.left, False, True), + + "5a_e-05_east": Door("5a_e-05_east", "5a_e-05", DoorDirection.right, False, False), + "5a_e-05_west": Door("5a_e-05_west", "5a_e-05", DoorDirection.left, False, True), + + "5a_e-07_east": Door("5a_e-07_east", "5a_e-07", DoorDirection.right, False, False), + "5a_e-07_west": Door("5a_e-07_west", "5a_e-07", DoorDirection.left, False, True), + + "5a_e-08_east": Door("5a_e-08_east", "5a_e-08", DoorDirection.right, False, False), + "5a_e-08_west": Door("5a_e-08_west", "5a_e-08", DoorDirection.left, False, True), + + "5a_e-09_east": Door("5a_e-09_east", "5a_e-09", DoorDirection.right, False, False), + "5a_e-09_west": Door("5a_e-09_west", "5a_e-09", DoorDirection.left, False, True), + + "5a_e-10_east": Door("5a_e-10_east", "5a_e-10", DoorDirection.right, False, False), + "5a_e-10_west": Door("5a_e-10_west", "5a_e-10", DoorDirection.left, False, True), + + "5a_e-11_west": Door("5a_e-11_west", "5a_e-11", DoorDirection.left, False, True), + + "5b_start_east": Door("5b_start_east", "5b_start", DoorDirection.right, False, False), + + "5b_a-00_west": Door("5b_a-00_west", "5b_a-00", DoorDirection.left, False, False), + "5b_a-00_east": Door("5b_a-00_east", "5b_a-00", DoorDirection.right, False, False), + + "5b_a-01_west": Door("5b_a-01_west", "5b_a-01", DoorDirection.left, False, False), + "5b_a-01_east": Door("5b_a-01_east", "5b_a-01", DoorDirection.right, False, False), + + "5b_a-02_west": Door("5b_a-02_west", "5b_a-02", DoorDirection.left, False, False), + "5b_a-02_east": Door("5b_a-02_east", "5b_a-02", DoorDirection.up, False, False), + + "5b_b-00_south": Door("5b_b-00_south", "5b_b-00", DoorDirection.down, False, True), + "5b_b-00_west": Door("5b_b-00_west", "5b_b-00", DoorDirection.left, False, False), + "5b_b-00_north": Door("5b_b-00_north", "5b_b-00", DoorDirection.up, False, False), + "5b_b-00_east": Door("5b_b-00_east", "5b_b-00", DoorDirection.right, False, False), + + "5b_b-01_west": Door("5b_b-01_west", "5b_b-01", DoorDirection.left, False, False), + "5b_b-01_north": Door("5b_b-01_north", "5b_b-01", DoorDirection.up, False, False), + "5b_b-01_east": Door("5b_b-01_east", "5b_b-01", DoorDirection.right, False, False), + + "5b_b-04_west": Door("5b_b-04_west", "5b_b-04", DoorDirection.left, False, False), + "5b_b-04_east": Door("5b_b-04_east", "5b_b-04", DoorDirection.down, False, False), + + "5b_b-02_south": Door("5b_b-02_south", "5b_b-02", DoorDirection.down, False, True), + "5b_b-02_north-west": Door("5b_b-02_north-west", "5b_b-02", DoorDirection.left, False, False), + "5b_b-02_south-west": Door("5b_b-02_south-west", "5b_b-02", DoorDirection.left, False, False), + "5b_b-02_north": Door("5b_b-02_north", "5b_b-02", DoorDirection.up, False, False), + "5b_b-02_north-east": Door("5b_b-02_north-east", "5b_b-02", DoorDirection.right, False, False), + "5b_b-02_south-east": Door("5b_b-02_south-east", "5b_b-02", DoorDirection.right, False, False), + + "5b_b-05_north": Door("5b_b-05_north", "5b_b-05", DoorDirection.right, False, False), + "5b_b-05_south": Door("5b_b-05_south", "5b_b-05", DoorDirection.right, False, False), + + "5b_b-06_east": Door("5b_b-06_east", "5b_b-06", DoorDirection.right, False, False), + + "5b_b-07_north": Door("5b_b-07_north", "5b_b-07", DoorDirection.up, False, False), + "5b_b-07_south": Door("5b_b-07_south", "5b_b-07", DoorDirection.left, False, False), + + "5b_b-03_north": Door("5b_b-03_north", "5b_b-03", DoorDirection.up, False, False), + "5b_b-03_west": Door("5b_b-03_west", "5b_b-03", DoorDirection.left, False, False), + "5b_b-03_east": Door("5b_b-03_east", "5b_b-03", DoorDirection.down, False, True), + + "5b_b-08_north": Door("5b_b-08_north", "5b_b-08", DoorDirection.up, False, False), + "5b_b-08_south": Door("5b_b-08_south", "5b_b-08", DoorDirection.down, False, False), + "5b_b-08_east": Door("5b_b-08_east", "5b_b-08", DoorDirection.down, False, True), + + "5b_b-09_mirror": Door("5b_b-09_mirror", "5b_b-09", DoorDirection.special, False, False), + "5b_b-09_bottom": Door("5b_b-09_bottom", "5b_b-09", DoorDirection.down, False, True), + + "5b_c-00_mirror": Door("5b_c-00_mirror", "5b_c-00", DoorDirection.special, False, True), + "5b_c-00_bottom": Door("5b_c-00_bottom", "5b_c-00", DoorDirection.right, False, False), + + "5b_c-01_west": Door("5b_c-01_west", "5b_c-01", DoorDirection.left, False, True), + "5b_c-01_east": Door("5b_c-01_east", "5b_c-01", DoorDirection.right, False, False), + + "5b_c-02_west": Door("5b_c-02_west", "5b_c-02", DoorDirection.left, False, True), + "5b_c-02_east": Door("5b_c-02_east", "5b_c-02", DoorDirection.right, False, False), + + "5b_c-03_west": Door("5b_c-03_west", "5b_c-03", DoorDirection.left, False, True), + "5b_c-03_east": Door("5b_c-03_east", "5b_c-03", DoorDirection.right, False, False), + + "5b_c-04_west": Door("5b_c-04_west", "5b_c-04", DoorDirection.left, False, True), + "5b_c-04_east": Door("5b_c-04_east", "5b_c-04", DoorDirection.up, False, False), + + "5b_d-00_west": Door("5b_d-00_west", "5b_d-00", DoorDirection.down, False, True), + "5b_d-00_east": Door("5b_d-00_east", "5b_d-00", DoorDirection.right, False, False), + + "5b_d-01_west": Door("5b_d-01_west", "5b_d-01", DoorDirection.left, False, True), + "5b_d-01_east": Door("5b_d-01_east", "5b_d-01", DoorDirection.right, False, False), + + "5b_d-02_west": Door("5b_d-02_west", "5b_d-02", DoorDirection.left, False, True), + "5b_d-02_east": Door("5b_d-02_east", "5b_d-02", DoorDirection.right, False, False), + + "5b_d-03_west": Door("5b_d-03_west", "5b_d-03", DoorDirection.left, False, True), + "5b_d-03_east": Door("5b_d-03_east", "5b_d-03", DoorDirection.right, False, False), + + "5b_d-04_west": Door("5b_d-04_west", "5b_d-04", DoorDirection.left, False, True), + "5b_d-04_east": Door("5b_d-04_east", "5b_d-04", DoorDirection.right, False, False), + + "5b_d-05_west": Door("5b_d-05_west", "5b_d-05", DoorDirection.left, False, False), + + "5c_00_east": Door("5c_00_east", "5c_00", DoorDirection.right, False, False), + + "5c_01_west": Door("5c_01_west", "5c_01", DoorDirection.left, False, False), + "5c_01_east": Door("5c_01_east", "5c_01", DoorDirection.right, False, False), + + "5c_02_west": Door("5c_02_west", "5c_02", DoorDirection.left, False, False), + + "6a_00_west": Door("6a_00_west", "6a_00", DoorDirection.up, False, False), + + "6a_01_bottom": Door("6a_01_bottom", "6a_01", DoorDirection.down, False, True), + "6a_01_top": Door("6a_01_top", "6a_01", DoorDirection.up, False, False), + + "6a_02_bottom": Door("6a_02_bottom", "6a_02", DoorDirection.down, False, True), + "6a_02_bottom-west": Door("6a_02_bottom-west", "6a_02", DoorDirection.left, False, False), + "6a_02_top-west": Door("6a_02_top-west", "6a_02", DoorDirection.left, False, False), + "6a_02_top": Door("6a_02_top", "6a_02", DoorDirection.up, False, False), + + "6a_03_bottom": Door("6a_03_bottom", "6a_03", DoorDirection.right, False, False), + "6a_03_top": Door("6a_03_top", "6a_03", DoorDirection.right, False, False), + + "6a_02b_bottom": Door("6a_02b_bottom", "6a_02b", DoorDirection.down, False, True), + "6a_02b_top": Door("6a_02b_top", "6a_02b", DoorDirection.up, False, False), + + "6a_04_south": Door("6a_04_south", "6a_04", DoorDirection.down, False, True), + "6a_04_south-west": Door("6a_04_south-west", "6a_04", DoorDirection.left, True, False), + "6a_04_south-east": Door("6a_04_south-east", "6a_04", DoorDirection.right, False, False), + "6a_04_east": Door("6a_04_east", "6a_04", DoorDirection.right, False, False), + "6a_04_north-west": Door("6a_04_north-west", "6a_04", DoorDirection.left, False, False), + + "6a_04b_west": Door("6a_04b_west", "6a_04b", DoorDirection.left, False, False), + "6a_04b_east": Door("6a_04b_east", "6a_04b", DoorDirection.right, False, False), + + "6a_04c_east": Door("6a_04c_east", "6a_04c", DoorDirection.right, False, False), + + "6a_04d_west": Door("6a_04d_west", "6a_04d", DoorDirection.left, False, False), + + "6a_04e_east": Door("6a_04e_east", "6a_04e", DoorDirection.right, False, False), + + "6a_05_west": Door("6a_05_west", "6a_05", DoorDirection.left, False, False), + "6a_05_east": Door("6a_05_east", "6a_05", DoorDirection.right, False, False), + + "6a_06_west": Door("6a_06_west", "6a_06", DoorDirection.left, False, False), + "6a_06_east": Door("6a_06_east", "6a_06", DoorDirection.right, False, False), + + "6a_07_west": Door("6a_07_west", "6a_07", DoorDirection.left, False, False), + "6a_07_east": Door("6a_07_east", "6a_07", DoorDirection.right, False, False), + "6a_07_north-east": Door("6a_07_north-east", "6a_07", DoorDirection.right, False, False), + + "6a_08a_west": Door("6a_08a_west", "6a_08a", DoorDirection.left, False, False), + "6a_08a_east": Door("6a_08a_east", "6a_08a", DoorDirection.right, False, False), + + "6a_08b_west": Door("6a_08b_west", "6a_08b", DoorDirection.left, False, False), + "6a_08b_east": Door("6a_08b_east", "6a_08b", DoorDirection.right, False, False), + + "6a_09_west": Door("6a_09_west", "6a_09", DoorDirection.left, False, True), + "6a_09_north-west": Door("6a_09_north-west", "6a_09", DoorDirection.left, False, True), + "6a_09_east": Door("6a_09_east", "6a_09", DoorDirection.right, False, False), + "6a_09_north-east": Door("6a_09_north-east", "6a_09", DoorDirection.right, False, False), + + "6a_10a_west": Door("6a_10a_west", "6a_10a", DoorDirection.left, False, False), + "6a_10a_east": Door("6a_10a_east", "6a_10a", DoorDirection.right, False, False), + + "6a_10b_west": Door("6a_10b_west", "6a_10b", DoorDirection.left, False, False), + "6a_10b_east": Door("6a_10b_east", "6a_10b", DoorDirection.right, False, False), + + "6a_11_west": Door("6a_11_west", "6a_11", DoorDirection.left, False, True), + "6a_11_north-west": Door("6a_11_north-west", "6a_11", DoorDirection.left, False, True), + "6a_11_east": Door("6a_11_east", "6a_11", DoorDirection.right, False, False), + "6a_11_north-east": Door("6a_11_north-east", "6a_11", DoorDirection.right, False, False), + + "6a_12a_west": Door("6a_12a_west", "6a_12a", DoorDirection.left, False, False), + "6a_12a_east": Door("6a_12a_east", "6a_12a", DoorDirection.right, False, False), + + "6a_12b_west": Door("6a_12b_west", "6a_12b", DoorDirection.left, False, False), + "6a_12b_east": Door("6a_12b_east", "6a_12b", DoorDirection.right, False, False), + + "6a_13_west": Door("6a_13_west", "6a_13", DoorDirection.left, False, True), + "6a_13_north-west": Door("6a_13_north-west", "6a_13", DoorDirection.left, False, True), + "6a_13_east": Door("6a_13_east", "6a_13", DoorDirection.right, False, False), + "6a_13_north-east": Door("6a_13_north-east", "6a_13", DoorDirection.right, False, False), + + "6a_14a_west": Door("6a_14a_west", "6a_14a", DoorDirection.left, False, False), + "6a_14a_east": Door("6a_14a_east", "6a_14a", DoorDirection.right, False, False), + + "6a_14b_west": Door("6a_14b_west", "6a_14b", DoorDirection.left, False, False), + "6a_14b_east": Door("6a_14b_east", "6a_14b", DoorDirection.right, False, False), + + "6a_15_west": Door("6a_15_west", "6a_15", DoorDirection.left, False, True), + "6a_15_north-west": Door("6a_15_north-west", "6a_15", DoorDirection.left, False, True), + "6a_15_east": Door("6a_15_east", "6a_15", DoorDirection.right, False, False), + "6a_15_north-east": Door("6a_15_north-east", "6a_15", DoorDirection.right, False, False), + + "6a_16a_west": Door("6a_16a_west", "6a_16a", DoorDirection.left, False, False), + "6a_16a_east": Door("6a_16a_east", "6a_16a", DoorDirection.right, False, False), + + "6a_16b_west": Door("6a_16b_west", "6a_16b", DoorDirection.left, False, False), + "6a_16b_east": Door("6a_16b_east", "6a_16b", DoorDirection.right, False, False), + + "6a_17_west": Door("6a_17_west", "6a_17", DoorDirection.left, False, True), + "6a_17_north-west": Door("6a_17_north-west", "6a_17", DoorDirection.left, False, True), + "6a_17_east": Door("6a_17_east", "6a_17", DoorDirection.right, False, False), + "6a_17_north-east": Door("6a_17_north-east", "6a_17", DoorDirection.right, False, False), + + "6a_18a_west": Door("6a_18a_west", "6a_18a", DoorDirection.left, False, False), + "6a_18a_east": Door("6a_18a_east", "6a_18a", DoorDirection.right, False, False), + + "6a_18b_west": Door("6a_18b_west", "6a_18b", DoorDirection.left, False, False), + "6a_18b_east": Door("6a_18b_east", "6a_18b", DoorDirection.right, False, False), + + "6a_19_west": Door("6a_19_west", "6a_19", DoorDirection.left, False, True), + "6a_19_north-west": Door("6a_19_north-west", "6a_19", DoorDirection.left, False, True), + "6a_19_east": Door("6a_19_east", "6a_19", DoorDirection.right, False, False), + + "6a_20_west": Door("6a_20_west", "6a_20", DoorDirection.left, False, False), + "6a_20_east": Door("6a_20_east", "6a_20", DoorDirection.right, False, False), + + "6a_b-00_west": Door("6a_b-00_west", "6a_b-00", DoorDirection.left, False, True), + "6a_b-00_top": Door("6a_b-00_top", "6a_b-00", DoorDirection.up, False, False), + "6a_b-00_east": Door("6a_b-00_east", "6a_b-00", DoorDirection.right, False, False), + + "6a_b-00b_bottom": Door("6a_b-00b_bottom", "6a_b-00b", DoorDirection.down, False, False), + "6a_b-00b_top": Door("6a_b-00b_top", "6a_b-00b", DoorDirection.left, False, False), + + "6a_b-00c_east": Door("6a_b-00c_east", "6a_b-00c", DoorDirection.right, False, False), + + "6a_b-01_west": Door("6a_b-01_west", "6a_b-01", DoorDirection.left, False, False), + "6a_b-01_east": Door("6a_b-01_east", "6a_b-01", DoorDirection.down, False, False), + + "6a_b-02_top": Door("6a_b-02_top", "6a_b-02", DoorDirection.up, False, False), + "6a_b-02_bottom": Door("6a_b-02_bottom", "6a_b-02", DoorDirection.right, False, False), + + "6a_b-02b_top": Door("6a_b-02b_top", "6a_b-02b", DoorDirection.left, False, False), + "6a_b-02b_bottom": Door("6a_b-02b_bottom", "6a_b-02b", DoorDirection.right, False, False), + + "6a_b-03_west": Door("6a_b-03_west", "6a_b-03", DoorDirection.left, False, False), + "6a_b-03_east": Door("6a_b-03_east", "6a_b-03", DoorDirection.right, False, False), + + "6a_boss-00_west": Door("6a_boss-00_west", "6a_boss-00", DoorDirection.left, False, True), + "6a_boss-00_east": Door("6a_boss-00_east", "6a_boss-00", DoorDirection.down, False, False), + + "6a_boss-01_west": Door("6a_boss-01_west", "6a_boss-01", DoorDirection.up, False, False), + "6a_boss-01_east": Door("6a_boss-01_east", "6a_boss-01", DoorDirection.down, False, False), + + "6a_boss-02_west": Door("6a_boss-02_west", "6a_boss-02", DoorDirection.up, False, False), + "6a_boss-02_east": Door("6a_boss-02_east", "6a_boss-02", DoorDirection.down, False, False), + + "6a_boss-03_west": Door("6a_boss-03_west", "6a_boss-03", DoorDirection.up, False, False), + "6a_boss-03_east": Door("6a_boss-03_east", "6a_boss-03", DoorDirection.down, False, False), + + "6a_boss-04_west": Door("6a_boss-04_west", "6a_boss-04", DoorDirection.up, False, False), + "6a_boss-04_east": Door("6a_boss-04_east", "6a_boss-04", DoorDirection.right, False, False), + + "6a_boss-05_west": Door("6a_boss-05_west", "6a_boss-05", DoorDirection.left, False, False), + "6a_boss-05_east": Door("6a_boss-05_east", "6a_boss-05", DoorDirection.down, False, False), + + "6a_boss-06_west": Door("6a_boss-06_west", "6a_boss-06", DoorDirection.up, False, False), + "6a_boss-06_east": Door("6a_boss-06_east", "6a_boss-06", DoorDirection.down, False, False), + + "6a_boss-07_west": Door("6a_boss-07_west", "6a_boss-07", DoorDirection.up, False, False), + "6a_boss-07_east": Door("6a_boss-07_east", "6a_boss-07", DoorDirection.down, False, False), + + "6a_boss-08_west": Door("6a_boss-08_west", "6a_boss-08", DoorDirection.up, False, False), + "6a_boss-08_east": Door("6a_boss-08_east", "6a_boss-08", DoorDirection.down, False, False), + + "6a_boss-09_west": Door("6a_boss-09_west", "6a_boss-09", DoorDirection.up, False, False), + "6a_boss-09_east": Door("6a_boss-09_east", "6a_boss-09", DoorDirection.right, False, False), + + "6a_boss-10_west": Door("6a_boss-10_west", "6a_boss-10", DoorDirection.left, False, False), + "6a_boss-10_east": Door("6a_boss-10_east", "6a_boss-10", DoorDirection.right, False, False), + + "6a_boss-11_west": Door("6a_boss-11_west", "6a_boss-11", DoorDirection.left, False, False), + "6a_boss-11_east": Door("6a_boss-11_east", "6a_boss-11", DoorDirection.down, False, False), + + "6a_boss-12_west": Door("6a_boss-12_west", "6a_boss-12", DoorDirection.up, False, False), + "6a_boss-12_east": Door("6a_boss-12_east", "6a_boss-12", DoorDirection.down, False, False), + + "6a_boss-13_west": Door("6a_boss-13_west", "6a_boss-13", DoorDirection.up, False, False), + "6a_boss-13_east": Door("6a_boss-13_east", "6a_boss-13", DoorDirection.right, False, False), + + "6a_boss-14_west": Door("6a_boss-14_west", "6a_boss-14", DoorDirection.left, False, False), + "6a_boss-14_east": Door("6a_boss-14_east", "6a_boss-14", DoorDirection.right, False, False), + + "6a_boss-15_west": Door("6a_boss-15_west", "6a_boss-15", DoorDirection.left, False, False), + "6a_boss-15_east": Door("6a_boss-15_east", "6a_boss-15", DoorDirection.down, False, False), + + "6a_boss-16_west": Door("6a_boss-16_west", "6a_boss-16", DoorDirection.up, False, False), + "6a_boss-16_east": Door("6a_boss-16_east", "6a_boss-16", DoorDirection.right, False, False), + + "6a_boss-17_west": Door("6a_boss-17_west", "6a_boss-17", DoorDirection.left, False, False), + "6a_boss-17_east": Door("6a_boss-17_east", "6a_boss-17", DoorDirection.down, False, False), + + "6a_boss-18_west": Door("6a_boss-18_west", "6a_boss-18", DoorDirection.up, False, False), + "6a_boss-18_east": Door("6a_boss-18_east", "6a_boss-18", DoorDirection.right, False, False), + + "6a_boss-19_west": Door("6a_boss-19_west", "6a_boss-19", DoorDirection.left, False, False), + "6a_boss-19_east": Door("6a_boss-19_east", "6a_boss-19", DoorDirection.right, False, False), + + "6a_boss-20_west": Door("6a_boss-20_west", "6a_boss-20", DoorDirection.left, False, False), + "6a_boss-20_east": Door("6a_boss-20_east", "6a_boss-20", DoorDirection.up, False, False), + + "6a_after-00_bottom": Door("6a_after-00_bottom", "6a_after-00", DoorDirection.down, False, True), + "6a_after-00_top": Door("6a_after-00_top", "6a_after-00", DoorDirection.up, False, False), + + "6a_after-01_bottom": Door("6a_after-01_bottom", "6a_after-01", DoorDirection.down, False, True), + + "6b_a-00_top": Door("6b_a-00_top", "6b_a-00", DoorDirection.up, False, False), + + "6b_a-01_bottom": Door("6b_a-01_bottom", "6b_a-01", DoorDirection.down, False, True), + "6b_a-01_top": Door("6b_a-01_top", "6b_a-01", DoorDirection.up, False, False), + + "6b_a-02_bottom": Door("6b_a-02_bottom", "6b_a-02", DoorDirection.down, False, True), + "6b_a-02_top": Door("6b_a-02_top", "6b_a-02", DoorDirection.up, False, False), + + "6b_a-03_west": Door("6b_a-03_west", "6b_a-03", DoorDirection.down, False, True), + "6b_a-03_east": Door("6b_a-03_east", "6b_a-03", DoorDirection.right, False, False), + + "6b_a-04_west": Door("6b_a-04_west", "6b_a-04", DoorDirection.left, False, False), + "6b_a-04_east": Door("6b_a-04_east", "6b_a-04", DoorDirection.right, False, False), + + "6b_a-05_west": Door("6b_a-05_west", "6b_a-05", DoorDirection.left, False, False), + "6b_a-05_east": Door("6b_a-05_east", "6b_a-05", DoorDirection.right, False, False), + + "6b_a-06_west": Door("6b_a-06_west", "6b_a-06", DoorDirection.left, False, False), + "6b_a-06_east": Door("6b_a-06_east", "6b_a-06", DoorDirection.right, False, False), + + "6b_b-00_west": Door("6b_b-00_west", "6b_b-00", DoorDirection.left, False, True), + "6b_b-00_east": Door("6b_b-00_east", "6b_b-00", DoorDirection.down, False, False), + + "6b_b-01_top": Door("6b_b-01_top", "6b_b-01", DoorDirection.up, False, False), + "6b_b-01_bottom": Door("6b_b-01_bottom", "6b_b-01", DoorDirection.right, False, False), + + "6b_b-02_top": Door("6b_b-02_top", "6b_b-02", DoorDirection.left, False, False), + "6b_b-02_bottom": Door("6b_b-02_bottom", "6b_b-02", DoorDirection.right, False, False), + + "6b_b-03_top": Door("6b_b-03_top", "6b_b-03", DoorDirection.left, False, False), + "6b_b-03_bottom": Door("6b_b-03_bottom", "6b_b-03", DoorDirection.right, False, False), + + "6b_b-04_top": Door("6b_b-04_top", "6b_b-04", DoorDirection.left, False, False), + "6b_b-04_bottom": Door("6b_b-04_bottom", "6b_b-04", DoorDirection.right, False, False), + + "6b_b-05_top": Door("6b_b-05_top", "6b_b-05", DoorDirection.left, False, False), + "6b_b-05_bottom": Door("6b_b-05_bottom", "6b_b-05", DoorDirection.right, False, False), + + "6b_b-06_top": Door("6b_b-06_top", "6b_b-06", DoorDirection.left, False, False), + "6b_b-06_bottom": Door("6b_b-06_bottom", "6b_b-06", DoorDirection.right, False, False), + + "6b_b-07_top": Door("6b_b-07_top", "6b_b-07", DoorDirection.left, False, False), + "6b_b-07_bottom": Door("6b_b-07_bottom", "6b_b-07", DoorDirection.right, False, False), + + "6b_b-08_top": Door("6b_b-08_top", "6b_b-08", DoorDirection.left, False, False), + "6b_b-08_bottom": Door("6b_b-08_bottom", "6b_b-08", DoorDirection.right, False, False), + + "6b_b-10_west": Door("6b_b-10_west", "6b_b-10", DoorDirection.left, False, False), + "6b_b-10_east": Door("6b_b-10_east", "6b_b-10", DoorDirection.right, False, False), + + "6b_c-00_west": Door("6b_c-00_west", "6b_c-00", DoorDirection.left, False, True), + "6b_c-00_east": Door("6b_c-00_east", "6b_c-00", DoorDirection.right, False, False), + + "6b_c-01_west": Door("6b_c-01_west", "6b_c-01", DoorDirection.left, False, True), + "6b_c-01_east": Door("6b_c-01_east", "6b_c-01", DoorDirection.right, False, False), + + "6b_c-02_west": Door("6b_c-02_west", "6b_c-02", DoorDirection.left, False, True), + "6b_c-02_east": Door("6b_c-02_east", "6b_c-02", DoorDirection.right, False, False), + + "6b_c-03_west": Door("6b_c-03_west", "6b_c-03", DoorDirection.left, False, True), + "6b_c-03_east": Door("6b_c-03_east", "6b_c-03", DoorDirection.right, False, False), + + "6b_c-04_west": Door("6b_c-04_west", "6b_c-04", DoorDirection.left, False, True), + "6b_c-04_east": Door("6b_c-04_east", "6b_c-04", DoorDirection.right, False, False), + + "6b_d-00_west": Door("6b_d-00_west", "6b_d-00", DoorDirection.left, False, True), + "6b_d-00_east": Door("6b_d-00_east", "6b_d-00", DoorDirection.up, False, False), + + "6b_d-01_west": Door("6b_d-01_west", "6b_d-01", DoorDirection.down, False, True), + "6b_d-01_east": Door("6b_d-01_east", "6b_d-01", DoorDirection.right, False, False), + + "6b_d-02_west": Door("6b_d-02_west", "6b_d-02", DoorDirection.left, False, False), + "6b_d-02_east": Door("6b_d-02_east", "6b_d-02", DoorDirection.right, False, False), + + "6b_d-03_west": Door("6b_d-03_west", "6b_d-03", DoorDirection.left, False, False), + "6b_d-03_east": Door("6b_d-03_east", "6b_d-03", DoorDirection.right, False, False), + + "6b_d-04_west": Door("6b_d-04_west", "6b_d-04", DoorDirection.left, False, False), + "6b_d-04_east": Door("6b_d-04_east", "6b_d-04", DoorDirection.right, False, False), + + "6b_d-05_west": Door("6b_d-05_west", "6b_d-05", DoorDirection.left, False, False), + + "6c_00_east": Door("6c_00_east", "6c_00", DoorDirection.right, False, False), + + "6c_01_west": Door("6c_01_west", "6c_01", DoorDirection.left, False, False), + "6c_01_east": Door("6c_01_east", "6c_01", DoorDirection.right, False, False), + + "6c_02_west": Door("6c_02_west", "6c_02", DoorDirection.left, False, False), + + "7a_a-00_east": Door("7a_a-00_east", "7a_a-00", DoorDirection.right, False, False), + + "7a_a-01_west": Door("7a_a-01_west", "7a_a-01", DoorDirection.left, False, True), + "7a_a-01_east": Door("7a_a-01_east", "7a_a-01", DoorDirection.right, False, False), + + "7a_a-02_west": Door("7a_a-02_west", "7a_a-02", DoorDirection.left, False, True), + "7a_a-02_north": Door("7a_a-02_north", "7a_a-02", DoorDirection.up, False, False), + "7a_a-02_north-west": Door("7a_a-02_north-west", "7a_a-02", DoorDirection.up, False, True), + "7a_a-02_east": Door("7a_a-02_east", "7a_a-02", DoorDirection.right, False, False), + + "7a_a-02b_east": Door("7a_a-02b_east", "7a_a-02b", DoorDirection.down, False, True), + "7a_a-02b_west": Door("7a_a-02b_west", "7a_a-02b", DoorDirection.down, False, False), + + "7a_a-03_west": Door("7a_a-03_west", "7a_a-03", DoorDirection.left, False, False), + "7a_a-03_east": Door("7a_a-03_east", "7a_a-03", DoorDirection.right, False, False), + + "7a_a-04_west": Door("7a_a-04_west", "7a_a-04", DoorDirection.left, False, False), + "7a_a-04_north": Door("7a_a-04_north", "7a_a-04", DoorDirection.up, True, False), + "7a_a-04_east": Door("7a_a-04_east", "7a_a-04", DoorDirection.right, False, False), + + "7a_a-04b_east": Door("7a_a-04b_east", "7a_a-04b", DoorDirection.down, False, False), + + "7a_a-05_west": Door("7a_a-05_west", "7a_a-05", DoorDirection.left, False, False), + "7a_a-05_east": Door("7a_a-05_east", "7a_a-05", DoorDirection.right, False, False), + + "7a_a-06_bottom": Door("7a_a-06_bottom", "7a_a-06", DoorDirection.left, False, False), + "7a_a-06_top": Door("7a_a-06_top", "7a_a-06", DoorDirection.up, False, False), + + "7a_b-00_bottom": Door("7a_b-00_bottom", "7a_b-00", DoorDirection.down, False, True), + "7a_b-00_top": Door("7a_b-00_top", "7a_b-00", DoorDirection.up, False, False), + + "7a_b-01_west": Door("7a_b-01_west", "7a_b-01", DoorDirection.down, False, True), + "7a_b-01_east": Door("7a_b-01_east", "7a_b-01", DoorDirection.right, False, False), + + "7a_b-02_south": Door("7a_b-02_south", "7a_b-02", DoorDirection.left, False, False), + "7a_b-02_north-west": Door("7a_b-02_north-west", "7a_b-02", DoorDirection.left, False, False), + "7a_b-02_north": Door("7a_b-02_north", "7a_b-02", DoorDirection.up, False, False), + "7a_b-02_north-east": Door("7a_b-02_north-east", "7a_b-02", DoorDirection.right, False, False), + + "7a_b-02b_south": Door("7a_b-02b_south", "7a_b-02b", DoorDirection.right, False, False), + "7a_b-02b_north-west": Door("7a_b-02b_north-west", "7a_b-02b", DoorDirection.left, False, False), + "7a_b-02b_north-east": Door("7a_b-02b_north-east", "7a_b-02b", DoorDirection.right, False, False), + + "7a_b-02e_east": Door("7a_b-02e_east", "7a_b-02e", DoorDirection.right, False, False), + + "7a_b-02c_west": Door("7a_b-02c_west", "7a_b-02c", DoorDirection.left, False, False), + "7a_b-02c_south-east": Door("7a_b-02c_south-east", "7a_b-02c", DoorDirection.down, False, False), + "7a_b-02c_east": Door("7a_b-02c_east", "7a_b-02c", DoorDirection.right, False, False), + + "7a_b-02d_north": Door("7a_b-02d_north", "7a_b-02d", DoorDirection.up, False, False), + "7a_b-02d_south": Door("7a_b-02d_south", "7a_b-02d", DoorDirection.down, False, False), + + "7a_b-03_west": Door("7a_b-03_west", "7a_b-03", DoorDirection.left, False, False), + "7a_b-03_north": Door("7a_b-03_north", "7a_b-03", DoorDirection.up, False, False), + "7a_b-03_east": Door("7a_b-03_east", "7a_b-03", DoorDirection.right, False, False), + + "7a_b-04_west": Door("7a_b-04_west", "7a_b-04", DoorDirection.left, False, False), + + "7a_b-05_west": Door("7a_b-05_west", "7a_b-05", DoorDirection.down, False, True), + "7a_b-05_north-west": Door("7a_b-05_north-west", "7a_b-05", DoorDirection.left, False, True), + "7a_b-05_east": Door("7a_b-05_east", "7a_b-05", DoorDirection.right, False, False), + + "7a_b-06_west": Door("7a_b-06_west", "7a_b-06", DoorDirection.left, False, False), + "7a_b-06_east": Door("7a_b-06_east", "7a_b-06", DoorDirection.right, False, False), + + "7a_b-07_west": Door("7a_b-07_west", "7a_b-07", DoorDirection.left, False, False), + "7a_b-07_east": Door("7a_b-07_east", "7a_b-07", DoorDirection.right, False, False), + + "7a_b-08_west": Door("7a_b-08_west", "7a_b-08", DoorDirection.left, False, False), + "7a_b-08_east": Door("7a_b-08_east", "7a_b-08", DoorDirection.right, False, False), + + "7a_b-09_bottom": Door("7a_b-09_bottom", "7a_b-09", DoorDirection.left, False, False), + "7a_b-09_top": Door("7a_b-09_top", "7a_b-09", DoorDirection.up, False, False), + + "7a_c-00_west": Door("7a_c-00_west", "7a_c-00", DoorDirection.down, False, True), + "7a_c-00_east": Door("7a_c-00_east", "7a_c-00", DoorDirection.up, False, False), + + "7a_c-01_bottom": Door("7a_c-01_bottom", "7a_c-01", DoorDirection.down, False, True), + "7a_c-01_top": Door("7a_c-01_top", "7a_c-01", DoorDirection.up, False, False), + + "7a_c-02_bottom": Door("7a_c-02_bottom", "7a_c-02", DoorDirection.down, False, True), + "7a_c-02_top": Door("7a_c-02_top", "7a_c-02", DoorDirection.up, False, False), + + "7a_c-03_south": Door("7a_c-03_south", "7a_c-03", DoorDirection.down, False, True), + "7a_c-03_west": Door("7a_c-03_west", "7a_c-03", DoorDirection.left, False, False), + "7a_c-03_east": Door("7a_c-03_east", "7a_c-03", DoorDirection.right, False, False), + + "7a_c-03b_east": Door("7a_c-03b_east", "7a_c-03b", DoorDirection.right, False, False), + + "7a_c-04_west": Door("7a_c-04_west", "7a_c-04", DoorDirection.left, False, True), + "7a_c-04_north-west": Door("7a_c-04_north-west", "7a_c-04", DoorDirection.up, False, False), + "7a_c-04_north-east": Door("7a_c-04_north-east", "7a_c-04", DoorDirection.up, False, False), + "7a_c-04_east": Door("7a_c-04_east", "7a_c-04", DoorDirection.right, False, False), + + "7a_c-05_west": Door("7a_c-05_west", "7a_c-05", DoorDirection.left, False, False), + + "7a_c-06_south": Door("7a_c-06_south", "7a_c-06", DoorDirection.down, False, False), + "7a_c-06_north": Door("7a_c-06_north", "7a_c-06", DoorDirection.up, False, False), + "7a_c-06_east": Door("7a_c-06_east", "7a_c-06", DoorDirection.right, False, False), + + "7a_c-06b_south": Door("7a_c-06b_south", "7a_c-06b", DoorDirection.down, False, False), + "7a_c-06b_north": Door("7a_c-06b_north", "7a_c-06b", DoorDirection.up, False, False), + "7a_c-06b_west": Door("7a_c-06b_west", "7a_c-06b", DoorDirection.left, False, False), + "7a_c-06b_east": Door("7a_c-06b_east", "7a_c-06b", DoorDirection.right, True, False), + + "7a_c-06c_west": Door("7a_c-06c_west", "7a_c-06c", DoorDirection.left, False, False), + + "7a_c-07_west": Door("7a_c-07_west", "7a_c-07", DoorDirection.left, False, False), + "7a_c-07_south-west": Door("7a_c-07_south-west", "7a_c-07", DoorDirection.down, False, True), + "7a_c-07_south-east": Door("7a_c-07_south-east", "7a_c-07", DoorDirection.down, False, True), + "7a_c-07_east": Door("7a_c-07_east", "7a_c-07", DoorDirection.right, False, False), + + "7a_c-07b_east": Door("7a_c-07b_east", "7a_c-07b", DoorDirection.right, False, False), + + "7a_c-08_west": Door("7a_c-08_west", "7a_c-08", DoorDirection.left, False, False), + "7a_c-08_east": Door("7a_c-08_east", "7a_c-08", DoorDirection.right, False, False), + + "7a_c-09_bottom": Door("7a_c-09_bottom", "7a_c-09", DoorDirection.left, False, False), + "7a_c-09_top": Door("7a_c-09_top", "7a_c-09", DoorDirection.up, False, False), + + "7a_d-00_bottom": Door("7a_d-00_bottom", "7a_d-00", DoorDirection.down, False, True), + "7a_d-00_top": Door("7a_d-00_top", "7a_d-00", DoorDirection.up, False, False), + + "7a_d-01_west": Door("7a_d-01_west", "7a_d-01", DoorDirection.down, False, True), + "7a_d-01_east": Door("7a_d-01_east", "7a_d-01", DoorDirection.right, False, False), + + "7a_d-01b_west": Door("7a_d-01b_west", "7a_d-01b", DoorDirection.left, False, False), + "7a_d-01b_south-west": Door("7a_d-01b_south-west", "7a_d-01b", DoorDirection.down, False, False), + "7a_d-01b_east": Door("7a_d-01b_east", "7a_d-01b", DoorDirection.right, False, False), + "7a_d-01b_south-east": Door("7a_d-01b_south-east", "7a_d-01b", DoorDirection.down, False, False), + + "7a_d-01c_west": Door("7a_d-01c_west", "7a_d-01c", DoorDirection.up, False, False), + "7a_d-01c_south": Door("7a_d-01c_south", "7a_d-01c", DoorDirection.down, False, False), + "7a_d-01c_east": Door("7a_d-01c_east", "7a_d-01c", DoorDirection.up, False, False), + "7a_d-01c_south-east": Door("7a_d-01c_south-east", "7a_d-01c", DoorDirection.down, False, False), + + "7a_d-01d_west": Door("7a_d-01d_west", "7a_d-01d", DoorDirection.up, False, False), + "7a_d-01d_east": Door("7a_d-01d_east", "7a_d-01d", DoorDirection.up, False, False), + + "7a_d-02_west": Door("7a_d-02_west", "7a_d-02", DoorDirection.left, False, False), + "7a_d-02_east": Door("7a_d-02_east", "7a_d-02", DoorDirection.right, False, False), + + "7a_d-03_west": Door("7a_d-03_west", "7a_d-03", DoorDirection.left, False, False), + "7a_d-03_north-west": Door("7a_d-03_north-west", "7a_d-03", DoorDirection.up, False, True), + "7a_d-03_east": Door("7a_d-03_east", "7a_d-03", DoorDirection.right, False, False), + "7a_d-03_north-east": Door("7a_d-03_north-east", "7a_d-03", DoorDirection.up, False, False), + + "7a_d-03b_west": Door("7a_d-03b_west", "7a_d-03b", DoorDirection.down, False, False), + "7a_d-03b_east": Door("7a_d-03b_east", "7a_d-03b", DoorDirection.down, False, True), + + "7a_d-04_west": Door("7a_d-04_west", "7a_d-04", DoorDirection.left, False, False), + "7a_d-04_east": Door("7a_d-04_east", "7a_d-04", DoorDirection.right, False, False), + + "7a_d-05_west": Door("7a_d-05_west", "7a_d-05", DoorDirection.left, False, False), + "7a_d-05_north-east": Door("7a_d-05_north-east", "7a_d-05", DoorDirection.up, False, False), + "7a_d-05_east": Door("7a_d-05_east", "7a_d-05", DoorDirection.right, False, False), + + "7a_d-05b_west": Door("7a_d-05b_west", "7a_d-05b", DoorDirection.left, False, False), + + "7a_d-06_west": Door("7a_d-06_west", "7a_d-06", DoorDirection.left, False, False), + "7a_d-06_south-west": Door("7a_d-06_south-west", "7a_d-06", DoorDirection.down, False, False), + "7a_d-06_south-east": Door("7a_d-06_south-east", "7a_d-06", DoorDirection.down, True, False), + "7a_d-06_east": Door("7a_d-06_east", "7a_d-06", DoorDirection.right, False, False), + + "7a_d-07_east": Door("7a_d-07_east", "7a_d-07", DoorDirection.right, False, False), + + "7a_d-08_west": Door("7a_d-08_west", "7a_d-08", DoorDirection.up, False, False), + "7a_d-08_east": Door("7a_d-08_east", "7a_d-08", DoorDirection.right, False, False), + + "7a_d-09_west": Door("7a_d-09_west", "7a_d-09", DoorDirection.left, False, False), + "7a_d-09_east": Door("7a_d-09_east", "7a_d-09", DoorDirection.down, False, False), + + "7a_d-10_west": Door("7a_d-10_west", "7a_d-10", DoorDirection.left, False, True), + "7a_d-10_north-west": Door("7a_d-10_north-west", "7a_d-10", DoorDirection.up, False, True), + "7a_d-10_north": Door("7a_d-10_north", "7a_d-10", DoorDirection.up, False, True), + "7a_d-10_north-east": Door("7a_d-10_north-east", "7a_d-10", DoorDirection.up, False, False), + "7a_d-10_east": Door("7a_d-10_east", "7a_d-10", DoorDirection.right, False, False), + + "7a_d-10b_west": Door("7a_d-10b_west", "7a_d-10b", DoorDirection.down, False, False), + "7a_d-10b_east": Door("7a_d-10b_east", "7a_d-10b", DoorDirection.down, False, True), + + "7a_d-11_bottom": Door("7a_d-11_bottom", "7a_d-11", DoorDirection.left, False, False), + "7a_d-11_top": Door("7a_d-11_top", "7a_d-11", DoorDirection.up, False, False), + + "7a_e-00b_bottom": Door("7a_e-00b_bottom", "7a_e-00b", DoorDirection.down, False, True), + "7a_e-00b_top": Door("7a_e-00b_top", "7a_e-00b", DoorDirection.up, False, False), + + "7a_e-00_west": Door("7a_e-00_west", "7a_e-00", DoorDirection.left, False, False), + "7a_e-00_south-west": Door("7a_e-00_south-west", "7a_e-00", DoorDirection.down, False, True), + "7a_e-00_north-west": Door("7a_e-00_north-west", "7a_e-00", DoorDirection.up, False, False), + "7a_e-00_east": Door("7a_e-00_east", "7a_e-00", DoorDirection.right, False, False), + + "7a_e-01_west": Door("7a_e-01_west", "7a_e-01", DoorDirection.left, False, False), + "7a_e-01_north": Door("7a_e-01_north", "7a_e-01", DoorDirection.up, False, True), + "7a_e-01_east": Door("7a_e-01_east", "7a_e-01", DoorDirection.right, False, True), + + "7a_e-01b_west": Door("7a_e-01b_west", "7a_e-01b", DoorDirection.up, False, False), + "7a_e-01b_east": Door("7a_e-01b_east", "7a_e-01b", DoorDirection.right, False, False), + + "7a_e-01c_west": Door("7a_e-01c_west", "7a_e-01c", DoorDirection.down, False, True), + "7a_e-01c_east": Door("7a_e-01c_east", "7a_e-01c", DoorDirection.down, False, False), + + "7a_e-02_west": Door("7a_e-02_west", "7a_e-02", DoorDirection.down, False, True), + "7a_e-02_east": Door("7a_e-02_east", "7a_e-02", DoorDirection.right, False, False), + + "7a_e-03_south-west": Door("7a_e-03_south-west", "7a_e-03", DoorDirection.left, False, False), + "7a_e-03_west": Door("7a_e-03_west", "7a_e-03", DoorDirection.left, False, False), + "7a_e-03_east": Door("7a_e-03_east", "7a_e-03", DoorDirection.right, False, False), + + "7a_e-04_west": Door("7a_e-04_west", "7a_e-04", DoorDirection.left, False, False), + "7a_e-04_east": Door("7a_e-04_east", "7a_e-04", DoorDirection.right, False, False), + + "7a_e-05_west": Door("7a_e-05_west", "7a_e-05", DoorDirection.left, False, False), + "7a_e-05_east": Door("7a_e-05_east", "7a_e-05", DoorDirection.right, False, False), + + "7a_e-06_west": Door("7a_e-06_west", "7a_e-06", DoorDirection.left, False, False), + "7a_e-06_east": Door("7a_e-06_east", "7a_e-06", DoorDirection.right, False, False), + + "7a_e-07_bottom": Door("7a_e-07_bottom", "7a_e-07", DoorDirection.left, False, False), + "7a_e-07_top": Door("7a_e-07_top", "7a_e-07", DoorDirection.up, False, False), + + "7a_e-08_south": Door("7a_e-08_south", "7a_e-08", DoorDirection.down, False, True), + "7a_e-08_west": Door("7a_e-08_west", "7a_e-08", DoorDirection.left, False, False), + "7a_e-08_east": Door("7a_e-08_east", "7a_e-08", DoorDirection.right, False, False), + + "7a_e-09_north": Door("7a_e-09_north", "7a_e-09", DoorDirection.up, True, False), + "7a_e-09_east": Door("7a_e-09_east", "7a_e-09", DoorDirection.right, False, False), + + "7a_e-11_south": Door("7a_e-11_south", "7a_e-11", DoorDirection.down, False, False), + "7a_e-11_north": Door("7a_e-11_north", "7a_e-11", DoorDirection.up, False, False), + "7a_e-11_east": Door("7a_e-11_east", "7a_e-11", DoorDirection.down, False, False), + + "7a_e-12_west": Door("7a_e-12_west", "7a_e-12", DoorDirection.down, False, False), + + "7a_e-10_south": Door("7a_e-10_south", "7a_e-10", DoorDirection.left, False, False), + "7a_e-10_north": Door("7a_e-10_north", "7a_e-10", DoorDirection.up, False, True), + "7a_e-10_east": Door("7a_e-10_east", "7a_e-10", DoorDirection.right, False, False), + + "7a_e-10b_west": Door("7a_e-10b_west", "7a_e-10b", DoorDirection.left, False, False), + "7a_e-10b_east": Door("7a_e-10b_east", "7a_e-10b", DoorDirection.right, False, False), + + "7a_e-13_bottom": Door("7a_e-13_bottom", "7a_e-13", DoorDirection.left, False, False), + "7a_e-13_top": Door("7a_e-13_top", "7a_e-13", DoorDirection.up, False, False), + + "7a_f-00_south": Door("7a_f-00_south", "7a_f-00", DoorDirection.down, False, True), + "7a_f-00_west": Door("7a_f-00_west", "7a_f-00", DoorDirection.left, True, False), + "7a_f-00_north-west": Door("7a_f-00_north-west", "7a_f-00", DoorDirection.left, False, True), + "7a_f-00_east": Door("7a_f-00_east", "7a_f-00", DoorDirection.right, False, False), + "7a_f-00_north-east": Door("7a_f-00_north-east", "7a_f-00", DoorDirection.right, False, False), + + "7a_f-01_south": Door("7a_f-01_south", "7a_f-01", DoorDirection.right, False, False), + "7a_f-01_north": Door("7a_f-01_north", "7a_f-01", DoorDirection.right, True, False), + + "7a_f-02_west": Door("7a_f-02_west", "7a_f-02", DoorDirection.left, True, False), + "7a_f-02_north-west": Door("7a_f-02_north-west", "7a_f-02", DoorDirection.left, False, True), + "7a_f-02_east": Door("7a_f-02_east", "7a_f-02", DoorDirection.right, False, False), + "7a_f-02_north-east": Door("7a_f-02_north-east", "7a_f-02", DoorDirection.up, False, False), + + "7a_f-02b_west": Door("7a_f-02b_west", "7a_f-02b", DoorDirection.down, False, False), + "7a_f-02b_east": Door("7a_f-02b_east", "7a_f-02b", DoorDirection.right, False, False), + + "7a_f-04_west": Door("7a_f-04_west", "7a_f-04", DoorDirection.left, False, False), + "7a_f-04_east": Door("7a_f-04_east", "7a_f-04", DoorDirection.right, False, False), + + "7a_f-03_west": Door("7a_f-03_west", "7a_f-03", DoorDirection.left, False, False), + "7a_f-03_east": Door("7a_f-03_east", "7a_f-03", DoorDirection.right, False, False), + + "7a_f-05_west": Door("7a_f-05_west", "7a_f-05", DoorDirection.left, False, False), + "7a_f-05_south-west": Door("7a_f-05_south-west", "7a_f-05", DoorDirection.down, False, True), + "7a_f-05_north-west": Door("7a_f-05_north-west", "7a_f-05", DoorDirection.up, False, False), + "7a_f-05_south": Door("7a_f-05_south", "7a_f-05", DoorDirection.down, False, False), + "7a_f-05_north": Door("7a_f-05_north", "7a_f-05", DoorDirection.up, False, False), + "7a_f-05_south-east": Door("7a_f-05_south-east", "7a_f-05", DoorDirection.down, False, True), + "7a_f-05_east": Door("7a_f-05_east", "7a_f-05", DoorDirection.right, False, False), + "7a_f-05_north-east": Door("7a_f-05_north-east", "7a_f-05", DoorDirection.up, False, False), + + "7a_f-06_north-west": Door("7a_f-06_north-west", "7a_f-06", DoorDirection.up, False, False), + "7a_f-06_north": Door("7a_f-06_north", "7a_f-06", DoorDirection.up, False, False), + "7a_f-06_north-east": Door("7a_f-06_north-east", "7a_f-06", DoorDirection.up, False, False), + + "7a_f-07_west": Door("7a_f-07_west", "7a_f-07", DoorDirection.left, False, True), + "7a_f-07_south-west": Door("7a_f-07_south-west", "7a_f-07", DoorDirection.down, False, True), + "7a_f-07_south": Door("7a_f-07_south", "7a_f-07", DoorDirection.down, False, False), + "7a_f-07_south-east": Door("7a_f-07_south-east", "7a_f-07", DoorDirection.down, False, True), + + "7a_f-08_west": Door("7a_f-08_west", "7a_f-08", DoorDirection.left, False, False), + "7a_f-08_north-west": Door("7a_f-08_north-west", "7a_f-08", DoorDirection.up, True, False), + "7a_f-08_east": Door("7a_f-08_east", "7a_f-08", DoorDirection.right, False, False), + + "7a_f-08b_west": Door("7a_f-08b_west", "7a_f-08b", DoorDirection.down, False, False), + "7a_f-08b_east": Door("7a_f-08b_east", "7a_f-08b", DoorDirection.right, False, False), + + "7a_f-08d_west": Door("7a_f-08d_west", "7a_f-08d", DoorDirection.left, False, False), + "7a_f-08d_east": Door("7a_f-08d_east", "7a_f-08d", DoorDirection.right, False, False), + + "7a_f-08c_west": Door("7a_f-08c_west", "7a_f-08c", DoorDirection.left, False, False), + "7a_f-08c_east": Door("7a_f-08c_east", "7a_f-08c", DoorDirection.down, False, False), + + "7a_f-09_west": Door("7a_f-09_west", "7a_f-09", DoorDirection.left, False, False), + "7a_f-09_east": Door("7a_f-09_east", "7a_f-09", DoorDirection.right, False, False), + + "7a_f-10_west": Door("7a_f-10_west", "7a_f-10", DoorDirection.left, False, False), + "7a_f-10_north-east": Door("7a_f-10_north-east", "7a_f-10", DoorDirection.up, False, True), + "7a_f-10_east": Door("7a_f-10_east", "7a_f-10", DoorDirection.right, False, False), + + "7a_f-10b_west": Door("7a_f-10b_west", "7a_f-10b", DoorDirection.left, False, False), + "7a_f-10b_east": Door("7a_f-10b_east", "7a_f-10b", DoorDirection.right, False, False), + + "7a_f-11_bottom": Door("7a_f-11_bottom", "7a_f-11", DoorDirection.left, False, False), + "7a_f-11_top": Door("7a_f-11_top", "7a_f-11", DoorDirection.up, False, False), + + "7a_g-00_bottom": Door("7a_g-00_bottom", "7a_g-00", DoorDirection.down, False, True), + "7a_g-00_top": Door("7a_g-00_top", "7a_g-00", DoorDirection.up, False, False), + + "7a_g-00b_bottom": Door("7a_g-00b_bottom", "7a_g-00b", DoorDirection.down, False, True), + "7a_g-00b_top": Door("7a_g-00b_top", "7a_g-00b", DoorDirection.up, False, False), + + "7a_g-01_bottom": Door("7a_g-01_bottom", "7a_g-01", DoorDirection.down, False, True), + "7a_g-01_top": Door("7a_g-01_top", "7a_g-01", DoorDirection.up, False, False), + + "7a_g-02_bottom": Door("7a_g-02_bottom", "7a_g-02", DoorDirection.down, False, True), + "7a_g-02_top": Door("7a_g-02_top", "7a_g-02", DoorDirection.up, False, False), + + "7a_g-03_bottom": Door("7a_g-03_bottom", "7a_g-03", DoorDirection.down, False, True), + + "7b_a-00_east": Door("7b_a-00_east", "7b_a-00", DoorDirection.right, False, False), + + "7b_a-01_west": Door("7b_a-01_west", "7b_a-01", DoorDirection.left, False, False), + "7b_a-01_east": Door("7b_a-01_east", "7b_a-01", DoorDirection.right, False, False), + + "7b_a-02_west": Door("7b_a-02_west", "7b_a-02", DoorDirection.left, False, False), + "7b_a-02_east": Door("7b_a-02_east", "7b_a-02", DoorDirection.right, False, False), + + "7b_a-03_bottom": Door("7b_a-03_bottom", "7b_a-03", DoorDirection.left, False, True), + "7b_a-03_top": Door("7b_a-03_top", "7b_a-03", DoorDirection.up, False, False), + + "7b_b-00_bottom": Door("7b_b-00_bottom", "7b_b-00", DoorDirection.down, False, True), + "7b_b-00_top": Door("7b_b-00_top", "7b_b-00", DoorDirection.up, False, False), + + "7b_b-01_bottom": Door("7b_b-01_bottom", "7b_b-01", DoorDirection.down, False, True), + "7b_b-01_top": Door("7b_b-01_top", "7b_b-01", DoorDirection.up, False, False), + + "7b_b-02_west": Door("7b_b-02_west", "7b_b-02", DoorDirection.down, False, True), + "7b_b-02_east": Door("7b_b-02_east", "7b_b-02", DoorDirection.right, False, False), + + "7b_b-03_bottom": Door("7b_b-03_bottom", "7b_b-03", DoorDirection.left, False, False), + "7b_b-03_top": Door("7b_b-03_top", "7b_b-03", DoorDirection.up, False, False), + + "7b_c-01_west": Door("7b_c-01_west", "7b_c-01", DoorDirection.down, False, True), + "7b_c-01_east": Door("7b_c-01_east", "7b_c-01", DoorDirection.up, False, False), + + "7b_c-00_west": Door("7b_c-00_west", "7b_c-00", DoorDirection.down, False, True), + "7b_c-00_east": Door("7b_c-00_east", "7b_c-00", DoorDirection.up, False, False), + + "7b_c-02_west": Door("7b_c-02_west", "7b_c-02", DoorDirection.down, False, True), + "7b_c-02_east": Door("7b_c-02_east", "7b_c-02", DoorDirection.right, False, False), + + "7b_c-03_bottom": Door("7b_c-03_bottom", "7b_c-03", DoorDirection.left, False, True), + "7b_c-03_top": Door("7b_c-03_top", "7b_c-03", DoorDirection.up, False, False), + + "7b_d-00_west": Door("7b_d-00_west", "7b_d-00", DoorDirection.down, False, True), + "7b_d-00_east": Door("7b_d-00_east", "7b_d-00", DoorDirection.right, False, False), + + "7b_d-01_west": Door("7b_d-01_west", "7b_d-01", DoorDirection.left, False, False), + "7b_d-01_east": Door("7b_d-01_east", "7b_d-01", DoorDirection.right, False, False), + + "7b_d-02_west": Door("7b_d-02_west", "7b_d-02", DoorDirection.left, False, False), + "7b_d-02_east": Door("7b_d-02_east", "7b_d-02", DoorDirection.right, False, False), + + "7b_d-03_bottom": Door("7b_d-03_bottom", "7b_d-03", DoorDirection.left, False, False), + "7b_d-03_top": Door("7b_d-03_top", "7b_d-03", DoorDirection.up, False, False), + + "7b_e-00_west": Door("7b_e-00_west", "7b_e-00", DoorDirection.down, False, True), + "7b_e-00_east": Door("7b_e-00_east", "7b_e-00", DoorDirection.up, False, False), + + "7b_e-01_west": Door("7b_e-01_west", "7b_e-01", DoorDirection.down, False, True), + "7b_e-01_east": Door("7b_e-01_east", "7b_e-01", DoorDirection.up, False, False), + + "7b_e-02_west": Door("7b_e-02_west", "7b_e-02", DoorDirection.down, False, True), + "7b_e-02_east": Door("7b_e-02_east", "7b_e-02", DoorDirection.right, False, False), + + "7b_e-03_bottom": Door("7b_e-03_bottom", "7b_e-03", DoorDirection.left, False, False), + "7b_e-03_top": Door("7b_e-03_top", "7b_e-03", DoorDirection.up, False, False), + + "7b_f-00_west": Door("7b_f-00_west", "7b_f-00", DoorDirection.down, False, True), + "7b_f-00_east": Door("7b_f-00_east", "7b_f-00", DoorDirection.right, False, False), + + "7b_f-01_west": Door("7b_f-01_west", "7b_f-01", DoorDirection.left, False, False), + "7b_f-01_east": Door("7b_f-01_east", "7b_f-01", DoorDirection.right, False, False), + + "7b_f-02_west": Door("7b_f-02_west", "7b_f-02", DoorDirection.left, False, False), + "7b_f-02_east": Door("7b_f-02_east", "7b_f-02", DoorDirection.right, False, False), + + "7b_f-03_bottom": Door("7b_f-03_bottom", "7b_f-03", DoorDirection.left, False, False), + "7b_f-03_top": Door("7b_f-03_top", "7b_f-03", DoorDirection.up, False, False), + + "7b_g-00_bottom": Door("7b_g-00_bottom", "7b_g-00", DoorDirection.down, False, True), + "7b_g-00_top": Door("7b_g-00_top", "7b_g-00", DoorDirection.up, False, False), + + "7b_g-01_bottom": Door("7b_g-01_bottom", "7b_g-01", DoorDirection.down, False, True), + "7b_g-01_top": Door("7b_g-01_top", "7b_g-01", DoorDirection.up, False, False), + + "7b_g-02_bottom": Door("7b_g-02_bottom", "7b_g-02", DoorDirection.down, False, True), + "7b_g-02_top": Door("7b_g-02_top", "7b_g-02", DoorDirection.up, False, False), + + "7b_g-03_bottom": Door("7b_g-03_bottom", "7b_g-03", DoorDirection.down, False, True), + + "7c_01_east": Door("7c_01_east", "7c_01", DoorDirection.up, False, False), + + "7c_02_west": Door("7c_02_west", "7c_02", DoorDirection.down, False, True), + "7c_02_east": Door("7c_02_east", "7c_02", DoorDirection.up, False, False), + + "7c_03_west": Door("7c_03_west", "7c_03", DoorDirection.down, False, True), + + "8a_outside_east": Door("8a_outside_east", "8a_outside", DoorDirection.right, False, False), + + "8a_bridge_west": Door("8a_bridge_west", "8a_bridge", DoorDirection.left, False, False), + "8a_bridge_east": Door("8a_bridge_east", "8a_bridge", DoorDirection.right, False, False), + + "8a_secret_west": Door("8a_secret_west", "8a_secret", DoorDirection.left, False, False), + + "9a_00_east": Door("9a_00_east", "9a_00", DoorDirection.right, False, False), + "9a_00_west": Door("9a_00_west", "9a_00", DoorDirection.left, False, False), + + "9a_0x_east": Door("9a_0x_east", "9a_0x", DoorDirection.right, False, False), + + "9a_01_west": Door("9a_01_west", "9a_01", DoorDirection.left, False, False), + "9a_01_east": Door("9a_01_east", "9a_01", DoorDirection.right, False, False), + + "9a_02_west": Door("9a_02_west", "9a_02", DoorDirection.left, False, False), + "9a_02_east": Door("9a_02_east", "9a_02", DoorDirection.right, False, False), + + "9a_a-00_west": Door("9a_a-00_west", "9a_a-00", DoorDirection.left, False, True), + "9a_a-00_east": Door("9a_a-00_east", "9a_a-00", DoorDirection.right, False, False), + + "9a_a-01_west": Door("9a_a-01_west", "9a_a-01", DoorDirection.left, False, False), + "9a_a-01_east": Door("9a_a-01_east", "9a_a-01", DoorDirection.right, False, False), + + "9a_a-02_west": Door("9a_a-02_west", "9a_a-02", DoorDirection.left, False, False), + "9a_a-02_east": Door("9a_a-02_east", "9a_a-02", DoorDirection.up, False, False), + + "9a_a-03_bottom": Door("9a_a-03_bottom", "9a_a-03", DoorDirection.down, False, True), + "9a_a-03_top": Door("9a_a-03_top", "9a_a-03", DoorDirection.up, False, False), + + "9a_b-00_west": Door("9a_b-00_west", "9a_b-00", DoorDirection.left, False, False), + "9a_b-00_south": Door("9a_b-00_south", "9a_b-00", DoorDirection.down, False, True), + "9a_b-00_north": Door("9a_b-00_north", "9a_b-00", DoorDirection.up, False, False), + "9a_b-00_east": Door("9a_b-00_east", "9a_b-00", DoorDirection.right, False, False), + + "9a_b-01_west": Door("9a_b-01_west", "9a_b-01", DoorDirection.left, False, False), + "9a_b-01_east": Door("9a_b-01_east", "9a_b-01", DoorDirection.right, False, False), + + "9a_b-02_west": Door("9a_b-02_west", "9a_b-02", DoorDirection.left, False, False), + "9a_b-02_east": Door("9a_b-02_east", "9a_b-02", DoorDirection.right, False, False), + + "9a_b-03_west": Door("9a_b-03_west", "9a_b-03", DoorDirection.left, False, False), + "9a_b-03_east": Door("9a_b-03_east", "9a_b-03", DoorDirection.right, False, False), + + "9a_b-04_north-west": Door("9a_b-04_north-west", "9a_b-04", DoorDirection.up, False, False), + "9a_b-04_west": Door("9a_b-04_west", "9a_b-04", DoorDirection.left, False, False), + "9a_b-04_east": Door("9a_b-04_east", "9a_b-04", DoorDirection.up, False, False), + + "9a_b-05_west": Door("9a_b-05_west", "9a_b-05", DoorDirection.down, False, False), + "9a_b-05_east": Door("9a_b-05_east", "9a_b-05", DoorDirection.down, False, True), + + "9a_b-06_east": Door("9a_b-06_east", "9a_b-06", DoorDirection.right, False, False), + + "9a_b-07b_bottom": Door("9a_b-07b_bottom", "9a_b-07b", DoorDirection.down, False, True), + "9a_b-07b_top": Door("9a_b-07b_top", "9a_b-07b", DoorDirection.up, False, False), + + "9a_b-07_bottom": Door("9a_b-07_bottom", "9a_b-07", DoorDirection.down, False, True), + "9a_b-07_top": Door("9a_b-07_top", "9a_b-07", DoorDirection.up, False, False), + + "9a_c-00_west": Door("9a_c-00_west", "9a_c-00", DoorDirection.down, False, True), + "9a_c-00_north-east": Door("9a_c-00_north-east", "9a_c-00", DoorDirection.up, False, False), + "9a_c-00_east": Door("9a_c-00_east", "9a_c-00", DoorDirection.right, False, False), + + "9a_c-00b_west": Door("9a_c-00b_west", "9a_c-00b", DoorDirection.down, False, False), + + "9a_c-01_west": Door("9a_c-01_west", "9a_c-01", DoorDirection.left, False, False), + "9a_c-01_east": Door("9a_c-01_east", "9a_c-01", DoorDirection.right, False, False), + + "9a_c-02_west": Door("9a_c-02_west", "9a_c-02", DoorDirection.left, False, False), + "9a_c-02_east": Door("9a_c-02_east", "9a_c-02", DoorDirection.right, False, False), + + "9a_c-03_west": Door("9a_c-03_west", "9a_c-03", DoorDirection.left, False, False), + "9a_c-03_north-west": Door("9a_c-03_north-west", "9a_c-03", DoorDirection.up, False, True), + "9a_c-03_north": Door("9a_c-03_north", "9a_c-03", DoorDirection.up, False, False), + "9a_c-03_north-east": Door("9a_c-03_north-east", "9a_c-03", DoorDirection.up, False, True), + "9a_c-03_east": Door("9a_c-03_east", "9a_c-03", DoorDirection.right, False, False), + + "9a_c-03b_west": Door("9a_c-03b_west", "9a_c-03b", DoorDirection.down, False, False), + "9a_c-03b_south": Door("9a_c-03b_south", "9a_c-03b", DoorDirection.down, False, False), + "9a_c-03b_east": Door("9a_c-03b_east", "9a_c-03b", DoorDirection.down, False, False), + + "9a_c-04_west": Door("9a_c-04_west", "9a_c-04", DoorDirection.left, False, False), + "9a_c-04_east": Door("9a_c-04_east", "9a_c-04", DoorDirection.right, False, False), + + "9a_d-00_bottom": Door("9a_d-00_bottom", "9a_d-00", DoorDirection.left, False, True), + "9a_d-00_top": Door("9a_d-00_top", "9a_d-00", DoorDirection.up, False, False), + + "9a_d-01_bottom": Door("9a_d-01_bottom", "9a_d-01", DoorDirection.down, False, True), + "9a_d-01_top": Door("9a_d-01_top", "9a_d-01", DoorDirection.up, False, False), + + "9a_d-02_bottom": Door("9a_d-02_bottom", "9a_d-02", DoorDirection.down, False, True), + "9a_d-02_top": Door("9a_d-02_top", "9a_d-02", DoorDirection.up, False, False), + + "9a_d-03_bottom": Door("9a_d-03_bottom", "9a_d-03", DoorDirection.down, False, True), + "9a_d-03_top": Door("9a_d-03_top", "9a_d-03", DoorDirection.up, False, False), + + "9a_d-04_bottom": Door("9a_d-04_bottom", "9a_d-04", DoorDirection.down, False, True), + "9a_d-04_top": Door("9a_d-04_top", "9a_d-04", DoorDirection.up, False, False), + + "9a_d-05_bottom": Door("9a_d-05_bottom", "9a_d-05", DoorDirection.down, False, True), + "9a_d-05_top": Door("9a_d-05_top", "9a_d-05", DoorDirection.up, False, False), + + "9a_d-06_bottom": Door("9a_d-06_bottom", "9a_d-06", DoorDirection.down, False, True), + "9a_d-06_top": Door("9a_d-06_top", "9a_d-06", DoorDirection.up, False, False), + + "9a_d-07_bottom": Door("9a_d-07_bottom", "9a_d-07", DoorDirection.down, False, True), + "9a_d-07_top": Door("9a_d-07_top", "9a_d-07", DoorDirection.up, False, False), + + "9a_d-08_west": Door("9a_d-08_west", "9a_d-08", DoorDirection.down, False, True), + "9a_d-08_east": Door("9a_d-08_east", "9a_d-08", DoorDirection.right, False, False), + + "9a_d-09_west": Door("9a_d-09_west", "9a_d-09", DoorDirection.left, False, True), + "9a_d-09_east": Door("9a_d-09_east", "9a_d-09", DoorDirection.right, False, False), + + "9a_d-10_west": Door("9a_d-10_west", "9a_d-10", DoorDirection.left, False, True), + "9a_d-10_east": Door("9a_d-10_east", "9a_d-10", DoorDirection.right, False, False), + + "9a_d-10b_west": Door("9a_d-10b_west", "9a_d-10b", DoorDirection.left, False, True), + "9a_d-10b_east": Door("9a_d-10b_east", "9a_d-10b", DoorDirection.right, False, False), + + "9a_d-10c_west": Door("9a_d-10c_west", "9a_d-10c", DoorDirection.left, False, True), + "9a_d-10c_east": Door("9a_d-10c_east", "9a_d-10c", DoorDirection.right, False, False), + + "9a_d-11_west": Door("9a_d-11_west", "9a_d-11", DoorDirection.left, False, True), + "9a_d-11_east": Door("9a_d-11_east", "9a_d-11", DoorDirection.right, False, False), + + "9a_space_west": Door("9a_space_west", "9a_space", DoorDirection.left, False, True), + + "9b_00_east": Door("9b_00_east", "9b_00", DoorDirection.right, False, False), + + "9b_01_west": Door("9b_01_west", "9b_01", DoorDirection.left, False, False), + "9b_01_east": Door("9b_01_east", "9b_01", DoorDirection.right, False, False), + + "9b_a-00_west": Door("9b_a-00_west", "9b_a-00", DoorDirection.left, False, True), + "9b_a-00_east": Door("9b_a-00_east", "9b_a-00", DoorDirection.right, False, False), + + "9b_a-01_west": Door("9b_a-01_west", "9b_a-01", DoorDirection.left, False, False), + "9b_a-01_east": Door("9b_a-01_east", "9b_a-01", DoorDirection.right, False, False), + + "9b_a-02_west": Door("9b_a-02_west", "9b_a-02", DoorDirection.left, False, False), + "9b_a-02_east": Door("9b_a-02_east", "9b_a-02", DoorDirection.up, False, False), + + "9b_a-03_west": Door("9b_a-03_west", "9b_a-03", DoorDirection.down, False, True), + "9b_a-03_east": Door("9b_a-03_east", "9b_a-03", DoorDirection.right, False, False), + + "9b_a-04_west": Door("9b_a-04_west", "9b_a-04", DoorDirection.left, False, False), + "9b_a-04_east": Door("9b_a-04_east", "9b_a-04", DoorDirection.right, False, False), + + "9b_a-05_west": Door("9b_a-05_west", "9b_a-05", DoorDirection.left, False, False), + "9b_a-05_east": Door("9b_a-05_east", "9b_a-05", DoorDirection.up, False, False), + + "9b_b-00_west": Door("9b_b-00_west", "9b_b-00", DoorDirection.down, False, True), + "9b_b-00_east": Door("9b_b-00_east", "9b_b-00", DoorDirection.right, False, False), + + "9b_b-01_west": Door("9b_b-01_west", "9b_b-01", DoorDirection.left, False, False), + "9b_b-01_east": Door("9b_b-01_east", "9b_b-01", DoorDirection.right, False, False), + + "9b_b-02_west": Door("9b_b-02_west", "9b_b-02", DoorDirection.left, False, False), + "9b_b-02_east": Door("9b_b-02_east", "9b_b-02", DoorDirection.right, False, False), + + "9b_b-03_west": Door("9b_b-03_west", "9b_b-03", DoorDirection.left, False, False), + "9b_b-03_east": Door("9b_b-03_east", "9b_b-03", DoorDirection.right, False, False), + + "9b_b-04_west": Door("9b_b-04_west", "9b_b-04", DoorDirection.left, False, False), + "9b_b-04_east": Door("9b_b-04_east", "9b_b-04", DoorDirection.right, False, False), + + "9b_b-05_west": Door("9b_b-05_west", "9b_b-05", DoorDirection.left, False, False), + "9b_b-05_east": Door("9b_b-05_east", "9b_b-05", DoorDirection.right, False, False), + + "9b_c-01_bottom": Door("9b_c-01_bottom", "9b_c-01", DoorDirection.left, False, True), + "9b_c-01_top": Door("9b_c-01_top", "9b_c-01", DoorDirection.up, False, False), + + "9b_c-02_bottom": Door("9b_c-02_bottom", "9b_c-02", DoorDirection.down, False, True), + "9b_c-02_top": Door("9b_c-02_top", "9b_c-02", DoorDirection.up, False, False), + + "9b_c-03_bottom": Door("9b_c-03_bottom", "9b_c-03", DoorDirection.down, False, True), + "9b_c-03_top": Door("9b_c-03_top", "9b_c-03", DoorDirection.up, False, False), + + "9b_c-04_bottom": Door("9b_c-04_bottom", "9b_c-04", DoorDirection.down, False, True), + "9b_c-04_top": Door("9b_c-04_top", "9b_c-04", DoorDirection.up, False, False), + + "9b_c-05_west": Door("9b_c-05_west", "9b_c-05", DoorDirection.down, False, True), + "9b_c-05_east": Door("9b_c-05_east", "9b_c-05", DoorDirection.right, False, False), + + "9b_c-06_west": Door("9b_c-06_west", "9b_c-06", DoorDirection.left, False, False), + "9b_c-06_east": Door("9b_c-06_east", "9b_c-06", DoorDirection.right, False, False), + + "9b_c-08_west": Door("9b_c-08_west", "9b_c-08", DoorDirection.left, False, False), + "9b_c-08_east": Door("9b_c-08_east", "9b_c-08", DoorDirection.right, False, False), + + "9b_c-07_west": Door("9b_c-07_west", "9b_c-07", DoorDirection.left, False, False), + "9b_c-07_east": Door("9b_c-07_east", "9b_c-07", DoorDirection.right, False, False), + + "9b_space_west": Door("9b_space_west", "9b_space", DoorDirection.left, False, True), + + "9c_intro_east": Door("9c_intro_east", "9c_intro", DoorDirection.right, False, False), + + "9c_00_west": Door("9c_00_west", "9c_00", DoorDirection.left, False, False), + "9c_00_east": Door("9c_00_east", "9c_00", DoorDirection.right, False, False), + + "9c_01_west": Door("9c_01_west", "9c_01", DoorDirection.left, False, True), + "9c_01_east": Door("9c_01_east", "9c_01", DoorDirection.right, False, False), + + "9c_02_west": Door("9c_02_west", "9c_02", DoorDirection.left, False, True), + + "10a_intro-00-past_east": Door("10a_intro-00-past_east", "10a_intro-00-past", DoorDirection.special, False, False), + + "10a_intro-01-future_west": Door("10a_intro-01-future_west", "10a_intro-01-future", DoorDirection.special, False, True), + "10a_intro-01-future_east": Door("10a_intro-01-future_east", "10a_intro-01-future", DoorDirection.up, False, False), + + "10a_intro-02-launch_bottom": Door("10a_intro-02-launch_bottom", "10a_intro-02-launch", DoorDirection.down, False, True), + "10a_intro-02-launch_top": Door("10a_intro-02-launch_top", "10a_intro-02-launch", DoorDirection.up, False, False), + + "10a_intro-03-space_west": Door("10a_intro-03-space_west", "10a_intro-03-space", DoorDirection.down, False, True), + "10a_intro-03-space_east": Door("10a_intro-03-space_east", "10a_intro-03-space", DoorDirection.right, False, False), + + "10a_a-00_west": Door("10a_a-00_west", "10a_a-00", DoorDirection.left, False, False), + "10a_a-00_east": Door("10a_a-00_east", "10a_a-00", DoorDirection.right, False, False), + + "10a_a-01_west": Door("10a_a-01_west", "10a_a-01", DoorDirection.left, False, False), + "10a_a-01_east": Door("10a_a-01_east", "10a_a-01", DoorDirection.right, False, False), + + "10a_a-02_west": Door("10a_a-02_west", "10a_a-02", DoorDirection.left, False, False), + "10a_a-02_east": Door("10a_a-02_east", "10a_a-02", DoorDirection.right, False, False), + + "10a_a-03_west": Door("10a_a-03_west", "10a_a-03", DoorDirection.left, False, False), + "10a_a-03_east": Door("10a_a-03_east", "10a_a-03", DoorDirection.right, False, False), + + "10a_a-04_west": Door("10a_a-04_west", "10a_a-04", DoorDirection.left, False, False), + "10a_a-04_east": Door("10a_a-04_east", "10a_a-04", DoorDirection.right, False, False), + + "10a_a-05_west": Door("10a_a-05_west", "10a_a-05", DoorDirection.left, False, False), + "10a_a-05_east": Door("10a_a-05_east", "10a_a-05", DoorDirection.right, False, False), + + "10a_b-00_west": Door("10a_b-00_west", "10a_b-00", DoorDirection.left, False, False), + "10a_b-00_east": Door("10a_b-00_east", "10a_b-00", DoorDirection.right, False, False), + + "10a_b-01_west": Door("10a_b-01_west", "10a_b-01", DoorDirection.left, False, False), + "10a_b-01_east": Door("10a_b-01_east", "10a_b-01", DoorDirection.right, False, False), + + "10a_b-02_west": Door("10a_b-02_west", "10a_b-02", DoorDirection.left, False, False), + "10a_b-02_east": Door("10a_b-02_east", "10a_b-02", DoorDirection.right, False, False), + + "10a_b-03_west": Door("10a_b-03_west", "10a_b-03", DoorDirection.left, False, False), + "10a_b-03_east": Door("10a_b-03_east", "10a_b-03", DoorDirection.right, False, False), + + "10a_b-04_west": Door("10a_b-04_west", "10a_b-04", DoorDirection.left, False, False), + "10a_b-04_east": Door("10a_b-04_east", "10a_b-04", DoorDirection.right, False, False), + + "10a_b-05_west": Door("10a_b-05_west", "10a_b-05", DoorDirection.left, False, False), + "10a_b-05_east": Door("10a_b-05_east", "10a_b-05", DoorDirection.right, False, False), + + "10a_b-06_west": Door("10a_b-06_west", "10a_b-06", DoorDirection.left, False, False), + "10a_b-06_east": Door("10a_b-06_east", "10a_b-06", DoorDirection.right, False, False), + + "10a_b-07_west": Door("10a_b-07_west", "10a_b-07", DoorDirection.left, False, False), + "10a_b-07_east": Door("10a_b-07_east", "10a_b-07", DoorDirection.right, False, False), + + "10a_c-00_west": Door("10a_c-00_west", "10a_c-00", DoorDirection.left, False, False), + "10a_c-00_east": Door("10a_c-00_east", "10a_c-00", DoorDirection.right, False, False), + "10a_c-00_north-east": Door("10a_c-00_north-east", "10a_c-00", DoorDirection.right, False, False), + + "10a_c-00b_west": Door("10a_c-00b_west", "10a_c-00b", DoorDirection.left, False, False), + "10a_c-00b_east": Door("10a_c-00b_east", "10a_c-00b", DoorDirection.right, False, False), + + "10a_c-01_west": Door("10a_c-01_west", "10a_c-01", DoorDirection.left, False, False), + "10a_c-01_east": Door("10a_c-01_east", "10a_c-01", DoorDirection.right, False, False), + + "10a_c-02_west": Door("10a_c-02_west", "10a_c-02", DoorDirection.left, False, False), + "10a_c-02_east": Door("10a_c-02_east", "10a_c-02", DoorDirection.up, False, False), + + "10a_c-alt-00_west": Door("10a_c-alt-00_west", "10a_c-alt-00", DoorDirection.left, False, False), + "10a_c-alt-00_east": Door("10a_c-alt-00_east", "10a_c-alt-00", DoorDirection.right, False, False), + + "10a_c-alt-01_west": Door("10a_c-alt-01_west", "10a_c-alt-01", DoorDirection.left, False, False), + "10a_c-alt-01_east": Door("10a_c-alt-01_east", "10a_c-alt-01", DoorDirection.right, False, False), + + "10a_c-03_south-west": Door("10a_c-03_south-west", "10a_c-03", DoorDirection.left, False, False), + "10a_c-03_south": Door("10a_c-03_south", "10a_c-03", DoorDirection.down, False, True), + "10a_c-03_north": Door("10a_c-03_north", "10a_c-03", DoorDirection.up, False, False), + + "10a_d-00_south": Door("10a_d-00_south", "10a_d-00", DoorDirection.down, False, True), + "10a_d-00_north": Door("10a_d-00_north", "10a_d-00", DoorDirection.up, False, False), + "10a_d-00_north-east-door": Door("10a_d-00_north-east-door", "10a_d-00", DoorDirection.right, False, False), + "10a_d-00_south-east-door": Door("10a_d-00_south-east-door", "10a_d-00", DoorDirection.right, False, False), + "10a_d-00_south-west-door": Door("10a_d-00_south-west-door", "10a_d-00", DoorDirection.left, False, False), + "10a_d-00_west-door": Door("10a_d-00_west-door", "10a_d-00", DoorDirection.up, False, False), + "10a_d-00_north-west-door": Door("10a_d-00_north-west-door", "10a_d-00", DoorDirection.up, False, False), + + "10a_d-04_west": Door("10a_d-04_west", "10a_d-04", DoorDirection.left, False, False), + + "10a_d-03_west": Door("10a_d-03_west", "10a_d-03", DoorDirection.left, False, False), + + "10a_d-01_east": Door("10a_d-01_east", "10a_d-01", DoorDirection.right, False, False), + + "10a_d-02_bottom": Door("10a_d-02_bottom", "10a_d-02", DoorDirection.down, False, False), + + "10a_d-05_west": Door("10a_d-05_west", "10a_d-05", DoorDirection.down, False, False), + "10a_d-05_south": Door("10a_d-05_south", "10a_d-05", DoorDirection.down, False, True), + "10a_d-05_north": Door("10a_d-05_north", "10a_d-05", DoorDirection.up, False, False), + + "10a_e-00y_south": Door("10a_e-00y_south", "10a_e-00y", DoorDirection.down, False, False), + "10a_e-00y_south-east": Door("10a_e-00y_south-east", "10a_e-00y", DoorDirection.right, False, False), + "10a_e-00y_north-east": Door("10a_e-00y_north-east", "10a_e-00y", DoorDirection.right, False, False), + "10a_e-00y_north": Door("10a_e-00y_north", "10a_e-00y", DoorDirection.up, False, False), + + "10a_e-00yb_south": Door("10a_e-00yb_south", "10a_e-00yb", DoorDirection.left, False, False), + "10a_e-00yb_north": Door("10a_e-00yb_north", "10a_e-00yb", DoorDirection.left, False, False), + + "10a_e-00z_south": Door("10a_e-00z_south", "10a_e-00z", DoorDirection.down, False, True), + "10a_e-00z_north": Door("10a_e-00z_north", "10a_e-00z", DoorDirection.up, False, False), + + "10a_e-00_south": Door("10a_e-00_south", "10a_e-00", DoorDirection.down, False, True), + "10a_e-00_north": Door("10a_e-00_north", "10a_e-00", DoorDirection.up, False, False), + + "10a_e-00b_south": Door("10a_e-00b_south", "10a_e-00b", DoorDirection.down, False, True), + "10a_e-00b_north": Door("10a_e-00b_north", "10a_e-00b", DoorDirection.up, False, False), + + "10a_e-01_south": Door("10a_e-01_south", "10a_e-01", DoorDirection.down, False, True), + "10a_e-01_north": Door("10a_e-01_north", "10a_e-01", DoorDirection.up, False, False), + + "10a_e-02_west": Door("10a_e-02_west", "10a_e-02", DoorDirection.down, False, True), + "10a_e-02_east": Door("10a_e-02_east", "10a_e-02", DoorDirection.right, False, False), + + "10a_e-03_west": Door("10a_e-03_west", "10a_e-03", DoorDirection.left, False, False), + "10a_e-03_east": Door("10a_e-03_east", "10a_e-03", DoorDirection.right, False, False), + + "10a_e-04_west": Door("10a_e-04_west", "10a_e-04", DoorDirection.left, False, False), + "10a_e-04_east": Door("10a_e-04_east", "10a_e-04", DoorDirection.right, False, False), + + "10a_e-05_west": Door("10a_e-05_west", "10a_e-05", DoorDirection.left, False, False), + "10a_e-05_east": Door("10a_e-05_east", "10a_e-05", DoorDirection.right, False, False), + + "10a_e-05b_west": Door("10a_e-05b_west", "10a_e-05b", DoorDirection.left, False, False), + "10a_e-05b_east": Door("10a_e-05b_east", "10a_e-05b", DoorDirection.right, False, False), + + "10a_e-05c_west": Door("10a_e-05c_west", "10a_e-05c", DoorDirection.left, False, False), + "10a_e-05c_east": Door("10a_e-05c_east", "10a_e-05c", DoorDirection.right, False, False), + + "10a_e-06_west": Door("10a_e-06_west", "10a_e-06", DoorDirection.left, False, False), + "10a_e-06_east": Door("10a_e-06_east", "10a_e-06", DoorDirection.right, False, False), + + "10a_e-07_west": Door("10a_e-07_west", "10a_e-07", DoorDirection.left, False, False), + "10a_e-07_east": Door("10a_e-07_east", "10a_e-07", DoorDirection.right, False, False), + + "10a_e-08_west": Door("10a_e-08_west", "10a_e-08", DoorDirection.left, False, False), + "10a_e-08_east": Door("10a_e-08_east", "10a_e-08", DoorDirection.right, False, False), + + "10b_f-door_west": Door("10b_f-door_west", "10b_f-door", DoorDirection.left, False, True), + "10b_f-door_east": Door("10b_f-door_east", "10b_f-door", DoorDirection.right, False, False), + + "10b_f-00_west": Door("10b_f-00_west", "10b_f-00", DoorDirection.left, False, False), + "10b_f-00_east": Door("10b_f-00_east", "10b_f-00", DoorDirection.right, False, False), + + "10b_f-01_west": Door("10b_f-01_west", "10b_f-01", DoorDirection.left, False, False), + "10b_f-01_east": Door("10b_f-01_east", "10b_f-01", DoorDirection.right, False, False), + + "10b_f-02_west": Door("10b_f-02_west", "10b_f-02", DoorDirection.left, False, False), + "10b_f-02_east": Door("10b_f-02_east", "10b_f-02", DoorDirection.right, False, False), + + "10b_f-03_west": Door("10b_f-03_west", "10b_f-03", DoorDirection.left, False, False), + "10b_f-03_east": Door("10b_f-03_east", "10b_f-03", DoorDirection.right, False, False), + + "10b_f-04_west": Door("10b_f-04_west", "10b_f-04", DoorDirection.left, False, False), + "10b_f-04_east": Door("10b_f-04_east", "10b_f-04", DoorDirection.right, False, False), + + "10b_f-05_west": Door("10b_f-05_west", "10b_f-05", DoorDirection.left, False, False), + "10b_f-05_east": Door("10b_f-05_east", "10b_f-05", DoorDirection.right, False, False), + + "10b_f-06_west": Door("10b_f-06_west", "10b_f-06", DoorDirection.left, False, False), + "10b_f-06_east": Door("10b_f-06_east", "10b_f-06", DoorDirection.right, False, False), + + "10b_f-07_west": Door("10b_f-07_west", "10b_f-07", DoorDirection.left, False, False), + "10b_f-07_east": Door("10b_f-07_east", "10b_f-07", DoorDirection.right, False, False), + + "10b_f-08_west": Door("10b_f-08_west", "10b_f-08", DoorDirection.left, False, False), + "10b_f-08_east": Door("10b_f-08_east", "10b_f-08", DoorDirection.right, False, False), + + "10b_f-09_west": Door("10b_f-09_west", "10b_f-09", DoorDirection.left, False, False), + "10b_f-09_east": Door("10b_f-09_east", "10b_f-09", DoorDirection.up, False, False), + + "10b_g-00_bottom": Door("10b_g-00_bottom", "10b_g-00", DoorDirection.down, False, True), + "10b_g-00_top": Door("10b_g-00_top", "10b_g-00", DoorDirection.up, False, False), + + "10b_g-01_bottom": Door("10b_g-01_bottom", "10b_g-01", DoorDirection.down, False, True), + "10b_g-01_top": Door("10b_g-01_top", "10b_g-01", DoorDirection.up, False, False), + + "10b_g-03_bottom": Door("10b_g-03_bottom", "10b_g-03", DoorDirection.down, False, True), + "10b_g-03_top": Door("10b_g-03_top", "10b_g-03", DoorDirection.up, False, False), + + "10b_g-02_west": Door("10b_g-02_west", "10b_g-02", DoorDirection.down, False, True), + "10b_g-02_east": Door("10b_g-02_east", "10b_g-02", DoorDirection.up, False, False), + + "10b_g-04_west": Door("10b_g-04_west", "10b_g-04", DoorDirection.down, False, True), + "10b_g-04_east": Door("10b_g-04_east", "10b_g-04", DoorDirection.right, False, False), + + "10b_g-05_west": Door("10b_g-05_west", "10b_g-05", DoorDirection.left, False, False), + "10b_g-05_east": Door("10b_g-05_east", "10b_g-05", DoorDirection.right, False, False), + + "10b_g-06_west": Door("10b_g-06_west", "10b_g-06", DoorDirection.left, False, False), + "10b_g-06_east": Door("10b_g-06_east", "10b_g-06", DoorDirection.right, False, False), + + "10b_h-00b_west": Door("10b_h-00b_west", "10b_h-00b", DoorDirection.left, False, False), + "10b_h-00b_east": Door("10b_h-00b_east", "10b_h-00b", DoorDirection.down, False, False), + + "10b_h-00_west": Door("10b_h-00_west", "10b_h-00", DoorDirection.up, False, False), + "10b_h-00_east": Door("10b_h-00_east", "10b_h-00", DoorDirection.right, False, False), + + "10b_h-01_west": Door("10b_h-01_west", "10b_h-01", DoorDirection.left, False, False), + "10b_h-01_east": Door("10b_h-01_east", "10b_h-01", DoorDirection.up, False, False), + + "10b_h-02_west": Door("10b_h-02_west", "10b_h-02", DoorDirection.down, False, True), + "10b_h-02_east": Door("10b_h-02_east", "10b_h-02", DoorDirection.right, False, False), + + "10b_h-03_west": Door("10b_h-03_west", "10b_h-03", DoorDirection.left, False, False), + "10b_h-03_east": Door("10b_h-03_east", "10b_h-03", DoorDirection.right, False, False), + + "10b_h-03b_west": Door("10b_h-03b_west", "10b_h-03b", DoorDirection.left, False, False), + "10b_h-03b_east": Door("10b_h-03b_east", "10b_h-03b", DoorDirection.right, False, False), + + "10b_h-04_top": Door("10b_h-04_top", "10b_h-04", DoorDirection.left, False, False), + "10b_h-04_east": Door("10b_h-04_east", "10b_h-04", DoorDirection.right, False, False), + "10b_h-04_bottom": Door("10b_h-04_bottom", "10b_h-04", DoorDirection.right, False, False), + + "10b_h-04b_west": Door("10b_h-04b_west", "10b_h-04b", DoorDirection.left, False, False), + "10b_h-04b_east": Door("10b_h-04b_east", "10b_h-04b", DoorDirection.down, False, False), + + "10b_h-05_west": Door("10b_h-05_west", "10b_h-05", DoorDirection.left, False, False), + "10b_h-05_top": Door("10b_h-05_top", "10b_h-05", DoorDirection.up, False, True), + "10b_h-05_east": Door("10b_h-05_east", "10b_h-05", DoorDirection.right, False, False), + + "10b_h-06_west": Door("10b_h-06_west", "10b_h-06", DoorDirection.left, False, False), + "10b_h-06_east": Door("10b_h-06_east", "10b_h-06", DoorDirection.up, False, False), + + "10b_h-06b_bottom": Door("10b_h-06b_bottom", "10b_h-06b", DoorDirection.down, False, True), + "10b_h-06b_top": Door("10b_h-06b_top", "10b_h-06b", DoorDirection.up, False, False), + + "10b_h-07_west": Door("10b_h-07_west", "10b_h-07", DoorDirection.down, False, True), + "10b_h-07_east": Door("10b_h-07_east", "10b_h-07", DoorDirection.right, False, False), + + "10b_h-08_west": Door("10b_h-08_west", "10b_h-08", DoorDirection.left, False, True), + "10b_h-08_east": Door("10b_h-08_east", "10b_h-08", DoorDirection.right, False, False), + + "10b_h-09_west": Door("10b_h-09_west", "10b_h-09", DoorDirection.left, False, False), + "10b_h-09_east": Door("10b_h-09_east", "10b_h-09", DoorDirection.right, False, False), + + "10b_h-10_west": Door("10b_h-10_west", "10b_h-10", DoorDirection.left, False, False), + "10b_h-10_east": Door("10b_h-10_east", "10b_h-10", DoorDirection.up, False, False), + + "10b_i-00_west": Door("10b_i-00_west", "10b_i-00", DoorDirection.down, False, True), + "10b_i-00_east": Door("10b_i-00_east", "10b_i-00", DoorDirection.right, False, False), + + "10b_i-00b_west": Door("10b_i-00b_west", "10b_i-00b", DoorDirection.left, False, False), + "10b_i-00b_east": Door("10b_i-00b_east", "10b_i-00b", DoorDirection.right, False, False), + + "10b_i-01_west": Door("10b_i-01_west", "10b_i-01", DoorDirection.left, False, False), + "10b_i-01_east": Door("10b_i-01_east", "10b_i-01", DoorDirection.right, False, False), + + "10b_i-02_west": Door("10b_i-02_west", "10b_i-02", DoorDirection.left, False, False), + "10b_i-02_east": Door("10b_i-02_east", "10b_i-02", DoorDirection.right, False, False), + + "10b_i-03_west": Door("10b_i-03_west", "10b_i-03", DoorDirection.left, False, False), + "10b_i-03_east": Door("10b_i-03_east", "10b_i-03", DoorDirection.right, False, False), + + "10b_i-04_west": Door("10b_i-04_west", "10b_i-04", DoorDirection.left, False, False), + "10b_i-04_east": Door("10b_i-04_east", "10b_i-04", DoorDirection.right, False, False), + + "10b_i-05_west": Door("10b_i-05_west", "10b_i-05", DoorDirection.left, False, False), + "10b_i-05_east": Door("10b_i-05_east", "10b_i-05", DoorDirection.right, False, False), + + "10b_j-00_west": Door("10b_j-00_west", "10b_j-00", DoorDirection.left, False, True), + "10b_j-00_east": Door("10b_j-00_east", "10b_j-00", DoorDirection.right, False, False), + + "10b_j-00b_west": Door("10b_j-00b_west", "10b_j-00b", DoorDirection.left, False, False), + "10b_j-00b_east": Door("10b_j-00b_east", "10b_j-00b", DoorDirection.right, False, False), + + "10b_j-01_west": Door("10b_j-01_west", "10b_j-01", DoorDirection.left, False, False), + "10b_j-01_east": Door("10b_j-01_east", "10b_j-01", DoorDirection.right, False, False), + + "10b_j-02_west": Door("10b_j-02_west", "10b_j-02", DoorDirection.left, False, False), + "10b_j-02_east": Door("10b_j-02_east", "10b_j-02", DoorDirection.right, False, False), + + "10b_j-03_west": Door("10b_j-03_west", "10b_j-03", DoorDirection.left, False, False), + "10b_j-03_east": Door("10b_j-03_east", "10b_j-03", DoorDirection.right, False, False), + + "10b_j-04_west": Door("10b_j-04_west", "10b_j-04", DoorDirection.left, False, False), + "10b_j-04_east": Door("10b_j-04_east", "10b_j-04", DoorDirection.right, False, False), + + "10b_j-05_west": Door("10b_j-05_west", "10b_j-05", DoorDirection.left, False, False), + "10b_j-05_east": Door("10b_j-05_east", "10b_j-05", DoorDirection.right, False, False), + + "10b_j-06_west": Door("10b_j-06_west", "10b_j-06", DoorDirection.left, False, False), + "10b_j-06_east": Door("10b_j-06_east", "10b_j-06", DoorDirection.right, False, False), + + "10b_j-07_west": Door("10b_j-07_west", "10b_j-07", DoorDirection.left, False, False), + "10b_j-07_east": Door("10b_j-07_east", "10b_j-07", DoorDirection.right, False, False), + + "10b_j-08_west": Door("10b_j-08_west", "10b_j-08", DoorDirection.left, False, False), + "10b_j-08_east": Door("10b_j-08_east", "10b_j-08", DoorDirection.right, False, False), + + "10b_j-09_west": Door("10b_j-09_west", "10b_j-09", DoorDirection.left, False, False), + "10b_j-09_east": Door("10b_j-09_east", "10b_j-09", DoorDirection.right, False, False), + + "10b_j-10_west": Door("10b_j-10_west", "10b_j-10", DoorDirection.left, False, False), + "10b_j-10_east": Door("10b_j-10_east", "10b_j-10", DoorDirection.right, False, False), + + "10b_j-11_west": Door("10b_j-11_west", "10b_j-11", DoorDirection.left, False, False), + "10b_j-11_east": Door("10b_j-11_east", "10b_j-11", DoorDirection.right, False, False), + + "10b_j-12_west": Door("10b_j-12_west", "10b_j-12", DoorDirection.left, False, False), + "10b_j-12_east": Door("10b_j-12_east", "10b_j-12", DoorDirection.right, False, False), + + "10b_j-13_west": Door("10b_j-13_west", "10b_j-13", DoorDirection.left, False, False), + "10b_j-13_east": Door("10b_j-13_east", "10b_j-13", DoorDirection.right, False, False), + + "10b_j-14_west": Door("10b_j-14_west", "10b_j-14", DoorDirection.left, False, False), + "10b_j-14_east": Door("10b_j-14_east", "10b_j-14", DoorDirection.right, False, False), + + "10b_j-14b_west": Door("10b_j-14b_west", "10b_j-14b", DoorDirection.left, False, False), + "10b_j-14b_east": Door("10b_j-14b_east", "10b_j-14b", DoorDirection.right, False, False), + + "10b_j-15_west": Door("10b_j-15_west", "10b_j-15", DoorDirection.left, False, False), + "10b_j-15_east": Door("10b_j-15_east", "10b_j-15", DoorDirection.right, False, False), + + "10b_j-16_west": Door("10b_j-16_west", "10b_j-16", DoorDirection.left, False, True), + "10b_j-16_top": Door("10b_j-16_top", "10b_j-16", DoorDirection.up, False, False), + "10b_j-16_east": Door("10b_j-16_east", "10b_j-16", DoorDirection.up, False, False), + + "10b_j-17_south": Door("10b_j-17_south", "10b_j-17", DoorDirection.down, False, True), + "10b_j-17_west": Door("10b_j-17_west", "10b_j-17", DoorDirection.up, False, False), + "10b_j-17_north": Door("10b_j-17_north", "10b_j-17", DoorDirection.up, False, False), + "10b_j-17_east": Door("10b_j-17_east", "10b_j-17", DoorDirection.right, False, False), + + "10b_j-18_west": Door("10b_j-18_west", "10b_j-18", DoorDirection.down, False, True), + "10b_j-18_east": Door("10b_j-18_east", "10b_j-18", DoorDirection.down, False, False), + + "10b_j-19_bottom": Door("10b_j-19_bottom", "10b_j-19", DoorDirection.left, False, False), + "10b_j-19_top": Door("10b_j-19_top", "10b_j-19", DoorDirection.up, False, False), + + "10b_GOAL_main": Door("10b_GOAL_main", "10b_GOAL", DoorDirection.down, False, True), + "10b_GOAL_moon": Door("10b_GOAL_moon", "10b_GOAL", DoorDirection.down, False, True), + + "10c_end-golden_bottom": Door("10c_end-golden_bottom", "10c_end-golden", DoorDirection.down, False, True), + "10c_end-golden_top": Door("10c_end-golden_top", "10c_end-golden", DoorDirection.up, False, True), + +} + +all_region_connections: dict[str, RegionConnection] = { + "0a_-1_main---0a_-1_east": RegionConnection("0a_-1_main", "0a_-1_east", []), + "0a_-1_east---0a_-1_main": RegionConnection("0a_-1_east", "0a_-1_main", []), + + "0a_0_west---0a_0_main": RegionConnection("0a_0_west", "0a_0_main", []), + "0a_0_main---0a_0_west": RegionConnection("0a_0_main", "0a_0_west", []), + "0a_0_main---0a_0_east": RegionConnection("0a_0_main", "0a_0_east", []), + "0a_0_main---0a_0_north": RegionConnection("0a_0_main", "0a_0_north", []), + "0a_0_north---0a_0_main": RegionConnection("0a_0_north", "0a_0_main", []), + "0a_0_east---0a_0_main": RegionConnection("0a_0_east", "0a_0_main", []), + + + "0a_1_west---0a_1_main": RegionConnection("0a_1_west", "0a_1_main", []), + "0a_1_main---0a_1_west": RegionConnection("0a_1_main", "0a_1_west", []), + "0a_1_main---0a_1_east": RegionConnection("0a_1_main", "0a_1_east", []), + "0a_1_east---0a_1_main": RegionConnection("0a_1_east", "0a_1_main", []), + + "0a_2_west---0a_2_main": RegionConnection("0a_2_west", "0a_2_main", []), + "0a_2_main---0a_2_west": RegionConnection("0a_2_main", "0a_2_west", []), + "0a_2_main---0a_2_east": RegionConnection("0a_2_main", "0a_2_east", []), + "0a_2_east---0a_2_main": RegionConnection("0a_2_east", "0a_2_main", []), + + "0a_3_west---0a_3_main": RegionConnection("0a_3_west", "0a_3_main", []), + "0a_3_main---0a_3_west": RegionConnection("0a_3_main", "0a_3_west", []), + "0a_3_main---0a_3_east": RegionConnection("0a_3_main", "0a_3_east", []), + "0a_3_east---0a_3_main": RegionConnection("0a_3_east", "0a_3_main", []), + + "1a_1_main---1a_1_east": RegionConnection("1a_1_main", "1a_1_east", []), + "1a_1_east---1a_1_main": RegionConnection("1a_1_east", "1a_1_main", []), + + "1a_2_west---1a_2_east": RegionConnection("1a_2_west", "1a_2_east", []), + "1a_2_east---1a_2_west": RegionConnection("1a_2_east", "1a_2_west", []), + + "1a_3_west---1a_3_east": RegionConnection("1a_3_west", "1a_3_east", []), + "1a_3_east---1a_3_west": RegionConnection("1a_3_east", "1a_3_west", []), + + "1a_4_west---1a_4_east": RegionConnection("1a_4_west", "1a_4_east", [[ItemName.traffic_blocks, ], ]), + "1a_4_east---1a_4_west": RegionConnection("1a_4_east", "1a_4_west", []), + + "1a_3b_west---1a_3b_east": RegionConnection("1a_3b_west", "1a_3b_east", []), + "1a_3b_east---1a_3b_west": RegionConnection("1a_3b_east", "1a_3b_west", []), + "1a_3b_east---1a_3b_top": RegionConnection("1a_3b_east", "1a_3b_top", []), + "1a_3b_top---1a_3b_west": RegionConnection("1a_3b_top", "1a_3b_west", []), + "1a_3b_top---1a_3b_east": RegionConnection("1a_3b_top", "1a_3b_east", []), + + "1a_5_bottom---1a_5_west": RegionConnection("1a_5_bottom", "1a_5_west", []), + "1a_5_bottom---1a_5_north-west": RegionConnection("1a_5_bottom", "1a_5_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_5_bottom---1a_5_center": RegionConnection("1a_5_bottom", "1a_5_center", []), + "1a_5_west---1a_5_bottom": RegionConnection("1a_5_west", "1a_5_bottom", []), + "1a_5_north-west---1a_5_center": RegionConnection("1a_5_north-west", "1a_5_center", []), + "1a_5_north-west---1a_5_bottom": RegionConnection("1a_5_north-west", "1a_5_bottom", []), + "1a_5_center---1a_5_north-east": RegionConnection("1a_5_center", "1a_5_north-east", []), + "1a_5_center---1a_5_bottom": RegionConnection("1a_5_center", "1a_5_bottom", []), + "1a_5_center---1a_5_south-east": RegionConnection("1a_5_center", "1a_5_south-east", []), + "1a_5_south-east---1a_5_north-east": RegionConnection("1a_5_south-east", "1a_5_north-east", []), + "1a_5_south-east---1a_5_center": RegionConnection("1a_5_south-east", "1a_5_center", []), + "1a_5_north-east---1a_5_center": RegionConnection("1a_5_north-east", "1a_5_center", []), + "1a_5_north-east---1a_5_top": RegionConnection("1a_5_north-east", "1a_5_top", [[ItemName.springs, ], ]), + "1a_5_top---1a_5_north-east": RegionConnection("1a_5_top", "1a_5_north-east", []), + + + + "1a_6_south-west---1a_6_west": RegionConnection("1a_6_south-west", "1a_6_west", []), + "1a_6_west---1a_6_south-west": RegionConnection("1a_6_west", "1a_6_south-west", []), + "1a_6_west---1a_6_east": RegionConnection("1a_6_west", "1a_6_east", [[ItemName.dash_refills, ], ]), + "1a_6_east---1a_6_west": RegionConnection("1a_6_east", "1a_6_west", [[ItemName.cannot_access, ], ]), + + "1a_6z_north-west---1a_6z_west": RegionConnection("1a_6z_north-west", "1a_6z_west", []), + "1a_6z_west---1a_6z_north-west": RegionConnection("1a_6z_west", "1a_6z_north-west", []), + "1a_6z_west---1a_6z_east": RegionConnection("1a_6z_west", "1a_6z_east", []), + "1a_6z_east---1a_6z_west": RegionConnection("1a_6z_east", "1a_6z_west", [[ItemName.dash_refills, ], ]), + + "1a_6zb_north-west---1a_6zb_main": RegionConnection("1a_6zb_north-west", "1a_6zb_main", []), + "1a_6zb_main---1a_6zb_north-west": RegionConnection("1a_6zb_main", "1a_6zb_north-west", []), + "1a_6zb_main---1a_6zb_east": RegionConnection("1a_6zb_main", "1a_6zb_east", []), + "1a_6zb_east---1a_6zb_main": RegionConnection("1a_6zb_east", "1a_6zb_main", []), + + "1a_7zb_west---1a_7zb_east": RegionConnection("1a_7zb_west", "1a_7zb_east", [[ItemName.dash_refills, ], ]), + "1a_7zb_east---1a_7zb_west": RegionConnection("1a_7zb_east", "1a_7zb_west", [[ItemName.springs, ItemName.dash_refills, ], ]), + + "1a_6a_west---1a_6a_east": RegionConnection("1a_6a_west", "1a_6a_east", [[ItemName.dash_refills, ], ]), + "1a_6a_east---1a_6a_west": RegionConnection("1a_6a_east", "1a_6a_west", []), + + "1a_6b_south-west---1a_6b_north-west": RegionConnection("1a_6b_south-west", "1a_6b_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_6b_south-west---1a_6b_north-east": RegionConnection("1a_6b_south-west", "1a_6b_north-east", [[ItemName.traffic_blocks, ], ]), + "1a_6b_north-west---1a_6b_south-west": RegionConnection("1a_6b_north-west", "1a_6b_south-west", []), + "1a_6b_north-east---1a_6b_south-west": RegionConnection("1a_6b_north-east", "1a_6b_south-west", []), + + "1a_s0_west---1a_s0_east": RegionConnection("1a_s0_west", "1a_s0_east", []), + "1a_s0_east---1a_s0_west": RegionConnection("1a_s0_east", "1a_s0_west", [[ItemName.traffic_blocks, ], ]), + + + "1a_6c_south-west---1a_6c_north-west": RegionConnection("1a_6c_south-west", "1a_6c_north-west", [[ItemName.springs, ], ]), + "1a_6c_south-west---1a_6c_north-east": RegionConnection("1a_6c_south-west", "1a_6c_north-east", [[ItemName.springs, ], ]), + "1a_6c_north-west---1a_6c_south-west": RegionConnection("1a_6c_north-west", "1a_6c_south-west", []), + "1a_6c_north-east---1a_6c_south-west": RegionConnection("1a_6c_north-east", "1a_6c_south-west", []), + + "1a_7_west---1a_7_east": RegionConnection("1a_7_west", "1a_7_east", []), + "1a_7_east---1a_7_west": RegionConnection("1a_7_east", "1a_7_west", []), + + "1a_7z_bottom---1a_7z_top": RegionConnection("1a_7z_bottom", "1a_7z_top", []), + "1a_7z_top---1a_7z_bottom": RegionConnection("1a_7z_top", "1a_7z_bottom", []), + + "1a_8z_bottom---1a_8z_top": RegionConnection("1a_8z_bottom", "1a_8z_top", [[ItemName.traffic_blocks, ], ]), + "1a_8z_top---1a_8z_bottom": RegionConnection("1a_8z_top", "1a_8z_bottom", []), + + "1a_8zb_west---1a_8zb_east": RegionConnection("1a_8zb_west", "1a_8zb_east", [[ItemName.dash_refills, ], ]), + "1a_8zb_east---1a_8zb_west": RegionConnection("1a_8zb_east", "1a_8zb_west", [[ItemName.cannot_access, ], ]), + + "1a_8_south-west---1a_8_south": RegionConnection("1a_8_south-west", "1a_8_south", []), + "1a_8_south-west---1a_8_north": RegionConnection("1a_8_south-west", "1a_8_north", []), + "1a_8_west---1a_8_south-west": RegionConnection("1a_8_west", "1a_8_south-west", []), + "1a_8_south-east---1a_8_north": RegionConnection("1a_8_south-east", "1a_8_north", []), + "1a_8_south-east---1a_8_south": RegionConnection("1a_8_south-east", "1a_8_south", []), + "1a_8_north---1a_8_north-east": RegionConnection("1a_8_north", "1a_8_north-east", []), + "1a_8_north---1a_8_south": RegionConnection("1a_8_north", "1a_8_south", []), + "1a_8_north-east---1a_8_north": RegionConnection("1a_8_north-east", "1a_8_north", []), + + "1a_7a_east---1a_7a_west": RegionConnection("1a_7a_east", "1a_7a_west", []), + "1a_7a_west---1a_7a_east": RegionConnection("1a_7a_west", "1a_7a_east", []), + + + "1a_8b_east---1a_8b_west": RegionConnection("1a_8b_east", "1a_8b_west", []), + "1a_8b_west---1a_8b_east": RegionConnection("1a_8b_west", "1a_8b_east", [[ItemName.traffic_blocks, ], ]), + + "1a_9_east---1a_9_west": RegionConnection("1a_9_east", "1a_9_west", [[ItemName.cannot_access, ], ]), + "1a_9_west---1a_9_east": RegionConnection("1a_9_west", "1a_9_east", [[ItemName.traffic_blocks, ], ]), + + "1a_9b_east---1a_9b_north-east": RegionConnection("1a_9b_east", "1a_9b_north-east", []), + "1a_9b_north-east---1a_9b_east": RegionConnection("1a_9b_north-east", "1a_9b_east", []), + "1a_9b_north-east---1a_9b_west": RegionConnection("1a_9b_north-east", "1a_9b_west", []), + "1a_9b_west---1a_9b_east": RegionConnection("1a_9b_west", "1a_9b_east", [[ItemName.traffic_blocks, ], ]), + "1a_9b_west---1a_9b_north-west": RegionConnection("1a_9b_west", "1a_9b_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_9b_north-west---1a_9b_west": RegionConnection("1a_9b_north-west", "1a_9b_west", []), + + + "1a_10_south-east---1a_10_south-west": RegionConnection("1a_10_south-east", "1a_10_south-west", []), + "1a_10_south-east---1a_10_north-west": RegionConnection("1a_10_south-east", "1a_10_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_10_south-west---1a_10_south-east": RegionConnection("1a_10_south-west", "1a_10_south-east", []), + "1a_10_north-west---1a_10_south-east": RegionConnection("1a_10_north-west", "1a_10_south-east", []), + "1a_10_north-east---1a_10_south-east": RegionConnection("1a_10_north-east", "1a_10_south-east", []), + + "1a_10z_west---1a_10z_east": RegionConnection("1a_10z_west", "1a_10z_east", []), + "1a_10z_east---1a_10z_west": RegionConnection("1a_10z_east", "1a_10z_west", [[ItemName.springs, ], ]), + + + "1a_11_south-east---1a_11_north": RegionConnection("1a_11_south-east", "1a_11_north", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + "1a_11_south-west---1a_11_south": RegionConnection("1a_11_south-west", "1a_11_south", [[ItemName.traffic_blocks, ], ]), + "1a_11_south-west---1a_11_west": RegionConnection("1a_11_south-west", "1a_11_west", [[ItemName.traffic_blocks, ], ]), + "1a_11_north---1a_11_south-east": RegionConnection("1a_11_north", "1a_11_south-east", []), + "1a_11_west---1a_11_south-west": RegionConnection("1a_11_west", "1a_11_south-west", [[ItemName.traffic_blocks, ], ]), + "1a_11_south---1a_11_south-west": RegionConnection("1a_11_south", "1a_11_south-west", []), + + + "1a_10a_bottom---1a_10a_top": RegionConnection("1a_10a_bottom", "1a_10a_top", [[ItemName.dash_refills, ], ]), + "1a_10a_top---1a_10a_bottom": RegionConnection("1a_10a_top", "1a_10a_bottom", [[ItemName.cannot_access, ], ]), + + "1a_12_south-west---1a_12_north-west": RegionConnection("1a_12_south-west", "1a_12_north-west", []), + "1a_12_south-west---1a_12_east": RegionConnection("1a_12_south-west", "1a_12_east", []), + "1a_12_north-west---1a_12_south-west": RegionConnection("1a_12_north-west", "1a_12_south-west", []), + + + "1a_12a_bottom---1a_12a_top": RegionConnection("1a_12a_bottom", "1a_12a_top", [[ItemName.traffic_blocks, ], ]), + "1a_12a_top---1a_12a_bottom": RegionConnection("1a_12a_top", "1a_12a_bottom", []), + + "1a_end_south---1a_end_main": RegionConnection("1a_end_south", "1a_end_main", []), + "1a_end_main---1a_end_south": RegionConnection("1a_end_main", "1a_end_south", []), + + "1b_00_west---1b_00_east": RegionConnection("1b_00_west", "1b_00_east", []), + "1b_00_east---1b_00_west": RegionConnection("1b_00_east", "1b_00_west", []), + + "1b_01_west---1b_01_east": RegionConnection("1b_01_west", "1b_01_east", [[ItemName.traffic_blocks, ], ]), + "1b_01_east---1b_01_west": RegionConnection("1b_01_east", "1b_01_west", [[ItemName.cannot_access, ], ]), + + "1b_02_west---1b_02_east": RegionConnection("1b_02_west", "1b_02_east", [[ItemName.traffic_blocks, ], ]), + "1b_02_east---1b_02_west": RegionConnection("1b_02_east", "1b_02_west", [[ItemName.cannot_access, ], ]), + + "1b_02b_west---1b_02b_east": RegionConnection("1b_02b_west", "1b_02b_east", [[ItemName.traffic_blocks, ], ]), + "1b_02b_east---1b_02b_west": RegionConnection("1b_02b_east", "1b_02b_west", [[ItemName.cannot_access, ], ]), + + "1b_03_west---1b_03_east": RegionConnection("1b_03_west", "1b_03_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_03_east---1b_03_west": RegionConnection("1b_03_east", "1b_03_west", [[ItemName.cannot_access, ], ]), + + "1b_04_west---1b_04_east": RegionConnection("1b_04_west", "1b_04_east", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + "1b_04_east---1b_04_west": RegionConnection("1b_04_east", "1b_04_west", [[ItemName.cannot_access, ], ]), + + "1b_05_west---1b_05_east": RegionConnection("1b_05_west", "1b_05_east", [[ItemName.traffic_blocks, ], ]), + "1b_05_east---1b_05_west": RegionConnection("1b_05_east", "1b_05_west", [[ItemName.cannot_access, ], ]), + + "1b_05b_west---1b_05b_east": RegionConnection("1b_05b_west", "1b_05b_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "1b_05b_east---1b_05b_west": RegionConnection("1b_05b_east", "1b_05b_west", [[ItemName.cannot_access, ], ]), + + "1b_06_west---1b_06_east": RegionConnection("1b_06_west", "1b_06_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "1b_06_east---1b_06_west": RegionConnection("1b_06_east", "1b_06_west", [[ItemName.cannot_access, ], ]), + + "1b_07_bottom---1b_07_top": RegionConnection("1b_07_bottom", "1b_07_top", [[ItemName.traffic_blocks, ], ]), + "1b_07_top---1b_07_bottom": RegionConnection("1b_07_top", "1b_07_bottom", []), + + "1b_08_west---1b_08_east": RegionConnection("1b_08_west", "1b_08_east", [[ItemName.traffic_blocks, ], ]), + + "1b_08b_west---1b_08b_east": RegionConnection("1b_08b_west", "1b_08b_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_08b_east---1b_08b_west": RegionConnection("1b_08b_east", "1b_08b_west", [[ItemName.cannot_access, ], ]), + + "1b_09_west---1b_09_east": RegionConnection("1b_09_west", "1b_09_east", [[ItemName.traffic_blocks, ], ]), + "1b_09_east---1b_09_west": RegionConnection("1b_09_east", "1b_09_west", []), + + "1b_10_west---1b_10_east": RegionConnection("1b_10_west", "1b_10_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + + "1b_11_bottom---1b_11_top": RegionConnection("1b_11_bottom", "1b_11_top", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_11_top---1b_11_bottom": RegionConnection("1b_11_top", "1b_11_bottom", []), + + "1b_end_west---1b_end_goal": RegionConnection("1b_end_west", "1b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + + "1c_00_west---1c_00_east": RegionConnection("1c_00_west", "1c_00_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1c_00_east---1c_00_west": RegionConnection("1c_00_east", "1c_00_west", [[ItemName.cannot_access, ], ]), + + "1c_01_west---1c_01_east": RegionConnection("1c_01_west", "1c_01_east", [[ItemName.traffic_blocks, ], ]), + "1c_01_east---1c_01_west": RegionConnection("1c_01_east", "1c_01_west", []), + + "1c_02_west---1c_02_goal": RegionConnection("1c_02_west", "1c_02_goal", [[ItemName.coins, ItemName.traffic_blocks, ], ]), + + "2a_start_main---2a_start_east": RegionConnection("2a_start_main", "2a_start_east", []), + "2a_start_top---2a_start_east": RegionConnection("2a_start_top", "2a_start_east", []), + "2a_start_top---2a_start_main": RegionConnection("2a_start_top", "2a_start_main", []), + "2a_start_east---2a_start_main": RegionConnection("2a_start_east", "2a_start_main", []), + "2a_start_east---2a_start_top": RegionConnection("2a_start_east", "2a_start_top", []), + + "2a_s0_bottom---2a_s0_top": RegionConnection("2a_s0_bottom", "2a_s0_top", []), + "2a_s0_top---2a_s0_bottom": RegionConnection("2a_s0_top", "2a_s0_bottom", []), + + "2a_s1_bottom---2a_s1_top": RegionConnection("2a_s1_bottom", "2a_s1_top", []), + "2a_s1_top---2a_s1_bottom": RegionConnection("2a_s1_top", "2a_s1_bottom", []), + + + "2a_0_south-west---2a_0_south-east": RegionConnection("2a_0_south-west", "2a_0_south-east", []), + "2a_0_south-east---2a_0_north-east": RegionConnection("2a_0_south-east", "2a_0_north-east", [[ItemName.dream_blocks, ], ]), + "2a_0_south-east---2a_0_south-west": RegionConnection("2a_0_south-east", "2a_0_south-west", []), + "2a_0_south-east---2a_0_north-west": RegionConnection("2a_0_south-east", "2a_0_north-west", [[ItemName.dream_blocks, ], ]), + "2a_0_north-west---2a_0_south-west": RegionConnection("2a_0_north-west", "2a_0_south-west", []), + "2a_0_north-east---2a_0_south-east": RegionConnection("2a_0_north-east", "2a_0_south-east", [[ItemName.dream_blocks, ], ]), + "2a_0_north-east---2a_0_north-west": RegionConnection("2a_0_north-east", "2a_0_north-west", [[ItemName.dream_blocks, ], ]), + + "2a_1_south-west---2a_1_south": RegionConnection("2a_1_south-west", "2a_1_south", []), + "2a_1_south---2a_1_south-west": RegionConnection("2a_1_south", "2a_1_south-west", []), + "2a_1_south---2a_1_south-east": RegionConnection("2a_1_south", "2a_1_south-east", []), + "2a_1_south-east---2a_1_south": RegionConnection("2a_1_south-east", "2a_1_south", []), + + "2a_d0_north---2a_d0_north-west": RegionConnection("2a_d0_north", "2a_d0_north-west", []), + "2a_d0_north-west---2a_d0_north": RegionConnection("2a_d0_north-west", "2a_d0_north", []), + "2a_d0_north-west---2a_d0_west": RegionConnection("2a_d0_north-west", "2a_d0_west", []), + "2a_d0_north-west---2a_d0_north-east": RegionConnection("2a_d0_north-west", "2a_d0_north-east", [[ItemName.dream_blocks, ], ]), + "2a_d0_west---2a_d0_north-west": RegionConnection("2a_d0_west", "2a_d0_north-west", []), + "2a_d0_west---2a_d0_south-west": RegionConnection("2a_d0_west", "2a_d0_south-west", []), + "2a_d0_west---2a_d0_east": RegionConnection("2a_d0_west", "2a_d0_east", []), + "2a_d0_south-west---2a_d0_south": RegionConnection("2a_d0_south-west", "2a_d0_south", [[ItemName.dream_blocks, ], ]), + "2a_d0_south-west---2a_d0_south-east": RegionConnection("2a_d0_south-west", "2a_d0_south-east", []), + "2a_d0_south-west---2a_d0_south-east": RegionConnection("2a_d0_south-west", "2a_d0_south-east", [[ItemName.cannot_access, ], ]), + "2a_d0_south---2a_d0_south-west": RegionConnection("2a_d0_south", "2a_d0_south-west", [[ItemName.dream_blocks, ], ]), + "2a_d0_south-east---2a_d0_south-west": RegionConnection("2a_d0_south-east", "2a_d0_south-west", []), + "2a_d0_south-east---2a_d0_east": RegionConnection("2a_d0_south-east", "2a_d0_east", []), + "2a_d0_east---2a_d0_west": RegionConnection("2a_d0_east", "2a_d0_west", [[ItemName.dream_blocks, ], ]), + "2a_d0_east---2a_d0_south-east": RegionConnection("2a_d0_east", "2a_d0_south-east", []), + "2a_d0_north-east---2a_d0_north-west": RegionConnection("2a_d0_north-east", "2a_d0_north-west", [[ItemName.dream_blocks, ], ]), + + "2a_d7_west---2a_d7_east": RegionConnection("2a_d7_west", "2a_d7_east", [[ItemName.dash_refills, ], ]), + "2a_d7_east---2a_d7_west": RegionConnection("2a_d7_east", "2a_d7_west", [[ItemName.cannot_access, ], ]), + + "2a_d8_west---2a_d8_south-east": RegionConnection("2a_d8_west", "2a_d8_south-east", [[ItemName.dash_refills, ], ]), + "2a_d8_south-east---2a_d8_west": RegionConnection("2a_d8_south-east", "2a_d8_west", [[ItemName.cannot_access, ], ]), + "2a_d8_south-east---2a_d8_north-east": RegionConnection("2a_d8_south-east", "2a_d8_north-east", []), + + "2a_d3_west---2a_d3_north": RegionConnection("2a_d3_west", "2a_d3_north", [[ItemName.dream_blocks, ], ]), + "2a_d3_north---2a_d3_west": RegionConnection("2a_d3_north", "2a_d3_west", [[ItemName.dream_blocks, ], ]), + + "2a_d2_west---2a_d2_east": RegionConnection("2a_d2_west", "2a_d2_east", []), + "2a_d2_north-west---2a_d2_west": RegionConnection("2a_d2_north-west", "2a_d2_west", []), + "2a_d2_east---2a_d2_west": RegionConnection("2a_d2_east", "2a_d2_west", []), + + + "2a_d1_south-west---2a_d1_south-east": RegionConnection("2a_d1_south-west", "2a_d1_south-east", []), + "2a_d1_south-west---2a_d1_north-east": RegionConnection("2a_d1_south-west", "2a_d1_north-east", []), + "2a_d1_south-east---2a_d1_south-west": RegionConnection("2a_d1_south-east", "2a_d1_south-west", []), + "2a_d1_south-east---2a_d1_north-east": RegionConnection("2a_d1_south-east", "2a_d1_north-east", []), + "2a_d1_north-east---2a_d1_south-west": RegionConnection("2a_d1_north-east", "2a_d1_south-west", []), + "2a_d1_north-east---2a_d1_south-east": RegionConnection("2a_d1_north-east", "2a_d1_south-east", []), + + "2a_d6_west---2a_d6_east": RegionConnection("2a_d6_west", "2a_d6_east", []), + "2a_d6_east---2a_d6_west": RegionConnection("2a_d6_east", "2a_d6_west", [[ItemName.cannot_access, ], ]), + + "2a_d4_west---2a_d4_east": RegionConnection("2a_d4_west", "2a_d4_east", []), + "2a_d4_west---2a_d4_south": RegionConnection("2a_d4_west", "2a_d4_south", [[ItemName.dream_blocks, ], ]), + "2a_d4_east---2a_d4_west": RegionConnection("2a_d4_east", "2a_d4_west", []), + "2a_d4_south---2a_d4_west": RegionConnection("2a_d4_south", "2a_d4_west", [[ItemName.dream_blocks, ], ]), + + + "2a_3x_bottom---2a_3x_top": RegionConnection("2a_3x_bottom", "2a_3x_top", [[ItemName.dream_blocks, ], ]), + "2a_3x_top---2a_3x_bottom": RegionConnection("2a_3x_top", "2a_3x_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_3_bottom---2a_3_top": RegionConnection("2a_3_bottom", "2a_3_top", [[ItemName.dream_blocks, ], ]), + "2a_3_top---2a_3_bottom": RegionConnection("2a_3_top", "2a_3_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_4_bottom---2a_4_top": RegionConnection("2a_4_bottom", "2a_4_top", [[ItemName.dream_blocks, ], ]), + "2a_4_top---2a_4_bottom": RegionConnection("2a_4_top", "2a_4_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_5_bottom---2a_5_top": RegionConnection("2a_5_bottom", "2a_5_top", [[ItemName.dream_blocks, ], ]), + "2a_5_top---2a_5_bottom": RegionConnection("2a_5_top", "2a_5_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_6_bottom---2a_6_top": RegionConnection("2a_6_bottom", "2a_6_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2a_6_top---2a_6_bottom": RegionConnection("2a_6_top", "2a_6_bottom", [[ItemName.cannot_access, ], ]), + + "2a_7_bottom---2a_7_top": RegionConnection("2a_7_bottom", "2a_7_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2a_7_top---2a_7_bottom": RegionConnection("2a_7_top", "2a_7_bottom", [[ItemName.cannot_access, ], ]), + + "2a_8_bottom---2a_8_top": RegionConnection("2a_8_bottom", "2a_8_top", [[ItemName.dream_blocks, ], ]), + "2a_8_top---2a_8_bottom": RegionConnection("2a_8_top", "2a_8_bottom", [[ItemName.cannot_access, ], ]), + + "2a_9_west---2a_9_north": RegionConnection("2a_9_west", "2a_9_north", [[ItemName.dream_blocks, ], ]), + "2a_9_north---2a_9_south": RegionConnection("2a_9_north", "2a_9_south", [[ItemName.dream_blocks, ], ]), + "2a_9_north---2a_9_west": RegionConnection("2a_9_north", "2a_9_west", [[ItemName.cannot_access, ], ]), + "2a_9_north-west---2a_9_west": RegionConnection("2a_9_north-west", "2a_9_west", []), + "2a_9_south---2a_9_south-east": RegionConnection("2a_9_south", "2a_9_south-east", [[ItemName.coins, ], ]), + + "2a_9b_east---2a_9b_west": RegionConnection("2a_9b_east", "2a_9b_west", []), + "2a_9b_west---2a_9b_east": RegionConnection("2a_9b_west", "2a_9b_east", []), + + "2a_10_top---2a_10_bottom": RegionConnection("2a_10_top", "2a_10_bottom", [[ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + "2a_10_bottom---2a_10_top": RegionConnection("2a_10_bottom", "2a_10_top", [[ItemName.cannot_access, ], ]), + + "2a_2_north-west---2a_2_south-east": RegionConnection("2a_2_north-west", "2a_2_south-east", []), + "2a_2_south-east---2a_2_north-west": RegionConnection("2a_2_south-east", "2a_2_north-west", []), + + "2a_11_west---2a_11_east": RegionConnection("2a_11_west", "2a_11_east", []), + "2a_11_east---2a_11_west": RegionConnection("2a_11_east", "2a_11_west", []), + + "2a_12b_west---2a_12b_north": RegionConnection("2a_12b_west", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_west": RegionConnection("2a_12b_north", "2a_12b_west", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_south": RegionConnection("2a_12b_north", "2a_12b_south", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_east": RegionConnection("2a_12b_north", "2a_12b_east", [[ItemName.dream_blocks, ], ]), + "2a_12b_south---2a_12b_north": RegionConnection("2a_12b_south", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_east---2a_12b_north": RegionConnection("2a_12b_east", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_south-east---2a_12b_north": RegionConnection("2a_12b_south-east", "2a_12b_north", []), + + + "2a_12d_north-west---2a_12d_north": RegionConnection("2a_12d_north-west", "2a_12d_north", []), + "2a_12d_north---2a_12d_north-west": RegionConnection("2a_12d_north", "2a_12d_north-west", []), + + "2a_12_west---2a_12_east": RegionConnection("2a_12_west", "2a_12_east", []), + "2a_12_east---2a_12_west": RegionConnection("2a_12_east", "2a_12_west", []), + + "2a_13_west---2a_13_phone": RegionConnection("2a_13_west", "2a_13_phone", []), + "2a_13_phone---2a_13_west": RegionConnection("2a_13_phone", "2a_13_west", []), + + "2a_end_0_main---2a_end_0_east": RegionConnection("2a_end_0_main", "2a_end_0_east", []), + "2a_end_0_top---2a_end_0_east": RegionConnection("2a_end_0_top", "2a_end_0_east", []), + "2a_end_0_top---2a_end_0_main": RegionConnection("2a_end_0_top", "2a_end_0_main", []), + "2a_end_0_east---2a_end_0_main": RegionConnection("2a_end_0_east", "2a_end_0_main", []), + "2a_end_0_east---2a_end_0_top": RegionConnection("2a_end_0_east", "2a_end_0_top", []), + + "2a_end_s0_bottom---2a_end_s0_top": RegionConnection("2a_end_s0_bottom", "2a_end_s0_top", []), + "2a_end_s0_top---2a_end_s0_bottom": RegionConnection("2a_end_s0_top", "2a_end_s0_bottom", []), + + + "2a_end_1_west---2a_end_1_east": RegionConnection("2a_end_1_west", "2a_end_1_east", []), + "2a_end_1_west---2a_end_1_north-east": RegionConnection("2a_end_1_west", "2a_end_1_north-east", []), + "2a_end_1_north-east---2a_end_1_west": RegionConnection("2a_end_1_north-east", "2a_end_1_west", []), + "2a_end_1_east---2a_end_1_west": RegionConnection("2a_end_1_east", "2a_end_1_west", []), + + "2a_end_2_north-west---2a_end_2_north-east": RegionConnection("2a_end_2_north-west", "2a_end_2_north-east", []), + "2a_end_2_west---2a_end_2_east": RegionConnection("2a_end_2_west", "2a_end_2_east", []), + "2a_end_2_north-east---2a_end_2_north-west": RegionConnection("2a_end_2_north-east", "2a_end_2_north-west", []), + "2a_end_2_east---2a_end_2_west": RegionConnection("2a_end_2_east", "2a_end_2_west", []), + + "2a_end_3_north-west---2a_end_3_west": RegionConnection("2a_end_3_north-west", "2a_end_3_west", []), + "2a_end_3_west---2a_end_3_east": RegionConnection("2a_end_3_west", "2a_end_3_east", []), + "2a_end_3_west---2a_end_3_north-west": RegionConnection("2a_end_3_west", "2a_end_3_north-west", []), + "2a_end_3_east---2a_end_3_west": RegionConnection("2a_end_3_east", "2a_end_3_west", []), + + "2a_end_4_west---2a_end_4_east": RegionConnection("2a_end_4_west", "2a_end_4_east", []), + "2a_end_4_east---2a_end_4_west": RegionConnection("2a_end_4_east", "2a_end_4_west", []), + + "2a_end_3b_west---2a_end_3b_north": RegionConnection("2a_end_3b_west", "2a_end_3b_north", [[ItemName.springs, ], ]), + "2a_end_3b_west---2a_end_3b_east": RegionConnection("2a_end_3b_west", "2a_end_3b_east", []), + "2a_end_3b_north---2a_end_3b_west": RegionConnection("2a_end_3b_north", "2a_end_3b_west", []), + "2a_end_3b_east---2a_end_3b_west": RegionConnection("2a_end_3b_east", "2a_end_3b_west", []), + + "2a_end_3cb_bottom---2a_end_3cb_top": RegionConnection("2a_end_3cb_bottom", "2a_end_3cb_top", []), + "2a_end_3cb_top---2a_end_3cb_bottom": RegionConnection("2a_end_3cb_top", "2a_end_3cb_bottom", []), + + + "2a_end_5_west---2a_end_5_east": RegionConnection("2a_end_5_west", "2a_end_5_east", []), + "2a_end_5_east---2a_end_5_west": RegionConnection("2a_end_5_east", "2a_end_5_west", []), + + "2a_end_6_west---2a_end_6_main": RegionConnection("2a_end_6_west", "2a_end_6_main", []), + "2a_end_6_main---2a_end_6_west": RegionConnection("2a_end_6_main", "2a_end_6_west", []), + + "2b_start_west---2b_start_east": RegionConnection("2b_start_west", "2b_start_east", []), + "2b_start_east---2b_start_west": RegionConnection("2b_start_east", "2b_start_west", []), + + "2b_00_west---2b_00_east": RegionConnection("2b_00_west", "2b_00_east", [[ItemName.dream_blocks, ], ]), + "2b_00_east---2b_00_west": RegionConnection("2b_00_east", "2b_00_west", [[ItemName.dream_blocks, ], ]), + + "2b_01_west---2b_01_east": RegionConnection("2b_01_west", "2b_01_east", [[ItemName.dream_blocks, ], ]), + "2b_01_east---2b_01_west": RegionConnection("2b_01_east", "2b_01_west", [[ItemName.dream_blocks, ], ]), + + "2b_01b_west---2b_01b_east": RegionConnection("2b_01b_west", "2b_01b_east", [[ItemName.dream_blocks, ], ]), + "2b_01b_east---2b_01b_west": RegionConnection("2b_01b_east", "2b_01b_west", [[ItemName.cannot_access, ], ]), + + "2b_02b_west---2b_02b_east": RegionConnection("2b_02b_west", "2b_02b_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_02b_east---2b_02b_west": RegionConnection("2b_02b_east", "2b_02b_west", [[ItemName.cannot_access, ], ]), + + "2b_02_west---2b_02_east": RegionConnection("2b_02_west", "2b_02_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_02_east---2b_02_west": RegionConnection("2b_02_east", "2b_02_west", [[ItemName.cannot_access, ], ]), + + "2b_03_west---2b_03_east": RegionConnection("2b_03_west", "2b_03_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_03_east---2b_03_west": RegionConnection("2b_03_east", "2b_03_west", [[ItemName.cannot_access, ], ]), + + "2b_04_bottom---2b_04_top": RegionConnection("2b_04_bottom", "2b_04_top", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_04_top---2b_04_bottom": RegionConnection("2b_04_top", "2b_04_bottom", [[ItemName.cannot_access, ], ]), + + "2b_05_bottom---2b_05_top": RegionConnection("2b_05_bottom", "2b_05_top", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_05_top---2b_05_bottom": RegionConnection("2b_05_top", "2b_05_bottom", [[ItemName.cannot_access, ], ]), + + "2b_06_west---2b_06_east": RegionConnection("2b_06_west", "2b_06_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_06_east---2b_06_west": RegionConnection("2b_06_east", "2b_06_west", [[ItemName.cannot_access, ], ]), + + "2b_07_bottom---2b_07_top": RegionConnection("2b_07_bottom", "2b_07_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_07_top---2b_07_bottom": RegionConnection("2b_07_top", "2b_07_bottom", [[ItemName.cannot_access, ], ]), + + "2b_08b_west---2b_08b_east": RegionConnection("2b_08b_west", "2b_08b_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + "2b_08b_east---2b_08b_west": RegionConnection("2b_08b_east", "2b_08b_west", [[ItemName.cannot_access, ], ]), + + "2b_08_west---2b_08_east": RegionConnection("2b_08_west", "2b_08_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "2b_09_west---2b_09_east": RegionConnection("2b_09_west", "2b_09_east", [[ItemName.dream_blocks, ], ]), + + "2b_10_west---2b_10_east": RegionConnection("2b_10_west", "2b_10_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "2b_11_bottom---2b_11_top": RegionConnection("2b_11_bottom", "2b_11_top", [[ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "2b_end_west---2b_end_goal": RegionConnection("2b_end_west", "2b_end_goal", [[ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + + "2c_00_west---2c_00_east": RegionConnection("2c_00_west", "2c_00_east", [[ItemName.dream_blocks, ], ]), + "2c_00_east---2c_00_west": RegionConnection("2c_00_east", "2c_00_west", [[ItemName.dream_blocks, ], ]), + + "2c_01_west---2c_01_east": RegionConnection("2c_01_west", "2c_01_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "2c_02_west---2c_02_goal": RegionConnection("2c_02_west", "2c_02_goal", [[ItemName.coins, ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "3a_s0_main---3a_s0_east": RegionConnection("3a_s0_main", "3a_s0_east", []), + "3a_s0_east---3a_s0_main": RegionConnection("3a_s0_east", "3a_s0_main", []), + + "3a_s1_west---3a_s1_east": RegionConnection("3a_s1_west", "3a_s1_east", []), + "3a_s1_west---3a_s1_north-east": RegionConnection("3a_s1_west", "3a_s1_north-east", []), + "3a_s1_east---3a_s1_west": RegionConnection("3a_s1_east", "3a_s1_west", []), + "3a_s1_north-east---3a_s1_west": RegionConnection("3a_s1_north-east", "3a_s1_west", []), + + "3a_s2_west---3a_s2_east": RegionConnection("3a_s2_west", "3a_s2_east", []), + "3a_s2_north-west---3a_s2_east": RegionConnection("3a_s2_north-west", "3a_s2_east", []), + "3a_s2_east---3a_s2_west": RegionConnection("3a_s2_east", "3a_s2_west", []), + "3a_s2_east---3a_s2_north-west": RegionConnection("3a_s2_east", "3a_s2_north-west", []), + + "3a_s3_west---3a_s3_east": RegionConnection("3a_s3_west", "3a_s3_east", [["Celestial Resort A - Front Door Key", ], ]), + "3a_s3_east---3a_s3_west": RegionConnection("3a_s3_east", "3a_s3_west", []), + + "3a_0x-a_west---3a_0x-a_east": RegionConnection("3a_0x-a_west", "3a_0x-a_east", []), + "3a_0x-a_east---3a_0x-a_west": RegionConnection("3a_0x-a_east", "3a_0x-a_west", []), + + "3a_00-a_west---3a_00-a_east": RegionConnection("3a_00-a_west", "3a_00-a_east", []), + "3a_00-a_east---3a_00-a_west": RegionConnection("3a_00-a_east", "3a_00-a_west", []), + + "3a_02-a_west---3a_02-a_main": RegionConnection("3a_02-a_west", "3a_02-a_main", [[ItemName.sinking_platforms, ], [ItemName.dash_refills, ], ]), + "3a_02-a_top---3a_02-a_west": RegionConnection("3a_02-a_top", "3a_02-a_west", [[ItemName.dash_refills, ], ]), + "3a_02-a_top---3a_02-a_main": RegionConnection("3a_02-a_top", "3a_02-a_main", [[ItemName.dash_refills, ], ]), + "3a_02-a_main---3a_02-a_top": RegionConnection("3a_02-a_main", "3a_02-a_top", [[ItemName.dash_refills, ], ]), + "3a_02-a_main---3a_02-a_east": RegionConnection("3a_02-a_main", "3a_02-a_east", [["Celestial Resort A - Hallway Key 1", ], ]), + "3a_02-a_east---3a_02-a_main": RegionConnection("3a_02-a_east", "3a_02-a_main", []), + + "3a_02-b_west---3a_02-b_east": RegionConnection("3a_02-b_west", "3a_02-b_east", []), + "3a_02-b_east---3a_02-b_west": RegionConnection("3a_02-b_east", "3a_02-b_west", []), + + "3a_01-b_west---3a_01-b_east": RegionConnection("3a_01-b_west", "3a_01-b_east", []), + "3a_01-b_north-west---3a_01-b_west": RegionConnection("3a_01-b_north-west", "3a_01-b_west", []), + "3a_01-b_east---3a_01-b_west": RegionConnection("3a_01-b_east", "3a_01-b_west", []), + "3a_01-b_east---3a_01-b_north-west": RegionConnection("3a_01-b_east", "3a_01-b_north-west", [[ItemName.springs, ], ]), + + "3a_00-b_south-west---3a_00-b_south-east": RegionConnection("3a_00-b_south-west", "3a_00-b_south-east", []), + "3a_00-b_south-east---3a_00-b_south-west": RegionConnection("3a_00-b_south-east", "3a_00-b_south-west", []), + "3a_00-b_west---3a_00-b_north-west": RegionConnection("3a_00-b_west", "3a_00-b_north-west", []), + "3a_00-b_north-west---3a_00-b_west": RegionConnection("3a_00-b_north-west", "3a_00-b_west", []), + "3a_00-b_east---3a_00-b_north": RegionConnection("3a_00-b_east", "3a_00-b_north", []), + "3a_00-b_north---3a_00-b_east": RegionConnection("3a_00-b_north", "3a_00-b_east", []), + + "3a_00-c_south-west---3a_00-c_south-east": RegionConnection("3a_00-c_south-west", "3a_00-c_south-east", [[ItemName.dash_refills, ], ]), + "3a_00-c_south-east---3a_00-c_south-west": RegionConnection("3a_00-c_south-east", "3a_00-c_south-west", [[ItemName.dash_refills, ], ]), + "3a_00-c_south-east---3a_00-c_north-east": RegionConnection("3a_00-c_south-east", "3a_00-c_north-east", []), + "3a_00-c_north-east---3a_00-c_south-east": RegionConnection("3a_00-c_north-east", "3a_00-c_south-east", []), + + "3a_0x-b_west---3a_0x-b_south-east": RegionConnection("3a_0x-b_west", "3a_0x-b_south-east", []), + "3a_0x-b_north-east---3a_0x-b_west": RegionConnection("3a_0x-b_north-east", "3a_0x-b_west", [[ItemName.dash_refills, ], ]), + + "3a_03-a_west---3a_03-a_east": RegionConnection("3a_03-a_west", "3a_03-a_east", [[ItemName.sinking_platforms, ], ]), + "3a_03-a_top---3a_03-a_east": RegionConnection("3a_03-a_top", "3a_03-a_east", []), + "3a_03-a_east---3a_03-a_top": RegionConnection("3a_03-a_east", "3a_03-a_top", []), + + + "3a_05-a_west---3a_05-a_east": RegionConnection("3a_05-a_west", "3a_05-a_east", [[ItemName.dash_refills, ItemName.moving_platforms, ], ]), + "3a_05-a_east---3a_05-a_west": RegionConnection("3a_05-a_east", "3a_05-a_west", [[ItemName.dash_refills, ItemName.moving_platforms, ], ]), + + "3a_06-a_west---3a_06-a_east": RegionConnection("3a_06-a_west", "3a_06-a_east", []), + + "3a_07-a_west---3a_07-a_east": RegionConnection("3a_07-a_west", "3a_07-a_east", [["Celestial Resort A - Hallway Key 2", ItemName.dash_refills, ], ]), + "3a_07-a_west---3a_07-a_top": RegionConnection("3a_07-a_west", "3a_07-a_top", []), + "3a_07-a_top---3a_07-a_west": RegionConnection("3a_07-a_top", "3a_07-a_west", []), + "3a_07-a_east---3a_07-a_west": RegionConnection("3a_07-a_east", "3a_07-a_west", [["Celestial Resort A - Hallway Key 2", ItemName.dash_refills, ], ]), + + "3a_07-b_bottom---3a_07-b_west": RegionConnection("3a_07-b_bottom", "3a_07-b_west", []), + "3a_07-b_west---3a_07-b_bottom": RegionConnection("3a_07-b_west", "3a_07-b_bottom", []), + "3a_07-b_east---3a_07-b_bottom": RegionConnection("3a_07-b_east", "3a_07-b_bottom", []), + + "3a_06-b_west---3a_06-b_east": RegionConnection("3a_06-b_west", "3a_06-b_east", []), + "3a_06-b_east---3a_06-b_west": RegionConnection("3a_06-b_east", "3a_06-b_west", []), + + "3a_06-c_south-west---3a_06-c_north-west": RegionConnection("3a_06-c_south-west", "3a_06-c_north-west", []), + "3a_06-c_south-west---3a_06-c_south-east": RegionConnection("3a_06-c_south-west", "3a_06-c_south-east", []), + "3a_06-c_north-west---3a_06-c_south-west": RegionConnection("3a_06-c_north-west", "3a_06-c_south-west", []), + "3a_06-c_south-east---3a_06-c_south-west": RegionConnection("3a_06-c_south-east", "3a_06-c_south-west", []), + "3a_06-c_south-east---3a_06-c_east": RegionConnection("3a_06-c_south-east", "3a_06-c_east", []), + "3a_06-c_east---3a_06-c_south-east": RegionConnection("3a_06-c_east", "3a_06-c_south-east", []), + + + "3a_08-c_west---3a_08-c_east": RegionConnection("3a_08-c_west", "3a_08-c_east", [[ItemName.coins, ItemName.moving_platforms, ItemName.springs, ], ]), + + "3a_08-b_east---3a_08-b_west": RegionConnection("3a_08-b_east", "3a_08-b_west", [[ItemName.sinking_platforms, ItemName.coins, ], ]), + + "3a_08-a_west---3a_08-a_east": RegionConnection("3a_08-a_west", "3a_08-a_east", []), + "3a_08-a_west---3a_08-a_bottom": RegionConnection("3a_08-a_west", "3a_08-a_bottom", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_08-a_east---3a_08-a_west": RegionConnection("3a_08-a_east", "3a_08-a_west", []), + + "3a_09-b_west---3a_09-b_center": RegionConnection("3a_09-b_west", "3a_09-b_center", []), + "3a_09-b_north-west---3a_09-b_center": RegionConnection("3a_09-b_north-west", "3a_09-b_center", [["Celestial Resort A - Huge Mess Key", ], ]), + "3a_09-b_center---3a_09-b_west": RegionConnection("3a_09-b_center", "3a_09-b_west", []), + "3a_09-b_center---3a_09-b_north-west": RegionConnection("3a_09-b_center", "3a_09-b_north-west", [["Celestial Resort A - Huge Mess Key", ], ]), + "3a_09-b_center---3a_09-b_south-west": RegionConnection("3a_09-b_center", "3a_09-b_south-west", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_09-b_center---3a_09-b_south": RegionConnection("3a_09-b_center", "3a_09-b_south", []), + "3a_09-b_center---3a_09-b_south-east": RegionConnection("3a_09-b_center", "3a_09-b_south-east", []), + "3a_09-b_center---3a_09-b_east": RegionConnection("3a_09-b_center", "3a_09-b_east", []), + "3a_09-b_center---3a_09-b_north-east-right": RegionConnection("3a_09-b_center", "3a_09-b_north-east-right", []), + "3a_09-b_center---3a_09-b_north-east-top": RegionConnection("3a_09-b_center", "3a_09-b_north-east-top", []), + "3a_09-b_center---3a_09-b_north": RegionConnection("3a_09-b_center", "3a_09-b_north", []), + "3a_09-b_south-west---3a_09-b_center": RegionConnection("3a_09-b_south-west", "3a_09-b_center", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_09-b_south---3a_09-b_center": RegionConnection("3a_09-b_south", "3a_09-b_center", []), + "3a_09-b_south-east---3a_09-b_center": RegionConnection("3a_09-b_south-east", "3a_09-b_center", []), + "3a_09-b_east---3a_09-b_center": RegionConnection("3a_09-b_east", "3a_09-b_center", []), + "3a_09-b_north-east-right---3a_09-b_center": RegionConnection("3a_09-b_north-east-right", "3a_09-b_center", []), + "3a_09-b_north-east-top---3a_09-b_center": RegionConnection("3a_09-b_north-east-top", "3a_09-b_center", []), + "3a_09-b_north---3a_09-b_center": RegionConnection("3a_09-b_north", "3a_09-b_center", []), + + "3a_10-x_west---3a_10-x_south-east": RegionConnection("3a_10-x_west", "3a_10-x_south-east", []), + "3a_10-x_south-east---3a_10-x_west": RegionConnection("3a_10-x_south-east", "3a_10-x_west", [[ItemName.brown_clutter, ], ]), + "3a_10-x_north-east-top---3a_10-x_north-east-right": RegionConnection("3a_10-x_north-east-top", "3a_10-x_north-east-right", []), + "3a_10-x_north-east-right---3a_10-x_north-east-top": RegionConnection("3a_10-x_north-east-right", "3a_10-x_north-east-top", []), + + "3a_11-x_west---3a_11-x_south": RegionConnection("3a_11-x_west", "3a_11-x_south", [[ItemName.coins, ], ]), + + "3a_11-y_west---3a_11-y_east": RegionConnection("3a_11-y_west", "3a_11-y_east", []), + "3a_11-y_east---3a_11-y_east": RegionConnection("3a_11-y_east", "3a_11-y_east", []), + "3a_11-y_east---3a_11-y_south": RegionConnection("3a_11-y_east", "3a_11-y_south", []), + "3a_11-y_south---3a_11-y_east": RegionConnection("3a_11-y_south", "3a_11-y_east", []), + + + "3a_11-z_west---3a_11-z_east": RegionConnection("3a_11-z_west", "3a_11-z_east", [[ItemName.dash_refills, ], ]), + "3a_11-z_east---3a_11-z_west": RegionConnection("3a_11-z_east", "3a_11-z_west", [[ItemName.dash_refills, ], ]), + + "3a_10-z_bottom---3a_10-z_top": RegionConnection("3a_10-z_bottom", "3a_10-z_top", [[ItemName.sinking_platforms, ], ]), + "3a_10-z_top---3a_10-z_bottom": RegionConnection("3a_10-z_top", "3a_10-z_bottom", []), + + "3a_10-y_bottom---3a_10-y_top": RegionConnection("3a_10-y_bottom", "3a_10-y_top", []), + "3a_10-y_top---3a_10-y_bottom": RegionConnection("3a_10-y_top", "3a_10-y_bottom", []), + + "3a_10-c_south-east---3a_10-c_north-east": RegionConnection("3a_10-c_south-east", "3a_10-c_north-east", []), + "3a_10-c_north-east---3a_10-c_south-east": RegionConnection("3a_10-c_north-east", "3a_10-c_south-east", []), + "3a_10-c_north-west---3a_10-c_south-west": RegionConnection("3a_10-c_north-west", "3a_10-c_south-west", []), + "3a_10-c_south-west---3a_10-c_north-west": RegionConnection("3a_10-c_south-west", "3a_10-c_north-west", []), + + "3a_11-c_west---3a_11-c_east": RegionConnection("3a_11-c_west", "3a_11-c_east", []), + "3a_11-c_east---3a_11-c_west": RegionConnection("3a_11-c_east", "3a_11-c_west", []), + "3a_11-c_south-east---3a_11-c_south-west": RegionConnection("3a_11-c_south-east", "3a_11-c_south-west", []), + "3a_11-c_south-west---3a_11-c_south-east": RegionConnection("3a_11-c_south-west", "3a_11-c_south-east", []), + + "3a_12-c_west---3a_12-c_top": RegionConnection("3a_12-c_west", "3a_12-c_top", []), + "3a_12-c_top---3a_12-c_west": RegionConnection("3a_12-c_top", "3a_12-c_west", []), + + "3a_12-d_bottom---3a_12-d_top": RegionConnection("3a_12-d_bottom", "3a_12-d_top", []), + + "3a_11-d_west---3a_11-d_east": RegionConnection("3a_11-d_west", "3a_11-d_east", [[ItemName.cannot_access, ], ]), + "3a_11-d_east---3a_11-d_west": RegionConnection("3a_11-d_east", "3a_11-d_west", [[ItemName.dash_refills, ], ]), + + "3a_10-d_west---3a_10-d_main": RegionConnection("3a_10-d_west", "3a_10-d_main", [[ItemName.green_clutter, ], ]), + "3a_10-d_main---3a_10-d_west": RegionConnection("3a_10-d_main", "3a_10-d_west", []), + "3a_10-d_east---3a_10-d_main": RegionConnection("3a_10-d_east", "3a_10-d_main", []), + + "3a_11-b_west---3a_11-b_east": RegionConnection("3a_11-b_west", "3a_11-b_east", []), + "3a_11-b_north-west---3a_11-b_west": RegionConnection("3a_11-b_north-west", "3a_11-b_west", []), + "3a_11-b_east---3a_11-b_west": RegionConnection("3a_11-b_east", "3a_11-b_west", []), + "3a_11-b_east---3a_11-b_north-east": RegionConnection("3a_11-b_east", "3a_11-b_north-east", [[ItemName.pink_clutter, ], ]), + "3a_11-b_north-east---3a_11-b_east": RegionConnection("3a_11-b_north-east", "3a_11-b_east", [[ItemName.pink_clutter, ], ]), + + "3a_12-b_west---3a_12-b_east": RegionConnection("3a_12-b_west", "3a_12-b_east", []), + "3a_12-b_east---3a_12-b_west": RegionConnection("3a_12-b_east", "3a_12-b_west", []), + + "3a_13-b_top---3a_13-b_bottom": RegionConnection("3a_13-b_top", "3a_13-b_bottom", []), + "3a_13-b_bottom---3a_13-b_top": RegionConnection("3a_13-b_bottom", "3a_13-b_top", []), + + "3a_13-a_west---3a_13-a_east": RegionConnection("3a_13-a_west", "3a_13-a_east", []), + "3a_13-a_west---3a_13-a_south-west": RegionConnection("3a_13-a_west", "3a_13-a_south-west", [[ItemName.pink_clutter, ], ]), + "3a_13-a_south-west---3a_13-a_west": RegionConnection("3a_13-a_south-west", "3a_13-a_west", [[ItemName.pink_clutter, ], ]), + + "3a_13-x_west---3a_13-x_east": RegionConnection("3a_13-x_west", "3a_13-x_east", []), + "3a_13-x_east---3a_13-x_west": RegionConnection("3a_13-x_east", "3a_13-x_west", []), + + "3a_12-x_west---3a_12-x_east": RegionConnection("3a_12-x_west", "3a_12-x_east", []), + "3a_12-x_north-east---3a_12-x_east": RegionConnection("3a_12-x_north-east", "3a_12-x_east", []), + "3a_12-x_east---3a_12-x_west": RegionConnection("3a_12-x_east", "3a_12-x_west", []), + + "3a_11-a_west---3a_11-a_south": RegionConnection("3a_11-a_west", "3a_11-a_south", []), + "3a_11-a_south---3a_11-a_west": RegionConnection("3a_11-a_south", "3a_11-a_west", []), + "3a_11-a_south-east-bottom---3a_11-a_south-east-right": RegionConnection("3a_11-a_south-east-bottom", "3a_11-a_south-east-right", [[ItemName.pink_clutter, ], ]), + "3a_11-a_south-east-right---3a_11-a_south-east-bottom": RegionConnection("3a_11-a_south-east-right", "3a_11-a_south-east-bottom", [[ItemName.pink_clutter, ], ]), + + "3a_08-x_west---3a_08-x_east": RegionConnection("3a_08-x_west", "3a_08-x_east", []), + "3a_08-x_east---3a_08-x_west": RegionConnection("3a_08-x_east", "3a_08-x_west", []), + + "3a_09-d_bottom---3a_09-d_top": RegionConnection("3a_09-d_bottom", "3a_09-d_top", []), + + "3a_08-d_east---3a_08-d_west": RegionConnection("3a_08-d_east", "3a_08-d_west", [[ItemName.dash_refills, ItemName.coins, ], ]), + + "3a_06-d_east---3a_06-d_west": RegionConnection("3a_06-d_east", "3a_06-d_west", [[ItemName.dash_refills, ], ]), + + "3a_04-d_west---3a_04-d_west": RegionConnection("3a_04-d_west", "3a_04-d_west", []), + "3a_04-d_south-west---3a_04-d_west": RegionConnection("3a_04-d_south-west", "3a_04-d_west", []), + "3a_04-d_south---3a_04-d_south-west": RegionConnection("3a_04-d_south", "3a_04-d_south-west", [[ItemName.cannot_access, ], ]), + "3a_04-d_east---3a_04-d_south": RegionConnection("3a_04-d_east", "3a_04-d_south", [[ItemName.dash_refills, ], ]), + + "3a_04-c_west---3a_04-c_north-west": RegionConnection("3a_04-c_west", "3a_04-c_north-west", [["Celestial Resort A - Presidential Suite Key", ], ]), + "3a_04-c_west---3a_04-c_east": RegionConnection("3a_04-c_west", "3a_04-c_east", []), + "3a_04-c_north-west---3a_04-c_west": RegionConnection("3a_04-c_north-west", "3a_04-c_west", [["Celestial Resort A - Presidential Suite Key", ], ]), + "3a_04-c_east---3a_04-c_west": RegionConnection("3a_04-c_east", "3a_04-c_west", []), + + "3a_02-c_west---3a_02-c_east": RegionConnection("3a_02-c_west", "3a_02-c_east", []), + "3a_02-c_east---3a_02-c_west": RegionConnection("3a_02-c_east", "3a_02-c_west", [[ItemName.sinking_platforms, ], ]), + "3a_02-c_east---3a_02-c_south-east": RegionConnection("3a_02-c_east", "3a_02-c_south-east", []), + "3a_02-c_south-east---3a_02-c_east": RegionConnection("3a_02-c_south-east", "3a_02-c_east", []), + + "3a_03-b_west---3a_03-b_east": RegionConnection("3a_03-b_west", "3a_03-b_east", []), + "3a_03-b_east---3a_03-b_west": RegionConnection("3a_03-b_east", "3a_03-b_west", []), + "3a_03-b_east---3a_03-b_north": RegionConnection("3a_03-b_east", "3a_03-b_north", []), + "3a_03-b_north---3a_03-b_east": RegionConnection("3a_03-b_north", "3a_03-b_east", []), + + + "3a_02-d_west---3a_02-d_east": RegionConnection("3a_02-d_west", "3a_02-d_east", [[ItemName.cannot_access, ], ]), + "3a_02-d_east---3a_02-d_west": RegionConnection("3a_02-d_east", "3a_02-d_west", [[ItemName.dash_refills, ], ]), + + "3a_00-d_west---3a_00-d_east": RegionConnection("3a_00-d_west", "3a_00-d_east", []), + "3a_00-d_east---3a_00-d_west": RegionConnection("3a_00-d_east", "3a_00-d_west", []), + + "3a_roof00_west---3a_roof00_east": RegionConnection("3a_roof00_west", "3a_roof00_east", []), + "3a_roof00_east---3a_roof00_west": RegionConnection("3a_roof00_east", "3a_roof00_west", []), + + "3a_roof01_west---3a_roof01_east": RegionConnection("3a_roof01_west", "3a_roof01_east", [[ItemName.springs, ], ]), + + "3a_roof02_west---3a_roof02_east": RegionConnection("3a_roof02_west", "3a_roof02_east", []), + "3a_roof02_east---3a_roof02_west": RegionConnection("3a_roof02_east", "3a_roof02_west", []), + + "3a_roof03_west---3a_roof03_east": RegionConnection("3a_roof03_west", "3a_roof03_east", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ], ]), + + "3a_roof04_west---3a_roof04_east": RegionConnection("3a_roof04_west", "3a_roof04_east", []), + "3a_roof04_east---3a_roof04_west": RegionConnection("3a_roof04_east", "3a_roof04_west", []), + + "3a_roof05_west---3a_roof05_east": RegionConnection("3a_roof05_west", "3a_roof05_east", [[ItemName.springs, ], ]), + + "3a_roof06b_west---3a_roof06b_east": RegionConnection("3a_roof06b_west", "3a_roof06b_east", [[ItemName.dash_refills, ], ]), + "3a_roof06b_east---3a_roof06b_west": RegionConnection("3a_roof06b_east", "3a_roof06b_west", [[ItemName.dash_refills, ], ]), + + "3a_roof06_west---3a_roof06_east": RegionConnection("3a_roof06_west", "3a_roof06_east", []), + "3a_roof06_east---3a_roof06_west": RegionConnection("3a_roof06_east", "3a_roof06_west", []), + + "3a_roof07_west---3a_roof07_main": RegionConnection("3a_roof07_west", "3a_roof07_main", []), + "3a_roof07_main---3a_roof07_west": RegionConnection("3a_roof07_main", "3a_roof07_west", []), + + "3b_00_west---3b_00_east": RegionConnection("3b_00_west", "3b_00_east", []), + "3b_00_east---3b_00_west": RegionConnection("3b_00_east", "3b_00_west", []), + + + "3b_01_west---3b_01_east": RegionConnection("3b_01_west", "3b_01_east", [[ItemName.dash_refills, ], ]), + "3b_01_east---3b_01_west": RegionConnection("3b_01_east", "3b_01_west", [[ItemName.dash_refills, ], ]), + + "3b_02_west---3b_02_east": RegionConnection("3b_02_west", "3b_02_east", []), + "3b_02_east---3b_02_west": RegionConnection("3b_02_east", "3b_02_west", []), + + "3b_03_west---3b_03_east": RegionConnection("3b_03_west", "3b_03_east", [[ItemName.dash_refills, ], ]), + "3b_03_east---3b_03_west": RegionConnection("3b_03_east", "3b_03_west", [[ItemName.dash_refills, ], ]), + + "3b_04_west---3b_04_east": RegionConnection("3b_04_west", "3b_04_east", [[ItemName.dash_refills, ], ]), + "3b_04_east---3b_04_west": RegionConnection("3b_04_east", "3b_04_west", [[ItemName.dash_refills, ], ]), + + "3b_05_west---3b_05_east": RegionConnection("3b_05_west", "3b_05_east", [[ItemName.moving_platforms, ItemName.coins, ItemName.springs, ], ]), + + "3b_06_west---3b_06_east": RegionConnection("3b_06_west", "3b_06_east", [[ItemName.sinking_platforms, ], ]), + "3b_06_east---3b_06_west": RegionConnection("3b_06_east", "3b_06_west", [[ItemName.sinking_platforms, ], ]), + + "3b_07_west---3b_07_east": RegionConnection("3b_07_west", "3b_07_east", []), + "3b_07_east---3b_07_west": RegionConnection("3b_07_east", "3b_07_west", []), + + "3b_08_bottom---3b_08_top": RegionConnection("3b_08_bottom", "3b_08_top", [[ItemName.dash_refills, ], ]), + "3b_08_top---3b_08_bottom": RegionConnection("3b_08_top", "3b_08_bottom", []), + + "3b_09_west---3b_09_east": RegionConnection("3b_09_west", "3b_09_east", []), + "3b_09_east---3b_09_east": RegionConnection("3b_09_east", "3b_09_east", []), + + "3b_10_west---3b_10_east": RegionConnection("3b_10_west", "3b_10_east", [[ItemName.dash_refills, ], ]), + + "3b_11_west---3b_11_east": RegionConnection("3b_11_west", "3b_11_east", [[ItemName.dash_refills, ], ]), + "3b_11_east---3b_11_west": RegionConnection("3b_11_east", "3b_11_west", [[ItemName.dash_refills, ], ]), + + "3b_13_west---3b_13_east": RegionConnection("3b_13_west", "3b_13_east", [[ItemName.springs, ], ]), + "3b_13_east---3b_13_west": RegionConnection("3b_13_east", "3b_13_west", [[ItemName.springs, ], ]), + + "3b_14_west---3b_14_east": RegionConnection("3b_14_west", "3b_14_east", [[ItemName.dash_refills, ], ]), + "3b_14_east---3b_14_west": RegionConnection("3b_14_east", "3b_14_west", [[ItemName.dash_refills, ], ]), + + "3b_15_west---3b_15_east": RegionConnection("3b_15_west", "3b_15_east", []), + "3b_15_east---3b_15_west": RegionConnection("3b_15_east", "3b_15_west", []), + + "3b_12_west---3b_12_east": RegionConnection("3b_12_west", "3b_12_east", [[ItemName.springs, ], ]), + "3b_12_east---3b_12_west": RegionConnection("3b_12_east", "3b_12_west", [[ItemName.springs, ], ]), + + "3b_16_west---3b_16_top": RegionConnection("3b_16_west", "3b_16_top", []), + "3b_16_top---3b_16_west": RegionConnection("3b_16_top", "3b_16_west", []), + + "3b_17_west---3b_17_east": RegionConnection("3b_17_west", "3b_17_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "3b_17_east---3b_17_west": RegionConnection("3b_17_east", "3b_17_west", [[ItemName.dash_refills, ItemName.springs, ], ]), + + "3b_18_west---3b_18_east": RegionConnection("3b_18_west", "3b_18_east", []), + "3b_18_east---3b_18_west": RegionConnection("3b_18_east", "3b_18_west", []), + + "3b_19_west---3b_19_east": RegionConnection("3b_19_west", "3b_19_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "3b_19_east---3b_19_west": RegionConnection("3b_19_east", "3b_19_west", [[ItemName.springs, ItemName.dash_refills, ], ]), + + "3b_21_west---3b_21_east": RegionConnection("3b_21_west", "3b_21_east", [[ItemName.dash_refills, ], ]), + "3b_21_east---3b_21_west": RegionConnection("3b_21_east", "3b_21_west", [[ItemName.dash_refills, ], ]), + + "3b_20_west---3b_20_east": RegionConnection("3b_20_west", "3b_20_east", [[ItemName.dash_refills, ItemName.coins, ], ]), + + "3b_end_west---3b_end_goal": RegionConnection("3b_end_west", "3b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ], ]), + + "3c_00_west---3c_00_east": RegionConnection("3c_00_west", "3c_00_east", [[ItemName.dash_refills, ], ]), + "3c_00_east---3c_00_west": RegionConnection("3c_00_east", "3c_00_west", [[ItemName.dash_refills, ], ]), + + "3c_01_west---3c_01_east": RegionConnection("3c_01_west", "3c_01_east", [[ItemName.sinking_platforms, ], ]), + + "3c_02_west---3c_02_goal": RegionConnection("3c_02_west", "3c_02_goal", [[ItemName.coins, ItemName.dash_refills, ], ]), + + "4a_a-00_west---4a_a-00_east": RegionConnection("4a_a-00_west", "4a_a-00_east", [[ItemName.blue_clouds, ], ]), + "4a_a-00_east---4a_a-00_west": RegionConnection("4a_a-00_east", "4a_a-00_west", []), + + "4a_a-01_west---4a_a-01_east": RegionConnection("4a_a-01_west", "4a_a-01_east", [[ItemName.blue_boosters, ], ]), + "4a_a-01_east---4a_a-01_west": RegionConnection("4a_a-01_east", "4a_a-01_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-01x_west---4a_a-01x_east": RegionConnection("4a_a-01x_west", "4a_a-01x_east", [[ItemName.blue_boosters, ], ]), + "4a_a-01x_east---4a_a-01x_west": RegionConnection("4a_a-01x_east", "4a_a-01x_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-02_west---4a_a-02_east": RegionConnection("4a_a-02_west", "4a_a-02_east", []), + "4a_a-02_east---4a_a-02_west": RegionConnection("4a_a-02_east", "4a_a-02_west", []), + + "4a_a-03_west---4a_a-03_east": RegionConnection("4a_a-03_west", "4a_a-03_east", [[ItemName.blue_boosters, ], ]), + "4a_a-03_east---4a_a-03_west": RegionConnection("4a_a-03_east", "4a_a-03_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-04_west---4a_a-04_east": RegionConnection("4a_a-04_west", "4a_a-04_east", [[ItemName.blue_clouds, ItemName.pink_clouds, ], ]), + "4a_a-04_east---4a_a-04_west": RegionConnection("4a_a-04_east", "4a_a-04_west", [[ItemName.blue_clouds, ], ]), + + "4a_a-05_west---4a_a-05_east": RegionConnection("4a_a-05_west", "4a_a-05_east", [[ItemName.moving_platforms, ], ]), + "4a_a-05_east---4a_a-05_west": RegionConnection("4a_a-05_east", "4a_a-05_west", [[ItemName.moving_platforms, ], ]), + + "4a_a-06_west---4a_a-06_east": RegionConnection("4a_a-06_west", "4a_a-06_east", []), + "4a_a-06_east---4a_a-06_west": RegionConnection("4a_a-06_east", "4a_a-06_west", []), + + "4a_a-07_west---4a_a-07_east": RegionConnection("4a_a-07_west", "4a_a-07_east", [[ItemName.blue_boosters, ItemName.coins, ], ]), + + "4a_a-08_west---4a_a-08_north-west": RegionConnection("4a_a-08_west", "4a_a-08_north-west", [[ItemName.blue_clouds, ItemName.blue_boosters, ], ]), + "4a_a-08_west---4a_a-08_east": RegionConnection("4a_a-08_west", "4a_a-08_east", [[ItemName.blue_clouds, ], ]), + "4a_a-08_north-west---4a_a-08_west": RegionConnection("4a_a-08_north-west", "4a_a-08_west", []), + "4a_a-08_east---4a_a-08_west": RegionConnection("4a_a-08_east", "4a_a-08_west", [[ItemName.blue_clouds, ], ]), + + "4a_a-10_west---4a_a-10_east": RegionConnection("4a_a-10_west", "4a_a-10_east", []), + "4a_a-10_east---4a_a-10_west": RegionConnection("4a_a-10_east", "4a_a-10_west", []), + + + "4a_a-09_bottom---4a_a-09_top": RegionConnection("4a_a-09_bottom", "4a_a-09_top", []), + "4a_a-09_top---4a_a-09_bottom": RegionConnection("4a_a-09_top", "4a_a-09_bottom", []), + + "4a_b-00_south---4a_b-00_south-east": RegionConnection("4a_b-00_south", "4a_b-00_south-east", []), + "4a_b-00_south---4a_b-00_west": RegionConnection("4a_b-00_south", "4a_b-00_west", [[ItemName.move_blocks, ], ]), + "4a_b-00_south---4a_b-00_east": RegionConnection("4a_b-00_south", "4a_b-00_east", [[ItemName.move_blocks, ], ]), + "4a_b-00_south---4a_b-00_north-east": RegionConnection("4a_b-00_south", "4a_b-00_north-east", [[ItemName.move_blocks, ], ]), + "4a_b-00_south-east---4a_b-00_south": RegionConnection("4a_b-00_south-east", "4a_b-00_south", []), + "4a_b-00_east---4a_b-00_south": RegionConnection("4a_b-00_east", "4a_b-00_south", []), + "4a_b-00_east---4a_b-00_north-west": RegionConnection("4a_b-00_east", "4a_b-00_north-west", []), + "4a_b-00_west---4a_b-00_south": RegionConnection("4a_b-00_west", "4a_b-00_south", []), + "4a_b-00_west---4a_b-00_north-west": RegionConnection("4a_b-00_west", "4a_b-00_north-west", []), + "4a_b-00_north-west---4a_b-00_south": RegionConnection("4a_b-00_north-west", "4a_b-00_south", []), + "4a_b-00_north-west---4a_b-00_north": RegionConnection("4a_b-00_north-west", "4a_b-00_north", []), + "4a_b-00_north---4a_b-00_north-west": RegionConnection("4a_b-00_north", "4a_b-00_north-west", []), + + + "4a_b-04_north-west---4a_b-04_east": RegionConnection("4a_b-04_north-west", "4a_b-04_east", []), + "4a_b-04_east---4a_b-04_west": RegionConnection("4a_b-04_east", "4a_b-04_west", [[ItemName.move_blocks, ], ]), + + "4a_b-06_west---4a_b-06_east": RegionConnection("4a_b-06_west", "4a_b-06_east", [[ItemName.cannot_access, ], ]), + "4a_b-06_east---4a_b-06_west": RegionConnection("4a_b-06_east", "4a_b-06_west", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4a_b-07_west---4a_b-07_east": RegionConnection("4a_b-07_west", "4a_b-07_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4a_b-03_west---4a_b-03_east": RegionConnection("4a_b-03_west", "4a_b-03_east", []), + "4a_b-03_east---4a_b-03_west": RegionConnection("4a_b-03_east", "4a_b-03_west", []), + + "4a_b-02_north-west---4a_b-02_north-east": RegionConnection("4a_b-02_north-west", "4a_b-02_north-east", []), + "4a_b-02_north-west---4a_b-02_north": RegionConnection("4a_b-02_north-west", "4a_b-02_north", []), + "4a_b-02_north-east---4a_b-02_north-west": RegionConnection("4a_b-02_north-east", "4a_b-02_north-west", []), + "4a_b-02_north---4a_b-02_north-west": RegionConnection("4a_b-02_north", "4a_b-02_north-west", []), + + "4a_b-sec_west---4a_b-sec_east": RegionConnection("4a_b-sec_west", "4a_b-sec_east", []), + "4a_b-sec_east---4a_b-sec_west": RegionConnection("4a_b-sec_east", "4a_b-sec_west", []), + + + "4a_b-05_center---4a_b-05_west": RegionConnection("4a_b-05_center", "4a_b-05_west", [[ItemName.pink_clouds, ItemName.move_blocks, ], ]), + "4a_b-05_north-east---4a_b-05_east": RegionConnection("4a_b-05_north-east", "4a_b-05_east", []), + "4a_b-05_east---4a_b-05_north-east": RegionConnection("4a_b-05_east", "4a_b-05_north-east", [[ItemName.move_blocks, ], ]), + + "4a_b-08b_west---4a_b-08b_east": RegionConnection("4a_b-08b_west", "4a_b-08b_east", [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "4a_b-08b_east---4a_b-08b_west": RegionConnection("4a_b-08b_east", "4a_b-08b_west", [[ItemName.dash_refills, ], ]), + + "4a_b-08_west---4a_b-08_east": RegionConnection("4a_b-08_west", "4a_b-08_east", [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + + "4a_c-00_west---4a_c-00_east": RegionConnection("4a_c-00_west", "4a_c-00_east", [[ItemName.blue_boosters, ], ]), + "4a_c-00_west---4a_c-00_north-west": RegionConnection("4a_c-00_west", "4a_c-00_north-west", []), + "4a_c-00_east---4a_c-00_west": RegionConnection("4a_c-00_east", "4a_c-00_west", [[ItemName.blue_boosters, ], ]), + "4a_c-00_north-west---4a_c-00_west": RegionConnection("4a_c-00_north-west", "4a_c-00_west", []), + + + "4a_c-02_west---4a_c-02_east": RegionConnection("4a_c-02_west", "4a_c-02_east", [[ItemName.blue_boosters, ], ]), + "4a_c-02_east---4a_c-02_west": RegionConnection("4a_c-02_east", "4a_c-02_west", [[ItemName.blue_boosters, ], ]), + + "4a_c-04_west---4a_c-04_east": RegionConnection("4a_c-04_west", "4a_c-04_east", [[ItemName.pink_clouds, ], ]), + + "4a_c-05_west---4a_c-05_east": RegionConnection("4a_c-05_west", "4a_c-05_east", [[ItemName.blue_boosters, ItemName.move_blocks, ], ]), + "4a_c-05_east---4a_c-05_west": RegionConnection("4a_c-05_east", "4a_c-05_west", [[ItemName.cannot_access, ], ]), + + "4a_c-06_bottom---4a_c-06_west": RegionConnection("4a_c-06_bottom", "4a_c-06_west", [[ItemName.blue_boosters, ItemName.blue_clouds, ItemName.move_blocks, ], ]), + "4a_c-06_west---4a_c-06_bottom": RegionConnection("4a_c-06_west", "4a_c-06_bottom", []), + "4a_c-06_west---4a_c-06_top": RegionConnection("4a_c-06_west", "4a_c-06_top", [[ItemName.move_blocks, ], ]), + + + "4a_c-09_west---4a_c-09_east": RegionConnection("4a_c-09_west", "4a_c-09_east", [[ItemName.coins, ItemName.move_blocks, ], ]), + + "4a_c-07_west---4a_c-07_east": RegionConnection("4a_c-07_west", "4a_c-07_east", []), + + "4a_c-08_bottom---4a_c-08_east": RegionConnection("4a_c-08_bottom", "4a_c-08_east", [[ItemName.springs, ], ]), + "4a_c-08_east---4a_c-08_bottom": RegionConnection("4a_c-08_east", "4a_c-08_bottom", []), + "4a_c-08_east---4a_c-08_top": RegionConnection("4a_c-08_east", "4a_c-08_top", [[ItemName.blue_boosters, ], ]), + "4a_c-08_top---4a_c-08_east": RegionConnection("4a_c-08_top", "4a_c-08_east", []), + + "4a_c-10_bottom---4a_c-10_top": RegionConnection("4a_c-10_bottom", "4a_c-10_top", [[ItemName.blue_boosters, ], ]), + "4a_c-10_top---4a_c-10_bottom": RegionConnection("4a_c-10_top", "4a_c-10_bottom", [[ItemName.blue_boosters, ], ]), + + "4a_d-00_west---4a_d-00_east": RegionConnection("4a_d-00_west", "4a_d-00_east", []), + "4a_d-00_west---4a_d-00_south": RegionConnection("4a_d-00_west", "4a_d-00_south", []), + "4a_d-00_west---4a_d-00_north-west": RegionConnection("4a_d-00_west", "4a_d-00_north-west", []), + "4a_d-00_south---4a_d-00_west": RegionConnection("4a_d-00_south", "4a_d-00_west", []), + "4a_d-00_east---4a_d-00_west": RegionConnection("4a_d-00_east", "4a_d-00_west", []), + "4a_d-00_north-west---4a_d-00_west": RegionConnection("4a_d-00_north-west", "4a_d-00_west", []), + + + "4a_d-01_west---4a_d-01_east": RegionConnection("4a_d-01_west", "4a_d-01_east", []), + "4a_d-01_east---4a_d-01_west": RegionConnection("4a_d-01_east", "4a_d-01_west", []), + + "4a_d-02_west---4a_d-02_east": RegionConnection("4a_d-02_west", "4a_d-02_east", [[ItemName.move_blocks, ItemName.coins, ItemName.pink_clouds, ItemName.blue_boosters, ], ]), + + "4a_d-03_west---4a_d-03_east": RegionConnection("4a_d-03_west", "4a_d-03_east", []), + "4a_d-03_east---4a_d-03_west": RegionConnection("4a_d-03_east", "4a_d-03_west", []), + + "4a_d-04_west---4a_d-04_east": RegionConnection("4a_d-04_west", "4a_d-04_east", []), + "4a_d-04_east---4a_d-04_west": RegionConnection("4a_d-04_east", "4a_d-04_west", []), + + "4a_d-05_west---4a_d-05_east": RegionConnection("4a_d-05_west", "4a_d-05_east", []), + "4a_d-05_east---4a_d-05_west": RegionConnection("4a_d-05_east", "4a_d-05_west", []), + + "4a_d-06_west---4a_d-06_east": RegionConnection("4a_d-06_west", "4a_d-06_east", [[ItemName.blue_boosters, ], ]), + "4a_d-06_east---4a_d-06_west": RegionConnection("4a_d-06_east", "4a_d-06_west", []), + + "4a_d-07_west---4a_d-07_east": RegionConnection("4a_d-07_west", "4a_d-07_east", [[ItemName.blue_boosters, ], ]), + "4a_d-07_east---4a_d-07_west": RegionConnection("4a_d-07_east", "4a_d-07_west", [[ItemName.blue_boosters, ], ]), + + "4a_d-08_west---4a_d-08_east": RegionConnection("4a_d-08_west", "4a_d-08_east", [[ItemName.blue_clouds, ItemName.blue_boosters, ], ]), + + "4a_d-09_west---4a_d-09_east": RegionConnection("4a_d-09_west", "4a_d-09_east", [[ItemName.blue_boosters, ], ]), + "4a_d-09_east---4a_d-09_west": RegionConnection("4a_d-09_east", "4a_d-09_west", [[ItemName.blue_boosters, ], ]), + + "4a_d-10_west---4a_d-10_goal": RegionConnection("4a_d-10_west", "4a_d-10_goal", []), + + "4b_a-00_west---4b_a-00_east": RegionConnection("4b_a-00_west", "4b_a-00_east", [[ItemName.blue_boosters, ], ]), + "4b_a-00_east---4b_a-00_west": RegionConnection("4b_a-00_east", "4b_a-00_west", [[ItemName.blue_boosters, ], ]), + + "4b_a-01_west---4b_a-01_east": RegionConnection("4b_a-01_west", "4b_a-01_east", [[ItemName.moving_platforms, ], ]), + "4b_a-01_east---4b_a-01_west": RegionConnection("4b_a-01_east", "4b_a-01_west", [[ItemName.moving_platforms, ], ]), + + "4b_a-02_west---4b_a-02_east": RegionConnection("4b_a-02_west", "4b_a-02_east", [[ItemName.blue_boosters, ], ]), + + "4b_a-03_west---4b_a-03_east": RegionConnection("4b_a-03_west", "4b_a-03_east", [[ItemName.springs, ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4b_a-04_west---4b_a-04_east": RegionConnection("4b_a-04_west", "4b_a-04_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4b_b-00_west---4b_b-00_east": RegionConnection("4b_b-00_west", "4b_b-00_east", [[ItemName.blue_boosters, ], ]), + + "4b_b-01_west---4b_b-01_east": RegionConnection("4b_b-01_west", "4b_b-01_east", [[ItemName.blue_boosters, ], ]), + "4b_b-01_east---4b_b-01_west": RegionConnection("4b_b-01_east", "4b_b-01_west", [[ItemName.cannot_access, ], ]), + + "4b_b-02_bottom---4b_b-02_top": RegionConnection("4b_b-02_bottom", "4b_b-02_top", [[ItemName.move_blocks, ItemName.springs, ItemName.dash_refills, ], ]), + "4b_b-02_top---4b_b-02_bottom": RegionConnection("4b_b-02_top", "4b_b-02_bottom", []), + + "4b_b-03_west---4b_b-03_east": RegionConnection("4b_b-03_west", "4b_b-03_east", [[ItemName.coins, ItemName.moving_platforms, ItemName.springs, ItemName.blue_boosters, ], ]), + + "4b_b-04_west---4b_b-04_east": RegionConnection("4b_b-04_west", "4b_b-04_east", [[ItemName.blue_boosters, ], ]), + + "4b_c-00_west---4b_c-00_east": RegionConnection("4b_c-00_west", "4b_c-00_east", [[ItemName.blue_boosters, ], ]), + + "4b_c-01_west---4b_c-01_east": RegionConnection("4b_c-01_west", "4b_c-01_east", [[ItemName.moving_platforms, ], ]), + "4b_c-01_east---4b_c-01_west": RegionConnection("4b_c-01_east", "4b_c-01_west", [[ItemName.cannot_access, ], ]), + + "4b_c-02_west---4b_c-02_east": RegionConnection("4b_c-02_west", "4b_c-02_east", [[ItemName.move_blocks, ], ]), + + "4b_c-03_bottom---4b_c-03_top": RegionConnection("4b_c-03_bottom", "4b_c-03_top", [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + "4b_c-03_top---4b_c-03_bottom": RegionConnection("4b_c-03_top", "4b_c-03_bottom", [[ItemName.blue_clouds, ], ]), + + "4b_c-04_west---4b_c-04_east": RegionConnection("4b_c-04_west", "4b_c-04_east", [[ItemName.blue_boosters, ], ]), + "4b_c-04_east---4b_c-04_west": RegionConnection("4b_c-04_east", "4b_c-04_west", []), + + "4b_d-00_west---4b_d-00_east": RegionConnection("4b_d-00_west", "4b_d-00_east", [[ItemName.blue_clouds, ], ]), + "4b_d-00_east---4b_d-00_west": RegionConnection("4b_d-00_east", "4b_d-00_west", [[ItemName.blue_clouds, ], ]), + + "4b_d-01_west---4b_d-01_east": RegionConnection("4b_d-01_west", "4b_d-01_east", [[ItemName.pink_clouds, ItemName.blue_boosters, ], ]), + "4b_d-01_east---4b_d-01_west": RegionConnection("4b_d-01_east", "4b_d-01_west", [[ItemName.cannot_access, ], ]), + + "4b_d-02_west---4b_d-02_east": RegionConnection("4b_d-02_west", "4b_d-02_east", [[ItemName.dash_refills, ItemName.blue_boosters, ItemName.coins, ], ]), + "4b_d-02_east---4b_d-02_west": RegionConnection("4b_d-02_east", "4b_d-02_west", [[ItemName.cannot_access, ], ]), + + "4b_d-03_west---4b_d-03_east": RegionConnection("4b_d-03_west", "4b_d-03_east", [[ItemName.blue_boosters, ], ]), + + "4b_end_west---4b_end_goal": RegionConnection("4b_end_west", "4b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.blue_boosters, ], ]), + + "4c_00_west---4c_00_east": RegionConnection("4c_00_west", "4c_00_east", [[ItemName.blue_boosters, ], ]), + + "4c_01_west---4c_01_east": RegionConnection("4c_01_west", "4c_01_east", [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "4c_01_east---4c_01_west": RegionConnection("4c_01_east", "4c_01_west", [[ItemName.cannot_access, ], ]), + + "4c_02_west---4c_02_goal": RegionConnection("4c_02_west", "4c_02_goal", [[ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ], ]), + + "5a_a-00b_west---5a_a-00b_east": RegionConnection("5a_a-00b_west", "5a_a-00b_east", []), + "5a_a-00b_east---5a_a-00b_west": RegionConnection("5a_a-00b_east", "5a_a-00b_west", []), + + + "5a_a-00d_west---5a_a-00d_east": RegionConnection("5a_a-00d_west", "5a_a-00d_east", []), + "5a_a-00d_east---5a_a-00d_west": RegionConnection("5a_a-00d_east", "5a_a-00d_west", []), + + "5a_a-00c_west---5a_a-00c_east": RegionConnection("5a_a-00c_west", "5a_a-00c_east", []), + "5a_a-00c_east---5a_a-00c_west": RegionConnection("5a_a-00c_east", "5a_a-00c_west", []), + + "5a_a-00_west---5a_a-00_east": RegionConnection("5a_a-00_west", "5a_a-00_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_a-01_west---5a_a-01_center": RegionConnection("5a_a-01_west", "5a_a-01_center", []), + "5a_a-01_center---5a_a-01_west": RegionConnection("5a_a-01_center", "5a_a-01_west", []), + "5a_a-01_center---5a_a-01_east": RegionConnection("5a_a-01_center", "5a_a-01_east", []), + "5a_a-01_center---5a_a-01_south-west": RegionConnection("5a_a-01_center", "5a_a-01_south-west", [[ItemName.swap_blocks, ], ]), + "5a_a-01_center---5a_a-01_south-east": RegionConnection("5a_a-01_center", "5a_a-01_south-east", [[ItemName.swap_blocks, ], ]), + "5a_a-01_center---5a_a-01_north": RegionConnection("5a_a-01_center", "5a_a-01_north", [[ItemName.red_boosters, ], ]), + "5a_a-01_east---5a_a-01_center": RegionConnection("5a_a-01_east", "5a_a-01_center", []), + "5a_a-01_south-west---5a_a-01_center": RegionConnection("5a_a-01_south-west", "5a_a-01_center", []), + "5a_a-01_south-east---5a_a-01_center": RegionConnection("5a_a-01_south-east", "5a_a-01_center", []), + "5a_a-01_north---5a_a-01_center": RegionConnection("5a_a-01_north", "5a_a-01_center", []), + + "5a_a-02_west---5a_a-02_north": RegionConnection("5a_a-02_west", "5a_a-02_north", []), + "5a_a-02_west---5a_a-02_south": RegionConnection("5a_a-02_west", "5a_a-02_south", []), + "5a_a-02_north---5a_a-02_west": RegionConnection("5a_a-02_north", "5a_a-02_west", []), + "5a_a-02_south---5a_a-02_west": RegionConnection("5a_a-02_south", "5a_a-02_west", []), + + "5a_a-03_west---5a_a-03_east": RegionConnection("5a_a-03_west", "5a_a-03_east", []), + "5a_a-03_east---5a_a-03_west": RegionConnection("5a_a-03_east", "5a_a-03_west", []), + + "5a_a-04_east---5a_a-04_north": RegionConnection("5a_a-04_east", "5a_a-04_north", []), + "5a_a-04_east---5a_a-04_south": RegionConnection("5a_a-04_east", "5a_a-04_south", []), + "5a_a-04_north---5a_a-04_east": RegionConnection("5a_a-04_north", "5a_a-04_east", []), + "5a_a-04_south---5a_a-04_east": RegionConnection("5a_a-04_south", "5a_a-04_east", []), + + "5a_a-05_north-west---5a_a-05_center": RegionConnection("5a_a-05_north-west", "5a_a-05_center", []), + "5a_a-05_center---5a_a-05_north-west": RegionConnection("5a_a-05_center", "5a_a-05_north-west", []), + "5a_a-05_center---5a_a-05_north-east": RegionConnection("5a_a-05_center", "5a_a-05_north-east", []), + "5a_a-05_center---5a_a-05_south-west": RegionConnection("5a_a-05_center", "5a_a-05_south-west", [[ItemName.swap_blocks, ], ]), + "5a_a-05_center---5a_a-05_south-east": RegionConnection("5a_a-05_center", "5a_a-05_south-east", [[ItemName.swap_blocks, ], ]), + "5a_a-05_north-east---5a_a-05_center": RegionConnection("5a_a-05_north-east", "5a_a-05_center", []), + "5a_a-05_south-west---5a_a-05_center": RegionConnection("5a_a-05_south-west", "5a_a-05_center", [[ItemName.dash_switches, ], ]), + "5a_a-05_south-east---5a_a-05_center": RegionConnection("5a_a-05_south-east", "5a_a-05_center", [[ItemName.dash_switches, ], ]), + + + + "5a_a-08_west---5a_a-08_center": RegionConnection("5a_a-08_west", "5a_a-08_center", []), + "5a_a-08_center---5a_a-08_west": RegionConnection("5a_a-08_center", "5a_a-08_west", []), + "5a_a-08_center---5a_a-08_north-east": RegionConnection("5a_a-08_center", "5a_a-08_north-east", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_a-08_center---5a_a-08_south": RegionConnection("5a_a-08_center", "5a_a-08_south", []), + "5a_a-08_center---5a_a-08_north": RegionConnection("5a_a-08_center", "5a_a-08_north", [[ItemName.swap_blocks, ], ]), + "5a_a-08_east---5a_a-08_south-east": RegionConnection("5a_a-08_east", "5a_a-08_south-east", []), + "5a_a-08_south---5a_a-08_center": RegionConnection("5a_a-08_south", "5a_a-08_center", []), + "5a_a-08_south-east---5a_a-08_center": RegionConnection("5a_a-08_south-east", "5a_a-08_center", [[ItemName.dash_switches, ], ]), + "5a_a-08_south-east---5a_a-08_east": RegionConnection("5a_a-08_south-east", "5a_a-08_east", []), + "5a_a-08_north-east---5a_a-08_center": RegionConnection("5a_a-08_north-east", "5a_a-08_center", []), + "5a_a-08_north---5a_a-08_center": RegionConnection("5a_a-08_north", "5a_a-08_center", []), + + "5a_a-10_west---5a_a-10_east": RegionConnection("5a_a-10_west", "5a_a-10_east", [[ItemName.swap_blocks, ], ]), + "5a_a-10_east---5a_a-10_west": RegionConnection("5a_a-10_east", "5a_a-10_west", [[ItemName.swap_blocks, ], ]), + + "5a_a-09_west---5a_a-09_east": RegionConnection("5a_a-09_west", "5a_a-09_east", [[ItemName.red_boosters, ], ]), + "5a_a-09_east---5a_a-09_west": RegionConnection("5a_a-09_east", "5a_a-09_west", [[ItemName.red_boosters, ], ]), + + + "5a_a-12_north-west---5a_a-12_west": RegionConnection("5a_a-12_north-west", "5a_a-12_west", [[ItemName.red_boosters, ], ]), + "5a_a-12_south-west---5a_a-12_east": RegionConnection("5a_a-12_south-west", "5a_a-12_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + + + "5a_a-13_west---5a_a-13_east": RegionConnection("5a_a-13_west", "5a_a-13_east", [["Mirror Temple A - Entrance Key", ], ]), + "5a_a-13_east---5a_a-13_west": RegionConnection("5a_a-13_east", "5a_a-13_west", [["Mirror Temple A - Entrance Key", ], ]), + + "5a_b-00_west---5a_b-00_east": RegionConnection("5a_b-00_west", "5a_b-00_east", [[ItemName.dash_switches, ], ]), + "5a_b-00_west---5a_b-00_north-west": RegionConnection("5a_b-00_west", "5a_b-00_north-west", []), + "5a_b-00_north-west---5a_b-00_west": RegionConnection("5a_b-00_north-west", "5a_b-00_west", []), + + + "5a_b-01_south-west---5a_b-01_center": RegionConnection("5a_b-01_south-west", "5a_b-01_center", []), + "5a_b-01_center---5a_b-01_south-west": RegionConnection("5a_b-01_center", "5a_b-01_south-west", []), + "5a_b-01_center---5a_b-01_west": RegionConnection("5a_b-01_center", "5a_b-01_west", [[ItemName.swap_blocks, ], ]), + "5a_b-01_center---5a_b-01_north-west": RegionConnection("5a_b-01_center", "5a_b-01_north-west", []), + "5a_b-01_center---5a_b-01_north": RegionConnection("5a_b-01_center", "5a_b-01_north", []), + "5a_b-01_center---5a_b-01_north-east": RegionConnection("5a_b-01_center", "5a_b-01_north-east", []), + "5a_b-01_center---5a_b-01_east": RegionConnection("5a_b-01_center", "5a_b-01_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01_center---5a_b-01_south-east": RegionConnection("5a_b-01_center", "5a_b-01_south-east", []), + "5a_b-01_center---5a_b-01_south": RegionConnection("5a_b-01_center", "5a_b-01_south", []), + "5a_b-01_west---5a_b-01_center": RegionConnection("5a_b-01_west", "5a_b-01_center", [[ItemName.swap_blocks, ], ]), + "5a_b-01_north-west---5a_b-01_center": RegionConnection("5a_b-01_north-west", "5a_b-01_center", []), + "5a_b-01_north---5a_b-01_center": RegionConnection("5a_b-01_north", "5a_b-01_center", []), + "5a_b-01_north-east---5a_b-01_center": RegionConnection("5a_b-01_north-east", "5a_b-01_center", []), + "5a_b-01_east---5a_b-01_center": RegionConnection("5a_b-01_east", "5a_b-01_center", []), + "5a_b-01_south-east---5a_b-01_center": RegionConnection("5a_b-01_south-east", "5a_b-01_center", []), + "5a_b-01_south---5a_b-01_center": RegionConnection("5a_b-01_south", "5a_b-01_center", []), + + "5a_b-01c_west---5a_b-01c_east": RegionConnection("5a_b-01c_west", "5a_b-01c_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01c_east---5a_b-01c_west": RegionConnection("5a_b-01c_east", "5a_b-01c_west", [[ItemName.cannot_access, ], ]), + + "5a_b-20_north-west---5a_b-20_west": RegionConnection("5a_b-20_north-west", "5a_b-20_west", []), + "5a_b-20_west---5a_b-20_north-west": RegionConnection("5a_b-20_west", "5a_b-20_north-west", []), + "5a_b-20_west---5a_b-20_south-west": RegionConnection("5a_b-20_west", "5a_b-20_south-west", []), + "5a_b-20_south-west---5a_b-20_west": RegionConnection("5a_b-20_south-west", "5a_b-20_west", []), + + + "5a_b-01b_west---5a_b-01b_east": RegionConnection("5a_b-01b_west", "5a_b-01b_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01b_east---5a_b-01b_west": RegionConnection("5a_b-01b_east", "5a_b-01b_west", [[ItemName.swap_blocks, ], ]), + + "5a_b-02_center---5a_b-02_west": RegionConnection("5a_b-02_center", "5a_b-02_west", []), + "5a_b-02_center---5a_b-02_north-west": RegionConnection("5a_b-02_center", "5a_b-02_north-west", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_north": RegionConnection("5a_b-02_center", "5a_b-02_north", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_north-east": RegionConnection("5a_b-02_center", "5a_b-02_north-east", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_east-upper": RegionConnection("5a_b-02_center", "5a_b-02_east-upper", []), + "5a_b-02_center---5a_b-02_east-lower": RegionConnection("5a_b-02_center", "5a_b-02_east-lower", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_south-east": RegionConnection("5a_b-02_center", "5a_b-02_south-east", []), + "5a_b-02_center---5a_b-02_south": RegionConnection("5a_b-02_center", "5a_b-02_south", []), + "5a_b-02_west---5a_b-02_center": RegionConnection("5a_b-02_west", "5a_b-02_center", []), + "5a_b-02_north-west---5a_b-02_center": RegionConnection("5a_b-02_north-west", "5a_b-02_center", []), + "5a_b-02_north---5a_b-02_center": RegionConnection("5a_b-02_north", "5a_b-02_center", []), + "5a_b-02_north-east---5a_b-02_center": RegionConnection("5a_b-02_north-east", "5a_b-02_center", []), + "5a_b-02_east-upper---5a_b-02_center": RegionConnection("5a_b-02_east-upper", "5a_b-02_center", []), + "5a_b-02_east-lower---5a_b-02_center": RegionConnection("5a_b-02_east-lower", "5a_b-02_center", []), + "5a_b-02_south-east---5a_b-02_center": RegionConnection("5a_b-02_south-east", "5a_b-02_center", []), + "5a_b-02_south---5a_b-02_center": RegionConnection("5a_b-02_south", "5a_b-02_center", []), + + + + "5a_b-04_west---5a_b-04_south": RegionConnection("5a_b-04_west", "5a_b-04_south", []), + "5a_b-04_east---5a_b-04_south": RegionConnection("5a_b-04_east", "5a_b-04_south", []), + "5a_b-04_south---5a_b-04_west": RegionConnection("5a_b-04_south", "5a_b-04_west", []), + + "5a_b-07_north---5a_b-07_south": RegionConnection("5a_b-07_north", "5a_b-07_south", []), + "5a_b-07_south---5a_b-07_north": RegionConnection("5a_b-07_south", "5a_b-07_north", [[ItemName.dash_refills, ], ]), + + "5a_b-08_west---5a_b-08_east": RegionConnection("5a_b-08_west", "5a_b-08_east", [[ItemName.dash_refills, ], ]), + "5a_b-08_east---5a_b-08_west": RegionConnection("5a_b-08_east", "5a_b-08_west", [[ItemName.cannot_access, ], ]), + + "5a_b-09_north---5a_b-09_south": RegionConnection("5a_b-09_north", "5a_b-09_south", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + "5a_b-09_south---5a_b-09_north": RegionConnection("5a_b-09_south", "5a_b-09_north", [[ItemName.cannot_access, ], ]), + + + "5a_b-11_north-west---5a_b-11_west": RegionConnection("5a_b-11_north-west", "5a_b-11_west", []), + "5a_b-11_north-west---5a_b-11_east": RegionConnection("5a_b-11_north-west", "5a_b-11_east", [[ItemName.dash_switches, ], ]), + "5a_b-11_west---5a_b-11_south-west": RegionConnection("5a_b-11_west", "5a_b-11_south-west", []), + "5a_b-11_south-west---5a_b-11_west": RegionConnection("5a_b-11_south-west", "5a_b-11_west", []), + "5a_b-11_south-west---5a_b-11_south-east": RegionConnection("5a_b-11_south-west", "5a_b-11_south-east", []), + "5a_b-11_south-east---5a_b-11_south-west": RegionConnection("5a_b-11_south-east", "5a_b-11_south-west", []), + "5a_b-11_east---5a_b-11_west": RegionConnection("5a_b-11_east", "5a_b-11_west", [[ItemName.cannot_access, ], ]), + + "5a_b-12_west---5a_b-12_east": RegionConnection("5a_b-12_west", "5a_b-12_east", []), + "5a_b-12_east---5a_b-12_west": RegionConnection("5a_b-12_east", "5a_b-12_west", []), + + "5a_b-13_west---5a_b-13_north-east": RegionConnection("5a_b-13_west", "5a_b-13_north-east", [[ItemName.swap_blocks, ], ]), + "5a_b-13_west---5a_b-13_east": RegionConnection("5a_b-13_west", "5a_b-13_east", [[ItemName.dash_switches, ItemName.swap_blocks, ], ]), + "5a_b-13_north-east---5a_b-13_west": RegionConnection("5a_b-13_north-east", "5a_b-13_west", []), + + "5a_b-17_west---5a_b-17_east": RegionConnection("5a_b-17_west", "5a_b-17_east", []), + "5a_b-17_east---5a_b-17_west": RegionConnection("5a_b-17_east", "5a_b-17_west", []), + + + "5a_b-06_west---5a_b-06_north-east": RegionConnection("5a_b-06_west", "5a_b-06_north-east", [[ItemName.red_boosters, ], ]), + "5a_b-06_west---5a_b-06_east": RegionConnection("5a_b-06_west", "5a_b-06_east", [[ItemName.red_boosters, "Mirror Temple A - Depths Key", ], ]), + "5a_b-06_east---5a_b-06_west": RegionConnection("5a_b-06_east", "5a_b-06_west", [[ItemName.red_boosters, "Mirror Temple A - Depths Key", ], ]), + + "5a_b-19_west---5a_b-19_north-west": RegionConnection("5a_b-19_west", "5a_b-19_north-west", []), + "5a_b-19_west---5a_b-19_east": RegionConnection("5a_b-19_west", "5a_b-19_east", [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-19_north-west---5a_b-19_west": RegionConnection("5a_b-19_north-west", "5a_b-19_west", []), + + "5a_b-14_west---5a_b-14_north": RegionConnection("5a_b-14_west", "5a_b-14_north", []), + "5a_b-14_west---5a_b-14_south": RegionConnection("5a_b-14_west", "5a_b-14_south", [["Mirror Temple A - Depths Key", ], ]), + "5a_b-14_south---5a_b-14_west": RegionConnection("5a_b-14_south", "5a_b-14_west", [["Mirror Temple A - Depths Key", ], ]), + "5a_b-14_north---5a_b-14_west": RegionConnection("5a_b-14_north", "5a_b-14_west", []), + + + "5a_b-16_bottom---5a_b-16_mirror": RegionConnection("5a_b-16_bottom", "5a_b-16_mirror", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_void_east---5a_void_west": RegionConnection("5a_void_east", "5a_void_west", []), + "5a_void_west---5a_void_east": RegionConnection("5a_void_west", "5a_void_east", []), + + "5a_c-00_top---5a_c-00_bottom": RegionConnection("5a_c-00_top", "5a_c-00_bottom", []), + + "5a_c-01_west---5a_c-01_east": RegionConnection("5a_c-01_west", "5a_c-01_east", []), + "5a_c-01_east---5a_c-01_west": RegionConnection("5a_c-01_east", "5a_c-01_west", []), + + "5a_c-01b_west---5a_c-01b_east": RegionConnection("5a_c-01b_west", "5a_c-01b_east", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_c-01c_west---5a_c-01c_east": RegionConnection("5a_c-01c_west", "5a_c-01c_east", [[ItemName.swap_blocks, ItemName.red_boosters, ], ]), + + "5a_c-08b_west---5a_c-08b_east": RegionConnection("5a_c-08b_west", "5a_c-08b_east", [[ItemName.dash_switches, ], ]), + + "5a_c-08_west---5a_c-08_east": RegionConnection("5a_c-08_west", "5a_c-08_east", []), + + "5a_c-10_west---5a_c-10_east": RegionConnection("5a_c-10_west", "5a_c-10_east", [[ItemName.coins, ], ]), + + "5a_c-12_west---5a_c-12_east": RegionConnection("5a_c-12_west", "5a_c-12_east", [[ItemName.coins, ], ]), + + "5a_c-07_west---5a_c-07_east": RegionConnection("5a_c-07_west", "5a_c-07_east", [[ItemName.coins, ], ]), + + "5a_c-11_west---5a_c-11_east": RegionConnection("5a_c-11_west", "5a_c-11_east", []), + "5a_c-11_east---5a_c-11_east": RegionConnection("5a_c-11_east", "5a_c-11_east", []), + + "5a_c-09_west---5a_c-09_east": RegionConnection("5a_c-09_west", "5a_c-09_east", [[ItemName.coins, ], ]), + + "5a_c-13_west---5a_c-13_east": RegionConnection("5a_c-13_west", "5a_c-13_east", [[ItemName.coins, ], ]), + + "5a_d-00_south---5a_d-00_north": RegionConnection("5a_d-00_south", "5a_d-00_north", [[ItemName.red_boosters, ], ]), + "5a_d-00_east---5a_d-00_west": RegionConnection("5a_d-00_east", "5a_d-00_west", [[ItemName.red_boosters, ], ]), + + "5a_d-01_south---5a_d-01_center": RegionConnection("5a_d-01_south", "5a_d-01_center", []), + "5a_d-01_center---5a_d-01_south": RegionConnection("5a_d-01_center", "5a_d-01_south", []), + "5a_d-01_center---5a_d-01_south-east-down": RegionConnection("5a_d-01_center", "5a_d-01_south-east-down", []), + "5a_d-01_center---5a_d-01_west": RegionConnection("5a_d-01_center", "5a_d-01_west", []), + "5a_d-01_center---5a_d-01_east": RegionConnection("5a_d-01_center", "5a_d-01_east", []), + "5a_d-01_center---5a_d-01_north-west": RegionConnection("5a_d-01_center", "5a_d-01_north-west", []), + "5a_d-01_center---5a_d-01_north-east": RegionConnection("5a_d-01_center", "5a_d-01_north-east", []), + "5a_d-01_south-west-left---5a_d-01_south-west-down": RegionConnection("5a_d-01_south-west-left", "5a_d-01_south-west-down", []), + "5a_d-01_south-west-down---5a_d-01_center": RegionConnection("5a_d-01_south-west-down", "5a_d-01_center", []), + "5a_d-01_south-west-down---5a_d-01_south-west-left": RegionConnection("5a_d-01_south-west-down", "5a_d-01_south-west-left", []), + "5a_d-01_south-east-right---5a_d-01_south-east-down": RegionConnection("5a_d-01_south-east-right", "5a_d-01_south-east-down", []), + "5a_d-01_south-east-down---5a_d-01_center": RegionConnection("5a_d-01_south-east-down", "5a_d-01_center", []), + "5a_d-01_south-east-down---5a_d-01_south-east-right": RegionConnection("5a_d-01_south-east-down", "5a_d-01_south-east-right", [[ItemName.seekers, ], ]), + "5a_d-01_west---5a_d-01_center": RegionConnection("5a_d-01_west", "5a_d-01_center", []), + "5a_d-01_east---5a_d-01_center": RegionConnection("5a_d-01_east", "5a_d-01_center", []), + "5a_d-01_north-west---5a_d-01_center": RegionConnection("5a_d-01_north-west", "5a_d-01_center", []), + "5a_d-01_north-east---5a_d-01_center": RegionConnection("5a_d-01_north-east", "5a_d-01_center", []), + + "5a_d-09_east---5a_d-09_west": RegionConnection("5a_d-09_east", "5a_d-09_west", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.swap_blocks, ], ]), + + "5a_d-04_east---5a_d-04_west": RegionConnection("5a_d-04_east", "5a_d-04_west", [[ItemName.red_boosters, "Mirror Temple A - Search Key 1", "Mirror Temple A - Search Key 2", ], ]), + "5a_d-04_east---5a_d-04_south-east": RegionConnection("5a_d-04_east", "5a_d-04_south-east", []), + "5a_d-04_south-west-left---5a_d-04_east": RegionConnection("5a_d-04_south-west-left", "5a_d-04_east", []), + "5a_d-04_south-west-right---5a_d-04_east": RegionConnection("5a_d-04_south-west-right", "5a_d-04_east", []), + "5a_d-04_north---5a_d-04_east": RegionConnection("5a_d-04_north", "5a_d-04_east", []), + + "5a_d-05_north---5a_d-05_west": RegionConnection("5a_d-05_north", "5a_d-05_west", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-05_east---5a_d-05_south": RegionConnection("5a_d-05_east", "5a_d-05_south", []), + "5a_d-05_south---5a_d-05_east": RegionConnection("5a_d-05_south", "5a_d-05_east", []), + + "5a_d-06_south-east---5a_d-06_north-east": RegionConnection("5a_d-06_south-east", "5a_d-06_north-east", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-06_south-west---5a_d-06_north-west": RegionConnection("5a_d-06_south-west", "5a_d-06_north-west", [[ItemName.springs, ], ]), + "5a_d-06_north-west---5a_d-06_south-west": RegionConnection("5a_d-06_north-west", "5a_d-06_south-west", []), + + "5a_d-07_north---5a_d-07_west": RegionConnection("5a_d-07_north", "5a_d-07_west", [[ItemName.coins, ], ]), + + "5a_d-02_east---5a_d-02_west": RegionConnection("5a_d-02_east", "5a_d-02_west", [[ItemName.springs, ], [ItemName.seekers, ], ]), + + "5a_d-03_east---5a_d-03_west": RegionConnection("5a_d-03_east", "5a_d-03_west", [[ItemName.coins, ItemName.seekers, ], ]), + + "5a_d-15_north-west---5a_d-15_center": RegionConnection("5a_d-15_north-west", "5a_d-15_center", []), + "5a_d-15_center---5a_d-15_north-west": RegionConnection("5a_d-15_center", "5a_d-15_north-west", []), + "5a_d-15_center---5a_d-15_south-west": RegionConnection("5a_d-15_center", "5a_d-15_south-west", []), + "5a_d-15_center---5a_d-15_south-east": RegionConnection("5a_d-15_center", "5a_d-15_south-east", []), + "5a_d-15_south-west---5a_d-15_center": RegionConnection("5a_d-15_south-west", "5a_d-15_center", []), + "5a_d-15_south---5a_d-15_center": RegionConnection("5a_d-15_south", "5a_d-15_center", []), + + "5a_d-13_east---5a_d-13_west": RegionConnection("5a_d-13_east", "5a_d-13_west", []), + "5a_d-13_west---5a_d-13_west": RegionConnection("5a_d-13_west", "5a_d-13_west", []), + + "5a_d-19b_south-east-right---5a_d-19b_south-east-down": RegionConnection("5a_d-19b_south-east-right", "5a_d-19b_south-east-down", []), + "5a_d-19b_south-east-down---5a_d-19b_south-east-right": RegionConnection("5a_d-19b_south-east-down", "5a_d-19b_south-east-right", []), + "5a_d-19b_south-west---5a_d-19b_north-east": RegionConnection("5a_d-19b_south-west", "5a_d-19b_north-east", []), + "5a_d-19b_north-east---5a_d-19b_south-west": RegionConnection("5a_d-19b_north-east", "5a_d-19b_south-west", []), + + "5a_d-19_east---5a_d-19_west": RegionConnection("5a_d-19_east", "5a_d-19_west", [[ItemName.swap_blocks, ItemName.springs, ], ]), + + "5a_d-10_west---5a_d-10_east": RegionConnection("5a_d-10_west", "5a_d-10_east", [[ItemName.dash_refills, ], ]), + + "5a_d-20_west---5a_d-20_east": RegionConnection("5a_d-20_west", "5a_d-20_east", [[ItemName.seekers, ItemName.coins, ], ]), + + "5a_e-00_west---5a_e-00_east": RegionConnection("5a_e-00_west", "5a_e-00_east", [[ItemName.theo_crystal, ], ]), + + "5a_e-01_west---5a_e-01_east": RegionConnection("5a_e-01_west", "5a_e-01_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-02_west---5a_e-02_east": RegionConnection("5a_e-02_west", "5a_e-02_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-03_west---5a_e-03_east": RegionConnection("5a_e-03_west", "5a_e-03_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-04_west---5a_e-04_east": RegionConnection("5a_e-04_west", "5a_e-04_east", [[ItemName.theo_crystal, ItemName.coins, ], ]), + + "5a_e-06_west---5a_e-06_east": RegionConnection("5a_e-06_west", "5a_e-06_east", [[ItemName.theo_crystal, ItemName.dash_switches, ItemName.springs, ], ]), + + "5a_e-05_west---5a_e-05_east": RegionConnection("5a_e-05_west", "5a_e-05_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ItemName.coins, ], ]), + + "5a_e-07_west---5a_e-07_east": RegionConnection("5a_e-07_west", "5a_e-07_east", [[ItemName.theo_crystal, ], ]), + + "5a_e-08_west---5a_e-08_east": RegionConnection("5a_e-08_west", "5a_e-08_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ], ]), + + "5a_e-09_west---5a_e-09_east": RegionConnection("5a_e-09_west", "5a_e-09_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ], ]), + + "5a_e-10_west---5a_e-10_east": RegionConnection("5a_e-10_west", "5a_e-10_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ItemName.springs, ItemName.dash_switches, ], ]), + + "5a_e-11_west---5a_e-11_goal": RegionConnection("5a_e-11_west", "5a_e-11_goal", [[ItemName.theo_crystal, ], ]), + + "5b_start_west---5b_start_east": RegionConnection("5b_start_west", "5b_start_east", []), + "5b_start_east---5b_start_west": RegionConnection("5b_start_east", "5b_start_west", []), + + "5b_a-00_west---5b_a-00_east": RegionConnection("5b_a-00_west", "5b_a-00_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5b_a-01_west---5b_a-01_east": RegionConnection("5b_a-01_west", "5b_a-01_east", [[ItemName.red_boosters, ], ]), + + "5b_a-02_west---5b_a-02_east": RegionConnection("5b_a-02_west", "5b_a-02_east", [[ItemName.swap_blocks, ], ]), + + "5b_b-00_south---5b_b-00_west": RegionConnection("5b_b-00_south", "5b_b-00_west", [["Mirror Temple B - Central Chamber Key 2", ], ]), + "5b_b-00_south---5b_b-00_north": RegionConnection("5b_b-00_south", "5b_b-00_north", []), + "5b_b-00_south---5b_b-00_east": RegionConnection("5b_b-00_south", "5b_b-00_east", []), + "5b_b-00_west---5b_b-00_south": RegionConnection("5b_b-00_west", "5b_b-00_south", []), + "5b_b-00_north---5b_b-00_south": RegionConnection("5b_b-00_north", "5b_b-00_south", []), + "5b_b-00_east---5b_b-00_south": RegionConnection("5b_b-00_east", "5b_b-00_south", []), + + "5b_b-01_west---5b_b-01_north": RegionConnection("5b_b-01_west", "5b_b-01_north", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5b_b-01_west---5b_b-01_east": RegionConnection("5b_b-01_west", "5b_b-01_east", [[ItemName.red_boosters, "Mirror Temple B - Central Chamber Key 2", ], ]), + + "5b_b-04_east---5b_b-04_west": RegionConnection("5b_b-04_east", "5b_b-04_west", [[ItemName.swap_blocks, ItemName.dash_refills, ItemName.red_boosters, ], ]), + + "5b_b-02_south---5b_b-02_center": RegionConnection("5b_b-02_south", "5b_b-02_center", []), + "5b_b-02_center---5b_b-02_south": RegionConnection("5b_b-02_center", "5b_b-02_south", []), + "5b_b-02_center---5b_b-02_north": RegionConnection("5b_b-02_center", "5b_b-02_north", [[ItemName.red_boosters, "Mirror Temple B - Central Chamber Key 1", ], ]), + "5b_b-02_center---5b_b-02_north-west": RegionConnection("5b_b-02_center", "5b_b-02_north-west", []), + "5b_b-02_center---5b_b-02_north-east": RegionConnection("5b_b-02_center", "5b_b-02_north-east", []), + "5b_b-02_north-west---5b_b-02_center": RegionConnection("5b_b-02_north-west", "5b_b-02_center", []), + "5b_b-02_north-east---5b_b-02_center": RegionConnection("5b_b-02_north-east", "5b_b-02_center", []), + "5b_b-02_north---5b_b-02_center": RegionConnection("5b_b-02_north", "5b_b-02_center", []), + "5b_b-02_south-west---5b_b-02_center": RegionConnection("5b_b-02_south-west", "5b_b-02_center", []), + "5b_b-02_south-east---5b_b-02_center": RegionConnection("5b_b-02_south-east", "5b_b-02_center", []), + + "5b_b-05_north---5b_b-05_south": RegionConnection("5b_b-05_north", "5b_b-05_south", [[ItemName.swap_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + + "5b_b-07_south---5b_b-07_north": RegionConnection("5b_b-07_south", "5b_b-07_north", [[ItemName.swap_blocks, ], ]), + + "5b_b-03_main---5b_b-03_north": RegionConnection("5b_b-03_main", "5b_b-03_north", [[ItemName.red_boosters, ItemName.dash_switches, "Mirror Temple B - Central Chamber Key 1", ], ]), + "5b_b-03_main---5b_b-03_west": RegionConnection("5b_b-03_main", "5b_b-03_west", [[ItemName.dash_switches, ], ]), + "5b_b-03_north---5b_b-03_main": RegionConnection("5b_b-03_north", "5b_b-03_main", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + "5b_b-03_east---5b_b-03_main": RegionConnection("5b_b-03_east", "5b_b-03_main", [[ItemName.red_boosters, ], ]), + + "5b_b-08_east---5b_b-08_south": RegionConnection("5b_b-08_east", "5b_b-08_south", [[ItemName.swap_blocks, ItemName.springs, ], ]), + "5b_b-08_east---5b_b-08_north": RegionConnection("5b_b-08_east", "5b_b-08_north", [[ItemName.dash_switches, ItemName.swap_blocks, ItemName.springs, "Mirror Temple B - Central Chamber Key 1", ], ]), + + "5b_b-09_bottom---5b_b-09_mirror": RegionConnection("5b_b-09_bottom", "5b_b-09_mirror", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5b_c-00_mirror---5b_c-00_bottom": RegionConnection("5b_c-00_mirror", "5b_c-00_bottom", [[ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "5b_c-01_west---5b_c-01_east": RegionConnection("5b_c-01_west", "5b_c-01_east", [[ItemName.seekers, ItemName.coins, ], ]), + + "5b_c-02_west---5b_c-02_east": RegionConnection("5b_c-02_west", "5b_c-02_east", [[ItemName.seekers, ItemName.dash_switches, ItemName.dash_refills, ], ]), + + "5b_c-03_west---5b_c-03_east": RegionConnection("5b_c-03_west", "5b_c-03_east", [[ItemName.seekers, ItemName.red_boosters, ], ]), + + "5b_c-04_west---5b_c-04_east": RegionConnection("5b_c-04_west", "5b_c-04_east", [[ItemName.seekers, ], ]), + + "5b_d-00_west---5b_d-00_east": RegionConnection("5b_d-00_west", "5b_d-00_east", [[ItemName.theo_crystal, ], ]), + + "5b_d-01_west---5b_d-01_east": RegionConnection("5b_d-01_west", "5b_d-01_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_switches, ], ]), + + "5b_d-02_west---5b_d-02_east": RegionConnection("5b_d-02_west", "5b_d-02_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_switches, ItemName.seekers, ], ]), + + "5b_d-03_west---5b_d-03_east": RegionConnection("5b_d-03_west", "5b_d-03_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.swap_blocks, ItemName.coins, ], ]), + + "5b_d-04_west---5b_d-04_east": RegionConnection("5b_d-04_west", "5b_d-04_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_refills, ], ]), + + "5b_d-05_west---5b_d-05_goal": RegionConnection("5b_d-05_west", "5b_d-05_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.springs, ItemName.swap_blocks, ], ]), + + "5c_00_west---5c_00_east": RegionConnection("5c_00_west", "5c_00_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5c_00_east---5c_00_west": RegionConnection("5c_00_east", "5c_00_west", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "5c_01_west---5c_01_east": RegionConnection("5c_01_west", "5c_01_east", [[ItemName.swap_blocks, ], ]), + "5c_01_east---5c_01_west": RegionConnection("5c_01_east", "5c_01_west", [[ItemName.cannot_access, ], ]), + + "5c_02_west---5c_02_goal": RegionConnection("5c_02_west", "5c_02_goal", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "6a_00_west---6a_00_east": RegionConnection("6a_00_west", "6a_00_east", []), + "6a_00_east---6a_00_west": RegionConnection("6a_00_east", "6a_00_west", [[ItemName.kevin_blocks, ], ]), + + "6a_01_bottom---6a_01_top": RegionConnection("6a_01_bottom", "6a_01_top", [[ItemName.feathers, ], ]), + "6a_01_top---6a_01_bottom": RegionConnection("6a_01_top", "6a_01_bottom", []), + + "6a_02_bottom---6a_02_bottom-west": RegionConnection("6a_02_bottom", "6a_02_bottom-west", [[ItemName.feathers, ], ]), + "6a_02_top-west---6a_02_top": RegionConnection("6a_02_top-west", "6a_02_top", [[ItemName.feathers, ], ]), + "6a_02_top---6a_02_top-west": RegionConnection("6a_02_top", "6a_02_top-west", [[ItemName.feathers, ], ]), + + "6a_03_bottom---6a_03_top": RegionConnection("6a_03_bottom", "6a_03_top", [[ItemName.feathers, ], ]), + + "6a_02b_bottom---6a_02b_top": RegionConnection("6a_02b_bottom", "6a_02b_top", [[ItemName.kevin_blocks, ], ]), + + "6a_04_south---6a_04_south-west": RegionConnection("6a_04_south", "6a_04_south-west", [[ItemName.kevin_blocks, ], ]), + "6a_04_south---6a_04_south-east": RegionConnection("6a_04_south", "6a_04_south-east", []), + "6a_04_south-west---6a_04_south": RegionConnection("6a_04_south-west", "6a_04_south", []), + "6a_04_south-west---6a_04_east": RegionConnection("6a_04_south-west", "6a_04_east", [[ItemName.feathers, ], ]), + "6a_04_south-east---6a_04_south": RegionConnection("6a_04_south-east", "6a_04_south", []), + "6a_04_east---6a_04_south": RegionConnection("6a_04_east", "6a_04_south", []), + "6a_04_east---6a_04_north-west": RegionConnection("6a_04_east", "6a_04_north-west", [[ItemName.feathers, ], ]), + "6a_04_north-west---6a_04_south": RegionConnection("6a_04_north-west", "6a_04_south", []), + + "6a_04b_west---6a_04b_east": RegionConnection("6a_04b_west", "6a_04b_east", []), + "6a_04b_east---6a_04b_west": RegionConnection("6a_04b_east", "6a_04b_west", []), + + + + + "6a_05_west---6a_05_east": RegionConnection("6a_05_west", "6a_05_east", [[ItemName.kevin_blocks, ], ]), + + "6a_06_west---6a_06_east": RegionConnection("6a_06_west", "6a_06_east", [[ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6a_07_west---6a_07_east": RegionConnection("6a_07_west", "6a_07_east", []), + "6a_07_west---6a_07_north-east": RegionConnection("6a_07_west", "6a_07_north-east", []), + "6a_07_east---6a_07_west": RegionConnection("6a_07_east", "6a_07_west", []), + "6a_07_north-east---6a_07_west": RegionConnection("6a_07_north-east", "6a_07_west", []), + + "6a_08a_west---6a_08a_east": RegionConnection("6a_08a_west", "6a_08a_east", [[ItemName.kevin_blocks, ItemName.dash_refills, ], ]), + + "6a_08b_west---6a_08b_east": RegionConnection("6a_08b_west", "6a_08b_east", [[ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6a_09_west---6a_09_north-west": RegionConnection("6a_09_west", "6a_09_north-west", []), + "6a_09_north-west---6a_09_north-east": RegionConnection("6a_09_north-west", "6a_09_north-east", []), + "6a_09_east---6a_09_west": RegionConnection("6a_09_east", "6a_09_west", []), + "6a_09_north-east---6a_09_east": RegionConnection("6a_09_north-east", "6a_09_east", []), + + "6a_10a_west---6a_10a_east": RegionConnection("6a_10a_west", "6a_10a_east", [[ItemName.dash_refills, ], ]), + "6a_10a_east---6a_10a_east": RegionConnection("6a_10a_east", "6a_10a_east", [[ItemName.cannot_access, ], ]), + + "6a_10b_west---6a_10b_east": RegionConnection("6a_10b_west", "6a_10b_east", [[ItemName.bumpers, ], ]), + "6a_10b_east---6a_10b_west": RegionConnection("6a_10b_east", "6a_10b_west", [[ItemName.bumpers, ], ]), + + "6a_11_west---6a_11_north-west": RegionConnection("6a_11_west", "6a_11_north-west", [[ItemName.bumpers, ], ]), + "6a_11_north-west---6a_11_north-east": RegionConnection("6a_11_north-west", "6a_11_north-east", [[ItemName.bumpers, ], ]), + "6a_11_east---6a_11_north-east": RegionConnection("6a_11_east", "6a_11_north-east", []), + "6a_11_north-east---6a_11_north-west": RegionConnection("6a_11_north-east", "6a_11_north-west", []), + "6a_11_north-east---6a_11_east": RegionConnection("6a_11_north-east", "6a_11_east", []), + + "6a_12a_west---6a_12a_east": RegionConnection("6a_12a_west", "6a_12a_east", [[ItemName.feathers, ], ]), + + "6a_12b_west---6a_12b_east": RegionConnection("6a_12b_west", "6a_12b_east", [[ItemName.kevin_blocks, ItemName.bumpers, ], ]), + "6a_12b_east---6a_12b_west": RegionConnection("6a_12b_east", "6a_12b_west", [[ItemName.bumpers, ], ]), + + "6a_13_west---6a_13_north-west": RegionConnection("6a_13_west", "6a_13_north-west", []), + "6a_13_north-west---6a_13_east": RegionConnection("6a_13_north-west", "6a_13_east", []), + "6a_13_north-west---6a_13_north-east": RegionConnection("6a_13_north-west", "6a_13_north-east", []), + "6a_13_east---6a_13_north-east": RegionConnection("6a_13_east", "6a_13_north-east", []), + "6a_13_north-east---6a_13_north-west": RegionConnection("6a_13_north-east", "6a_13_north-west", []), + "6a_13_north-east---6a_13_east": RegionConnection("6a_13_north-east", "6a_13_east", []), + + "6a_14a_west---6a_14a_east": RegionConnection("6a_14a_west", "6a_14a_east", [[ItemName.bumpers, ItemName.dash_refills, ], ]), + + "6a_14b_west---6a_14b_east": RegionConnection("6a_14b_west", "6a_14b_east", [[ItemName.springs, ItemName.coins, ItemName.bumpers, ], ]), + + "6a_15_west---6a_15_north-west": RegionConnection("6a_15_west", "6a_15_north-west", []), + "6a_15_north-west---6a_15_east": RegionConnection("6a_15_north-west", "6a_15_east", []), + "6a_15_north-west---6a_15_north-east": RegionConnection("6a_15_north-west", "6a_15_north-east", []), + "6a_15_east---6a_15_north-east": RegionConnection("6a_15_east", "6a_15_north-east", []), + "6a_15_north-east---6a_15_north-west": RegionConnection("6a_15_north-east", "6a_15_north-west", []), + "6a_15_north-east---6a_15_east": RegionConnection("6a_15_north-east", "6a_15_east", []), + + "6a_16a_west---6a_16a_east": RegionConnection("6a_16a_west", "6a_16a_east", [[ItemName.feathers, ], ]), + + "6a_16b_west---6a_16b_east": RegionConnection("6a_16b_west", "6a_16b_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6a_17_west---6a_17_north-west": RegionConnection("6a_17_west", "6a_17_north-west", []), + "6a_17_north-west---6a_17_east": RegionConnection("6a_17_north-west", "6a_17_east", []), + "6a_17_north-west---6a_17_north-east": RegionConnection("6a_17_north-west", "6a_17_north-east", [[ItemName.kevin_blocks, ], ]), + "6a_17_east---6a_17_north-east": RegionConnection("6a_17_east", "6a_17_north-east", []), + "6a_17_north-east---6a_17_north-west": RegionConnection("6a_17_north-east", "6a_17_north-west", [[ItemName.cannot_access, ], ]), + "6a_17_north-east---6a_17_east": RegionConnection("6a_17_north-east", "6a_17_east", []), + + "6a_18a_west---6a_18a_east": RegionConnection("6a_18a_west", "6a_18a_east", [[ItemName.bumpers, ItemName.feathers, ], ]), + + "6a_18b_west---6a_18b_east": RegionConnection("6a_18b_west", "6a_18b_east", [[ItemName.bumpers, ], ]), + + "6a_19_west---6a_19_north-west": RegionConnection("6a_19_west", "6a_19_north-west", []), + "6a_19_west---6a_19_east": RegionConnection("6a_19_west", "6a_19_east", [[ItemName.feathers, ], ]), + "6a_19_north-west---6a_19_west": RegionConnection("6a_19_north-west", "6a_19_west", [[ItemName.feathers, ], ]), + "6a_19_north-west---6a_19_east": RegionConnection("6a_19_north-west", "6a_19_east", []), + + "6a_20_west---6a_20_east": RegionConnection("6a_20_west", "6a_20_east", [[ItemName.feathers, ], ]), + + "6a_b-00_west---6a_b-00_east": RegionConnection("6a_b-00_west", "6a_b-00_east", []), + "6a_b-00_west---6a_b-00_top": RegionConnection("6a_b-00_west", "6a_b-00_top", []), + "6a_b-00_east---6a_b-00_west": RegionConnection("6a_b-00_east", "6a_b-00_west", []), + "6a_b-00_top---6a_b-00_west": RegionConnection("6a_b-00_top", "6a_b-00_west", []), + + "6a_b-00b_bottom---6a_b-00b_top": RegionConnection("6a_b-00b_bottom", "6a_b-00b_top", []), + "6a_b-00b_top---6a_b-00b_bottom": RegionConnection("6a_b-00b_top", "6a_b-00b_bottom", []), + + + "6a_b-01_west---6a_b-01_east": RegionConnection("6a_b-01_west", "6a_b-01_east", []), + "6a_b-01_east---6a_b-01_west": RegionConnection("6a_b-01_east", "6a_b-01_west", []), + + "6a_b-02_top---6a_b-02_bottom": RegionConnection("6a_b-02_top", "6a_b-02_bottom", [[ItemName.kevin_blocks, ], ]), + + "6a_b-02b_top---6a_b-02b_bottom": RegionConnection("6a_b-02b_top", "6a_b-02b_bottom", []), + + "6a_b-03_west---6a_b-03_east": RegionConnection("6a_b-03_west", "6a_b-03_east", [[ItemName.kevin_blocks, ], ]), + + "6a_boss-00_west---6a_boss-00_east": RegionConnection("6a_boss-00_west", "6a_boss-00_east", []), + "6a_boss-00_east---6a_boss-00_west": RegionConnection("6a_boss-00_east", "6a_boss-00_west", []), + + "6a_boss-01_west---6a_boss-01_east": RegionConnection("6a_boss-01_west", "6a_boss-01_east", []), + "6a_boss-01_east---6a_boss-01_west": RegionConnection("6a_boss-01_east", "6a_boss-01_west", []), + + "6a_boss-02_west---6a_boss-02_east": RegionConnection("6a_boss-02_west", "6a_boss-02_east", [[ItemName.springs, ], ]), + "6a_boss-02_east---6a_boss-02_west": RegionConnection("6a_boss-02_east", "6a_boss-02_west", []), + + "6a_boss-03_west---6a_boss-03_east": RegionConnection("6a_boss-03_west", "6a_boss-03_east", []), + "6a_boss-03_east---6a_boss-03_west": RegionConnection("6a_boss-03_east", "6a_boss-03_west", []), + + "6a_boss-04_west---6a_boss-04_east": RegionConnection("6a_boss-04_west", "6a_boss-04_east", []), + "6a_boss-04_east---6a_boss-04_west": RegionConnection("6a_boss-04_east", "6a_boss-04_west", []), + + "6a_boss-05_west---6a_boss-05_east": RegionConnection("6a_boss-05_west", "6a_boss-05_east", [[ItemName.dash_refills, ], ]), + "6a_boss-05_east---6a_boss-05_west": RegionConnection("6a_boss-05_east", "6a_boss-05_west", [[ItemName.dash_refills, ], ]), + + "6a_boss-06_west---6a_boss-06_east": RegionConnection("6a_boss-06_west", "6a_boss-06_east", []), + "6a_boss-06_east---6a_boss-06_west": RegionConnection("6a_boss-06_east", "6a_boss-06_west", []), + + "6a_boss-07_west---6a_boss-07_east": RegionConnection("6a_boss-07_west", "6a_boss-07_east", [[ItemName.feathers, ], ]), + "6a_boss-07_east---6a_boss-07_west": RegionConnection("6a_boss-07_east", "6a_boss-07_west", [[ItemName.feathers, ], ]), + + "6a_boss-08_west---6a_boss-08_east": RegionConnection("6a_boss-08_west", "6a_boss-08_east", [[ItemName.dash_refills, ], ]), + + "6a_boss-09_west---6a_boss-09_east": RegionConnection("6a_boss-09_west", "6a_boss-09_east", [[ItemName.feathers, ], ]), + + "6a_boss-10_west---6a_boss-10_east": RegionConnection("6a_boss-10_west", "6a_boss-10_east", [[ItemName.bumpers, ], ]), + "6a_boss-10_east---6a_boss-10_west": RegionConnection("6a_boss-10_east", "6a_boss-10_west", [[ItemName.bumpers, ], ]), + + "6a_boss-11_west---6a_boss-11_east": RegionConnection("6a_boss-11_west", "6a_boss-11_east", [[ItemName.bumpers, ], ]), + + "6a_boss-12_west---6a_boss-12_east": RegionConnection("6a_boss-12_west", "6a_boss-12_east", [[ItemName.dash_refills, ], ]), + + "6a_boss-13_west---6a_boss-13_east": RegionConnection("6a_boss-13_west", "6a_boss-13_east", []), + "6a_boss-13_east---6a_boss-13_west": RegionConnection("6a_boss-13_east", "6a_boss-13_west", []), + + "6a_boss-14_west---6a_boss-14_east": RegionConnection("6a_boss-14_west", "6a_boss-14_east", []), + "6a_boss-14_east---6a_boss-14_west": RegionConnection("6a_boss-14_east", "6a_boss-14_west", []), + + "6a_boss-15_west---6a_boss-15_east": RegionConnection("6a_boss-15_west", "6a_boss-15_east", []), + + "6a_boss-16_west---6a_boss-16_east": RegionConnection("6a_boss-16_west", "6a_boss-16_east", []), + "6a_boss-16_east---6a_boss-16_west": RegionConnection("6a_boss-16_east", "6a_boss-16_west", []), + + "6a_boss-17_west---6a_boss-17_east": RegionConnection("6a_boss-17_west", "6a_boss-17_east", []), + "6a_boss-17_east---6a_boss-17_west": RegionConnection("6a_boss-17_east", "6a_boss-17_west", [[ItemName.cannot_access, ], ]), + + "6a_boss-18_west---6a_boss-18_east": RegionConnection("6a_boss-18_west", "6a_boss-18_east", [[ItemName.feathers, ItemName.bumpers, ], ]), + + "6a_boss-19_west---6a_boss-19_east": RegionConnection("6a_boss-19_west", "6a_boss-19_east", [[ItemName.feathers, ItemName.bumpers, ], ]), + + "6a_boss-20_west---6a_boss-20_east": RegionConnection("6a_boss-20_west", "6a_boss-20_east", []), + "6a_boss-20_east---6a_boss-20_west": RegionConnection("6a_boss-20_east", "6a_boss-20_west", []), + + "6a_after-00_bottom---6a_after-00_top": RegionConnection("6a_after-00_bottom", "6a_after-00_top", []), + "6a_after-00_top---6a_after-00_bottom": RegionConnection("6a_after-00_top", "6a_after-00_bottom", []), + + "6a_after-01_bottom---6a_after-01_goal": RegionConnection("6a_after-01_bottom", "6a_after-01_goal", [[ItemName.badeline_boosters, ], ]), + + "6b_a-00_bottom---6b_a-00_top": RegionConnection("6b_a-00_bottom", "6b_a-00_top", [[ItemName.kevin_blocks, ], ]), + + "6b_a-01_bottom---6b_a-01_top": RegionConnection("6b_a-01_bottom", "6b_a-01_top", [[ItemName.feathers, ItemName.dash_refills, ], ]), + + "6b_a-02_bottom---6b_a-02_top": RegionConnection("6b_a-02_bottom", "6b_a-02_top", [[ItemName.bumpers, ItemName.feathers, ], ]), + + "6b_a-03_west---6b_a-03_east": RegionConnection("6b_a-03_west", "6b_a-03_east", [[ItemName.kevin_blocks, ItemName.coins, ], ]), + + "6b_a-04_west---6b_a-04_east": RegionConnection("6b_a-04_west", "6b_a-04_east", [[ItemName.bumpers, ], ]), + + "6b_a-05_west---6b_a-05_east": RegionConnection("6b_a-05_west", "6b_a-05_east", [[ItemName.bumpers, ], ]), + + "6b_a-06_west---6b_a-06_east": RegionConnection("6b_a-06_west", "6b_a-06_east", [[ItemName.bumpers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "6b_b-00_west---6b_b-00_east": RegionConnection("6b_b-00_west", "6b_b-00_east", []), + + "6b_b-01_top---6b_b-01_bottom": RegionConnection("6b_b-01_top", "6b_b-01_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-02_top---6b_b-02_bottom": RegionConnection("6b_b-02_top", "6b_b-02_bottom", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_b-03_top---6b_b-03_bottom": RegionConnection("6b_b-03_top", "6b_b-03_bottom", [[ItemName.bumpers, ], ]), + + "6b_b-04_top---6b_b-04_bottom": RegionConnection("6b_b-04_top", "6b_b-04_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-05_top---6b_b-05_bottom": RegionConnection("6b_b-05_top", "6b_b-05_bottom", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_b-06_top---6b_b-06_bottom": RegionConnection("6b_b-06_top", "6b_b-06_bottom", []), + + "6b_b-07_top---6b_b-07_bottom": RegionConnection("6b_b-07_top", "6b_b-07_bottom", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_b-08_top---6b_b-08_bottom": RegionConnection("6b_b-08_top", "6b_b-08_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-10_west---6b_b-10_east": RegionConnection("6b_b-10_west", "6b_b-10_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-00_west---6b_c-00_east": RegionConnection("6b_c-00_west", "6b_c-00_east", [[ItemName.springs, ], ]), + + "6b_c-01_west---6b_c-01_east": RegionConnection("6b_c-01_west", "6b_c-01_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-02_west---6b_c-02_east": RegionConnection("6b_c-02_west", "6b_c-02_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-03_west---6b_c-03_east": RegionConnection("6b_c-03_west", "6b_c-03_east", [[ItemName.dash_refills, ItemName.feathers, ItemName.coins, ], ]), + + "6b_c-04_west---6b_c-04_east": RegionConnection("6b_c-04_west", "6b_c-04_east", [[ItemName.dash_refills, ItemName.feathers, ItemName.bumpers, ], ]), + + "6b_d-00_west---6b_d-00_east": RegionConnection("6b_d-00_west", "6b_d-00_east", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_d-01_west---6b_d-01_east": RegionConnection("6b_d-01_west", "6b_d-01_east", [[ItemName.bumpers, ], ]), + + "6b_d-02_west---6b_d-02_east": RegionConnection("6b_d-02_west", "6b_d-02_east", [[ItemName.bumpers, ItemName.feathers, ItemName.coins, ], ]), + + "6b_d-03_west---6b_d-03_east": RegionConnection("6b_d-03_west", "6b_d-03_east", [[ItemName.bumpers, ItemName.kevin_blocks, ], ]), + + "6b_d-04_west---6b_d-04_east": RegionConnection("6b_d-04_west", "6b_d-04_east", [[ItemName.bumpers, ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6b_d-05_west---6b_d-05_goal": RegionConnection("6b_d-05_west", "6b_d-05_goal", [[ItemName.blue_cassette_blocks, ItemName.bumpers, ], ]), + + "6c_00_west---6c_00_east": RegionConnection("6c_00_west", "6c_00_east", [[ItemName.bumpers, ], ]), + + "6c_01_west---6c_01_east": RegionConnection("6c_01_west", "6c_01_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6c_02_west---6c_02_goal": RegionConnection("6c_02_west", "6c_02_goal", [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "7a_a-00_west---7a_a-00_east": RegionConnection("7a_a-00_west", "7a_a-00_east", []), + "7a_a-00_east---7a_a-00_west": RegionConnection("7a_a-00_east", "7a_a-00_west", []), + + "7a_a-01_west---7a_a-01_east": RegionConnection("7a_a-01_west", "7a_a-01_east", [[ItemName.dash_refills, ], ]), + "7a_a-01_east---7a_a-01_east": RegionConnection("7a_a-01_east", "7a_a-01_east", [[ItemName.dash_refills, ], ]), + + "7a_a-02_west---7a_a-02_north": RegionConnection("7a_a-02_west", "7a_a-02_north", [[ItemName.springs, ], ]), + "7a_a-02_west---7a_a-02_east": RegionConnection("7a_a-02_west", "7a_a-02_east", [[ItemName.springs, ], ]), + "7a_a-02_east---7a_a-02_west": RegionConnection("7a_a-02_east", "7a_a-02_west", []), + "7a_a-02_north---7a_a-02_west": RegionConnection("7a_a-02_north", "7a_a-02_west", []), + "7a_a-02_north-west---7a_a-02_west": RegionConnection("7a_a-02_north-west", "7a_a-02_west", []), + + "7a_a-02b_east---7a_a-02b_west": RegionConnection("7a_a-02b_east", "7a_a-02b_west", []), + "7a_a-02b_west---7a_a-02b_east": RegionConnection("7a_a-02b_west", "7a_a-02b_east", []), + + "7a_a-03_west---7a_a-03_east": RegionConnection("7a_a-03_west", "7a_a-03_east", [[ItemName.springs, ], ]), + "7a_a-03_east---7a_a-03_west": RegionConnection("7a_a-03_east", "7a_a-03_west", [[ItemName.springs, ], ]), + + "7a_a-04_west---7a_a-04_east": RegionConnection("7a_a-04_west", "7a_a-04_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "7a_a-04_north---7a_a-04_east": RegionConnection("7a_a-04_north", "7a_a-04_east", []), + "7a_a-04_east---7a_a-04_west": RegionConnection("7a_a-04_east", "7a_a-04_west", []), + "7a_a-04_east---7a_a-04_north": RegionConnection("7a_a-04_east", "7a_a-04_north", []), + + + "7a_a-05_west---7a_a-05_east": RegionConnection("7a_a-05_west", "7a_a-05_east", [[ItemName.dash_refills, ], ]), + "7a_a-05_east---7a_a-05_west": RegionConnection("7a_a-05_east", "7a_a-05_west", [[ItemName.dash_refills, ], ]), + + "7a_a-06_bottom---7a_a-06_top": RegionConnection("7a_a-06_bottom", "7a_a-06_top", [[ItemName.badeline_boosters, ItemName.springs, ], ]), + "7a_a-06_bottom---7a_a-06_top-side": RegionConnection("7a_a-06_bottom", "7a_a-06_top-side", [[ItemName.badeline_boosters, ItemName.springs, ], ]), + "7a_a-06_top---7a_a-06_bottom": RegionConnection("7a_a-06_top", "7a_a-06_bottom", []), + "7a_a-06_top-side---7a_a-06_top": RegionConnection("7a_a-06_top-side", "7a_a-06_top", [[ItemName.badeline_boosters, ], ]), + + "7a_b-00_bottom---7a_b-00_top": RegionConnection("7a_b-00_bottom", "7a_b-00_top", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-00_top---7a_b-00_bottom": RegionConnection("7a_b-00_top", "7a_b-00_bottom", []), + + "7a_b-01_west---7a_b-01_east": RegionConnection("7a_b-01_west", "7a_b-01_east", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + + "7a_b-02_south---7a_b-02_north-west": RegionConnection("7a_b-02_south", "7a_b-02_north-west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02_south---7a_b-02_north-east": RegionConnection("7a_b-02_south", "7a_b-02_north-east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02_north-west---7a_b-02_north": RegionConnection("7a_b-02_north-west", "7a_b-02_north", []), + "7a_b-02_north---7a_b-02_north-east": RegionConnection("7a_b-02_north", "7a_b-02_north-east", []), + "7a_b-02_north-east---7a_b-02_south": RegionConnection("7a_b-02_north-east", "7a_b-02_south", []), + "7a_b-02_north-east---7a_b-02_north": RegionConnection("7a_b-02_north-east", "7a_b-02_north", []), + + "7a_b-02b_south---7a_b-02b_north-west": RegionConnection("7a_b-02b_south", "7a_b-02b_north-west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02b_south---7a_b-02b_north-east": RegionConnection("7a_b-02b_south", "7a_b-02b_north-east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02b_north-west---7a_b-02b_north-east": RegionConnection("7a_b-02b_north-west", "7a_b-02b_north-east", []), + "7a_b-02b_north-east---7a_b-02b_south": RegionConnection("7a_b-02b_north-east", "7a_b-02b_south", []), + "7a_b-02b_north-east---7a_b-02b_north-west": RegionConnection("7a_b-02b_north-east", "7a_b-02b_north-west", []), + + + "7a_b-02c_west---7a_b-02c_east": RegionConnection("7a_b-02c_west", "7a_b-02c_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02c_east---7a_b-02c_west": RegionConnection("7a_b-02c_east", "7a_b-02c_west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02c_east---7a_b-02c_south-east": RegionConnection("7a_b-02c_east", "7a_b-02c_south-east", []), + "7a_b-02c_south-east---7a_b-02c_east": RegionConnection("7a_b-02c_south-east", "7a_b-02c_east", []), + + "7a_b-02d_north---7a_b-02d_south": RegionConnection("7a_b-02d_north", "7a_b-02d_south", [[ItemName.dash_refills, ], ]), + "7a_b-02d_south---7a_b-02d_north": RegionConnection("7a_b-02d_south", "7a_b-02d_north", [[ItemName.dash_refills, ], ]), + + "7a_b-03_west---7a_b-03_east": RegionConnection("7a_b-03_west", "7a_b-03_east", []), + "7a_b-03_east---7a_b-03_west": RegionConnection("7a_b-03_east", "7a_b-03_west", []), + "7a_b-03_east---7a_b-03_north": RegionConnection("7a_b-03_east", "7a_b-03_north", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-03_north---7a_b-03_east": RegionConnection("7a_b-03_north", "7a_b-03_east", []), + + + "7a_b-05_west---7a_b-05_east": RegionConnection("7a_b-05_west", "7a_b-05_east", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ], ]), + "7a_b-05_north-west---7a_b-05_west": RegionConnection("7a_b-05_north-west", "7a_b-05_west", []), + + "7a_b-06_west---7a_b-06_east": RegionConnection("7a_b-06_west", "7a_b-06_east", [[ItemName.traffic_blocks, ], ]), + "7a_b-06_east---7a_b-06_west": RegionConnection("7a_b-06_east", "7a_b-06_west", []), + + "7a_b-07_west---7a_b-07_east": RegionConnection("7a_b-07_west", "7a_b-07_east", [[ItemName.traffic_blocks, ], ]), + "7a_b-07_east---7a_b-07_west": RegionConnection("7a_b-07_east", "7a_b-07_west", []), + + "7a_b-08_west---7a_b-08_east": RegionConnection("7a_b-08_west", "7a_b-08_east", [[ItemName.springs, ], ]), + + "7a_b-09_bottom---7a_b-09_top": RegionConnection("7a_b-09_bottom", "7a_b-09_top", [[ItemName.traffic_blocks, ItemName.badeline_boosters, ], ]), + "7a_b-09_top---7a_b-09_bottom": RegionConnection("7a_b-09_top", "7a_b-09_bottom", [[ItemName.traffic_blocks, ], ]), + "7a_b-09_top---7a_b-09_top-side": RegionConnection("7a_b-09_top", "7a_b-09_top-side", []), + "7a_b-09_top-side---7a_b-09_top": RegionConnection("7a_b-09_top-side", "7a_b-09_top", []), + + "7a_c-00_west---7a_c-00_east": RegionConnection("7a_c-00_west", "7a_c-00_east", [[ItemName.dream_blocks, ], ]), + "7a_c-00_east---7a_c-00_west": RegionConnection("7a_c-00_east", "7a_c-00_west", [[ItemName.dream_blocks, ], ]), + + "7a_c-01_bottom---7a_c-01_top": RegionConnection("7a_c-01_bottom", "7a_c-01_top", [[ItemName.dream_blocks, ], ]), + "7a_c-01_top---7a_c-01_bottom": RegionConnection("7a_c-01_top", "7a_c-01_bottom", [[ItemName.dream_blocks, ], ]), + + "7a_c-02_bottom---7a_c-02_top": RegionConnection("7a_c-02_bottom", "7a_c-02_top", [[ItemName.dream_blocks, ItemName.springs, ItemName.coins, ], ]), + + "7a_c-03_south---7a_c-03_west": RegionConnection("7a_c-03_south", "7a_c-03_west", []), + "7a_c-03_south---7a_c-03_east": RegionConnection("7a_c-03_south", "7a_c-03_east", [[ItemName.dream_blocks, ], ]), + "7a_c-03_west---7a_c-03_south": RegionConnection("7a_c-03_west", "7a_c-03_south", []), + "7a_c-03_east---7a_c-03_south": RegionConnection("7a_c-03_east", "7a_c-03_south", [[ItemName.dream_blocks, ], ]), + + + "7a_c-04_west---7a_c-04_north-west": RegionConnection("7a_c-04_west", "7a_c-04_north-west", [[ItemName.dream_blocks, ], ]), + "7a_c-04_west---7a_c-04_east": RegionConnection("7a_c-04_west", "7a_c-04_east", []), + "7a_c-04_north-west---7a_c-04_west": RegionConnection("7a_c-04_north-west", "7a_c-04_west", [[ItemName.dream_blocks, ], ]), + "7a_c-04_north-east---7a_c-04_east": RegionConnection("7a_c-04_north-east", "7a_c-04_east", [[ItemName.dream_blocks, ], ]), + "7a_c-04_east---7a_c-04_north-east": RegionConnection("7a_c-04_east", "7a_c-04_north-east", [[ItemName.dream_blocks, ], ]), + "7a_c-04_east---7a_c-04_west": RegionConnection("7a_c-04_east", "7a_c-04_west", []), + + + "7a_c-06_south---7a_c-06_north": RegionConnection("7a_c-06_south", "7a_c-06_north", [[ItemName.dream_blocks, ], ]), + "7a_c-06_south---7a_c-06_east": RegionConnection("7a_c-06_south", "7a_c-06_east", [[ItemName.dream_blocks, ], ]), + "7a_c-06_north---7a_c-06_south": RegionConnection("7a_c-06_north", "7a_c-06_south", []), + "7a_c-06_east---7a_c-06_south": RegionConnection("7a_c-06_east", "7a_c-06_south", [[ItemName.dream_blocks, ], ]), + + "7a_c-06b_south---7a_c-06b_east": RegionConnection("7a_c-06b_south", "7a_c-06b_east", [[ItemName.dream_blocks, ItemName.dream_blocks, ], ]), + "7a_c-06b_west---7a_c-06b_east": RegionConnection("7a_c-06b_west", "7a_c-06b_east", [[ItemName.dream_blocks, ], ]), + "7a_c-06b_east---7a_c-06b_north": RegionConnection("7a_c-06b_east", "7a_c-06b_north", [[ItemName.dream_blocks, ], ]), + + + "7a_c-07_west---7a_c-07_south-west": RegionConnection("7a_c-07_west", "7a_c-07_south-west", []), + "7a_c-07_south-west---7a_c-07_west": RegionConnection("7a_c-07_south-west", "7a_c-07_west", []), + "7a_c-07_south-west---7a_c-07_south-east": RegionConnection("7a_c-07_south-west", "7a_c-07_south-east", []), + "7a_c-07_south-east---7a_c-07_south-west": RegionConnection("7a_c-07_south-east", "7a_c-07_south-west", []), + "7a_c-07_south-east---7a_c-07_east": RegionConnection("7a_c-07_south-east", "7a_c-07_east", [[ItemName.dream_blocks, ], ]), + "7a_c-07_east---7a_c-07_south-east": RegionConnection("7a_c-07_east", "7a_c-07_south-east", [[ItemName.dream_blocks, ], ]), + + + "7a_c-08_west---7a_c-08_east": RegionConnection("7a_c-08_west", "7a_c-08_east", [[ItemName.dream_blocks, ], ]), + "7a_c-08_east---7a_c-08_west": RegionConnection("7a_c-08_east", "7a_c-08_west", [[ItemName.dream_blocks, ], ]), + + "7a_c-09_bottom---7a_c-09_top": RegionConnection("7a_c-09_bottom", "7a_c-09_top", [[ItemName.dream_blocks, ItemName.badeline_boosters, ], ]), + "7a_c-09_top---7a_c-09_bottom": RegionConnection("7a_c-09_top", "7a_c-09_bottom", [[ItemName.dream_blocks, ], ]), + + "7a_d-00_bottom---7a_d-00_top": RegionConnection("7a_d-00_bottom", "7a_d-00_top", [[ItemName.dash_refills, ], ]), + "7a_d-00_top---7a_d-00_bottom": RegionConnection("7a_d-00_top", "7a_d-00_bottom", []), + + "7a_d-01_west---7a_d-01_east": RegionConnection("7a_d-01_west", "7a_d-01_east", [[ItemName.sinking_platforms, ], ]), + "7a_d-01_east---7a_d-01_west": RegionConnection("7a_d-01_east", "7a_d-01_west", [[ItemName.sinking_platforms, ], ]), + + "7a_d-01b_west---7a_d-01b_east": RegionConnection("7a_d-01b_west", "7a_d-01b_east", []), + "7a_d-01b_west---7a_d-01b_south-west": RegionConnection("7a_d-01b_west", "7a_d-01b_south-west", []), + "7a_d-01b_south-west---7a_d-01b_west": RegionConnection("7a_d-01b_south-west", "7a_d-01b_west", []), + "7a_d-01b_east---7a_d-01b_west": RegionConnection("7a_d-01b_east", "7a_d-01b_west", []), + "7a_d-01b_south-east---7a_d-01b_east": RegionConnection("7a_d-01b_south-east", "7a_d-01b_east", []), + + "7a_d-01c_west---7a_d-01c_east": RegionConnection("7a_d-01c_west", "7a_d-01c_east", []), + "7a_d-01c_south---7a_d-01c_east": RegionConnection("7a_d-01c_south", "7a_d-01c_east", []), + "7a_d-01c_east---7a_d-01c_west": RegionConnection("7a_d-01c_east", "7a_d-01c_west", []), + "7a_d-01c_east---7a_d-01c_south": RegionConnection("7a_d-01c_east", "7a_d-01c_south", []), + "7a_d-01c_south-east---7a_d-01c_east": RegionConnection("7a_d-01c_south-east", "7a_d-01c_east", []), + + "7a_d-01d_west---7a_d-01d_east": RegionConnection("7a_d-01d_west", "7a_d-01d_east", []), + "7a_d-01d_east---7a_d-01d_west": RegionConnection("7a_d-01d_east", "7a_d-01d_west", []), + + "7a_d-02_west---7a_d-02_east": RegionConnection("7a_d-02_west", "7a_d-02_east", [[ItemName.coins, ], ]), + + "7a_d-03_west---7a_d-03_east": RegionConnection("7a_d-03_west", "7a_d-03_east", []), + "7a_d-03_west---7a_d-03_north-east": RegionConnection("7a_d-03_west", "7a_d-03_north-east", []), + "7a_d-03_north-west---7a_d-03_west": RegionConnection("7a_d-03_north-west", "7a_d-03_west", []), + "7a_d-03_east---7a_d-03_west": RegionConnection("7a_d-03_east", "7a_d-03_west", [[ItemName.cannot_access, ], ]), + "7a_d-03_north-east---7a_d-03_west": RegionConnection("7a_d-03_north-east", "7a_d-03_west", []), + + "7a_d-03b_west---7a_d-03b_east": RegionConnection("7a_d-03b_west", "7a_d-03b_east", []), + "7a_d-03b_east---7a_d-03b_west": RegionConnection("7a_d-03b_east", "7a_d-03b_west", []), + + "7a_d-04_west---7a_d-04_east": RegionConnection("7a_d-04_west", "7a_d-04_east", []), + "7a_d-04_east---7a_d-04_west": RegionConnection("7a_d-04_east", "7a_d-04_west", []), + + "7a_d-05_west---7a_d-05_east": RegionConnection("7a_d-05_west", "7a_d-05_east", [[ItemName.coins, ], [ItemName.dash_refills, ], ]), + "7a_d-05_north-east---7a_d-05_east": RegionConnection("7a_d-05_north-east", "7a_d-05_east", []), + "7a_d-05_east---7a_d-05_west": RegionConnection("7a_d-05_east", "7a_d-05_west", [[ItemName.dash_refills, ], ]), + "7a_d-05_east---7a_d-05_north-east": RegionConnection("7a_d-05_east", "7a_d-05_north-east", []), + + + "7a_d-06_west---7a_d-06_south-west": RegionConnection("7a_d-06_west", "7a_d-06_south-west", []), + "7a_d-06_south-west---7a_d-06_west": RegionConnection("7a_d-06_south-west", "7a_d-06_west", []), + "7a_d-06_south-west---7a_d-06_east": RegionConnection("7a_d-06_south-west", "7a_d-06_east", []), + "7a_d-06_south-east---7a_d-06_west": RegionConnection("7a_d-06_south-east", "7a_d-06_west", []), + "7a_d-06_south-east---7a_d-06_east": RegionConnection("7a_d-06_south-east", "7a_d-06_east", []), + "7a_d-06_east---7a_d-06_south-east": RegionConnection("7a_d-06_east", "7a_d-06_south-east", []), + + + "7a_d-08_west---7a_d-08_east": RegionConnection("7a_d-08_west", "7a_d-08_east", [[ItemName.dash_refills, ], ]), + "7a_d-08_east---7a_d-08_west": RegionConnection("7a_d-08_east", "7a_d-08_west", [[ItemName.dash_refills, ], ]), + + "7a_d-09_west---7a_d-09_east": RegionConnection("7a_d-09_west", "7a_d-09_east", [[ItemName.springs, ], ]), + + "7a_d-10_west---7a_d-10_north-west": RegionConnection("7a_d-10_west", "7a_d-10_north-west", []), + "7a_d-10_north-west---7a_d-10_west": RegionConnection("7a_d-10_north-west", "7a_d-10_west", []), + "7a_d-10_north-west---7a_d-10_east": RegionConnection("7a_d-10_north-west", "7a_d-10_east", []), + "7a_d-10_north---7a_d-10_north-west": RegionConnection("7a_d-10_north", "7a_d-10_north-west", []), + "7a_d-10_north---7a_d-10_north-east": RegionConnection("7a_d-10_north", "7a_d-10_north-east", [[ItemName.dash_refills, ], ]), + "7a_d-10_north-east---7a_d-10_north": RegionConnection("7a_d-10_north-east", "7a_d-10_north", [[ItemName.dash_refills, ], ]), + "7a_d-10_north-east---7a_d-10_east": RegionConnection("7a_d-10_north-east", "7a_d-10_east", [[ItemName.dash_refills, ], ]), + "7a_d-10_east---7a_d-10_north-east": RegionConnection("7a_d-10_east", "7a_d-10_north-east", [[ItemName.dash_refills, ], ]), + + "7a_d-10b_west---7a_d-10b_east": RegionConnection("7a_d-10b_west", "7a_d-10b_east", []), + "7a_d-10b_east---7a_d-10b_west": RegionConnection("7a_d-10b_east", "7a_d-10b_west", []), + + "7a_d-11_bottom---7a_d-11_top": RegionConnection("7a_d-11_bottom", "7a_d-11_top", [[ItemName.badeline_boosters, ], ]), + "7a_d-11_top---7a_d-11_bottom": RegionConnection("7a_d-11_top", "7a_d-11_bottom", []), + + "7a_e-00b_bottom---7a_e-00b_top": RegionConnection("7a_e-00b_bottom", "7a_e-00b_top", [[ItemName.blue_boosters, ], ]), + "7a_e-00b_top---7a_e-00b_bottom": RegionConnection("7a_e-00b_top", "7a_e-00b_bottom", [[ItemName.blue_boosters, ], ]), + + "7a_e-00_west---7a_e-00_south-west": RegionConnection("7a_e-00_west", "7a_e-00_south-west", []), + "7a_e-00_west---7a_e-00_north-west": RegionConnection("7a_e-00_west", "7a_e-00_north-west", []), + "7a_e-00_south-west---7a_e-00_east": RegionConnection("7a_e-00_south-west", "7a_e-00_east", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + "7a_e-00_south-west---7a_e-00_west": RegionConnection("7a_e-00_south-west", "7a_e-00_west", []), + "7a_e-00_north-west---7a_e-00_south-west": RegionConnection("7a_e-00_north-west", "7a_e-00_south-west", []), + "7a_e-00_east---7a_e-00_south-west": RegionConnection("7a_e-00_east", "7a_e-00_south-west", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + + "7a_e-01_north---7a_e-01_east": RegionConnection("7a_e-01_north", "7a_e-01_east", []), + "7a_e-01_east---7a_e-01_west": RegionConnection("7a_e-01_east", "7a_e-01_west", []), + + "7a_e-01b_west---7a_e-01b_east": RegionConnection("7a_e-01b_west", "7a_e-01b_east", []), + "7a_e-01b_east---7a_e-01b_west": RegionConnection("7a_e-01b_east", "7a_e-01b_west", []), + + "7a_e-01c_west---7a_e-01c_east": RegionConnection("7a_e-01c_west", "7a_e-01c_east", [[ItemName.move_blocks, ], ]), + + "7a_e-02_west---7a_e-02_east": RegionConnection("7a_e-02_west", "7a_e-02_east", [[ItemName.pink_clouds, ], ]), + + "7a_e-03_south-west---7a_e-03_east": RegionConnection("7a_e-03_south-west", "7a_e-03_east", [[ItemName.blue_boosters, ItemName.moving_platforms, ], ]), + "7a_e-03_west---7a_e-03_east": RegionConnection("7a_e-03_west", "7a_e-03_east", []), + "7a_e-03_east---7a_e-03_west": RegionConnection("7a_e-03_east", "7a_e-03_west", []), + + "7a_e-04_west---7a_e-04_east": RegionConnection("7a_e-04_west", "7a_e-04_east", [[ItemName.blue_boosters, ItemName.springs, ], ]), + + "7a_e-05_west---7a_e-05_east": RegionConnection("7a_e-05_west", "7a_e-05_east", []), + "7a_e-05_east---7a_e-05_west": RegionConnection("7a_e-05_east", "7a_e-05_west", []), + + "7a_e-06_west---7a_e-06_east": RegionConnection("7a_e-06_west", "7a_e-06_east", [[ItemName.move_blocks, ], ]), + + "7a_e-07_bottom---7a_e-07_top": RegionConnection("7a_e-07_bottom", "7a_e-07_top", [[ItemName.move_blocks, ], ]), + + "7a_e-08_south---7a_e-08_west": RegionConnection("7a_e-08_south", "7a_e-08_west", [[ItemName.blue_clouds, ], ]), + "7a_e-08_south---7a_e-08_east": RegionConnection("7a_e-08_south", "7a_e-08_east", [[ItemName.blue_clouds, ], ]), + "7a_e-08_west---7a_e-08_south": RegionConnection("7a_e-08_west", "7a_e-08_south", []), + "7a_e-08_east---7a_e-08_south": RegionConnection("7a_e-08_east", "7a_e-08_south", []), + + "7a_e-09_north---7a_e-09_east": RegionConnection("7a_e-09_north", "7a_e-09_east", []), + "7a_e-09_east---7a_e-09_north": RegionConnection("7a_e-09_east", "7a_e-09_north", []), + + "7a_e-11_south---7a_e-11_north": RegionConnection("7a_e-11_south", "7a_e-11_north", [[ItemName.move_blocks, ], ]), + "7a_e-11_south---7a_e-11_east": RegionConnection("7a_e-11_south", "7a_e-11_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "7a_e-11_north---7a_e-11_south": RegionConnection("7a_e-11_north", "7a_e-11_south", []), + + + "7a_e-10_south---7a_e-10_east": RegionConnection("7a_e-10_south", "7a_e-10_east", [[ItemName.blue_boosters, ], ]), + "7a_e-10_north---7a_e-10_south": RegionConnection("7a_e-10_north", "7a_e-10_south", []), + + "7a_e-10b_west---7a_e-10b_east": RegionConnection("7a_e-10b_west", "7a_e-10b_east", [[ItemName.move_blocks, ItemName.dash_refills, ItemName.springs, ], ]), + + "7a_e-13_bottom---7a_e-13_top": RegionConnection("7a_e-13_bottom", "7a_e-13_top", [[ItemName.badeline_boosters, ItemName.dash_refills, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ], ]), + + "7a_f-00_south---7a_f-00_west": RegionConnection("7a_f-00_south", "7a_f-00_west", []), + "7a_f-00_south---7a_f-00_east": RegionConnection("7a_f-00_south", "7a_f-00_east", [[ItemName.red_boosters, ], ]), + "7a_f-00_west---7a_f-00_south": RegionConnection("7a_f-00_west", "7a_f-00_south", []), + "7a_f-00_north-west---7a_f-00_west": RegionConnection("7a_f-00_north-west", "7a_f-00_west", []), + "7a_f-00_north-west---7a_f-00_north-east": RegionConnection("7a_f-00_north-west", "7a_f-00_north-east", [[ItemName.red_boosters, ], ]), + + "7a_f-01_south---7a_f-01_north": RegionConnection("7a_f-01_south", "7a_f-01_north", []), + "7a_f-01_north---7a_f-01_south": RegionConnection("7a_f-01_north", "7a_f-01_south", []), + + "7a_f-02_west---7a_f-02_east": RegionConnection("7a_f-02_west", "7a_f-02_east", [[ItemName.swap_blocks, ], ]), + "7a_f-02_north-west---7a_f-02_north-east": RegionConnection("7a_f-02_north-west", "7a_f-02_north-east", [[ItemName.red_boosters, ], ]), + "7a_f-02_north-east---7a_f-02_east": RegionConnection("7a_f-02_north-east", "7a_f-02_east", []), + + "7a_f-02b_west---7a_f-02b_east": RegionConnection("7a_f-02b_west", "7a_f-02b_east", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.swap_blocks, ItemName.dash_switches, ], ]), + + "7a_f-04_west---7a_f-04_east": RegionConnection("7a_f-04_west", "7a_f-04_east", [[ItemName.swap_blocks, ], ]), + + "7a_f-03_west---7a_f-03_east": RegionConnection("7a_f-03_west", "7a_f-03_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "7a_f-03_east---7a_f-03_west": RegionConnection("7a_f-03_east", "7a_f-03_west", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7a_f-05_west---7a_f-05_south": RegionConnection("7a_f-05_west", "7a_f-05_south", []), + "7a_f-05_south-west---7a_f-05_south": RegionConnection("7a_f-05_south-west", "7a_f-05_south", []), + "7a_f-05_north-west---7a_f-05_south": RegionConnection("7a_f-05_north-west", "7a_f-05_south", []), + "7a_f-05_south---7a_f-05_west": RegionConnection("7a_f-05_south", "7a_f-05_west", []), + "7a_f-05_south---7a_f-05_south-west": RegionConnection("7a_f-05_south", "7a_f-05_south-west", []), + "7a_f-05_south---7a_f-05_north-west": RegionConnection("7a_f-05_south", "7a_f-05_north-west", []), + "7a_f-05_south---7a_f-05_north": RegionConnection("7a_f-05_south", "7a_f-05_north", []), + "7a_f-05_south---7a_f-05_north-east": RegionConnection("7a_f-05_south", "7a_f-05_north-east", []), + "7a_f-05_south---7a_f-05_south-east": RegionConnection("7a_f-05_south", "7a_f-05_south-east", []), + "7a_f-05_south---7a_f-05_east": RegionConnection("7a_f-05_south", "7a_f-05_east", [["The Summit A - 2500 M Key", ], ]), + "7a_f-05_north---7a_f-05_south": RegionConnection("7a_f-05_north", "7a_f-05_south", []), + "7a_f-05_north-east---7a_f-05_south": RegionConnection("7a_f-05_north-east", "7a_f-05_south", []), + "7a_f-05_south-east---7a_f-05_south": RegionConnection("7a_f-05_south-east", "7a_f-05_south", []), + + "7a_f-06_north-west---7a_f-06_north": RegionConnection("7a_f-06_north-west", "7a_f-06_north", []), + "7a_f-06_north---7a_f-06_north-west": RegionConnection("7a_f-06_north", "7a_f-06_north-west", []), + "7a_f-06_north---7a_f-06_north-east": RegionConnection("7a_f-06_north", "7a_f-06_north-east", []), + "7a_f-06_north-east---7a_f-06_north": RegionConnection("7a_f-06_north-east", "7a_f-06_north", []), + + "7a_f-07_west---7a_f-07_south-west": RegionConnection("7a_f-07_west", "7a_f-07_south-west", []), + + "7a_f-08_west---7a_f-08_north-west": RegionConnection("7a_f-08_west", "7a_f-08_north-west", [[ItemName.red_boosters, ], ]), + "7a_f-08_west---7a_f-08_east": RegionConnection("7a_f-08_west", "7a_f-08_east", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_refills, ], ]), + "7a_f-08_north-west---7a_f-08_west": RegionConnection("7a_f-08_north-west", "7a_f-08_west", []), + + "7a_f-08b_west---7a_f-08b_east": RegionConnection("7a_f-08b_west", "7a_f-08b_east", [[ItemName.springs, ], ]), + "7a_f-08b_east---7a_f-08b_west": RegionConnection("7a_f-08b_east", "7a_f-08b_west", [[ItemName.springs, ], ]), + + "7a_f-08d_west---7a_f-08d_east": RegionConnection("7a_f-08d_west", "7a_f-08d_east", [[ItemName.dash_switches, ItemName.springs, ], ]), + + "7a_f-08c_west---7a_f-08c_east": RegionConnection("7a_f-08c_west", "7a_f-08c_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7a_f-09_west---7a_f-09_east": RegionConnection("7a_f-09_west", "7a_f-09_east", [[ItemName.red_boosters, ], ]), + + "7a_f-10_west---7a_f-10_east": RegionConnection("7a_f-10_west", "7a_f-10_east", [[ItemName.swap_blocks, ], ]), + "7a_f-10_north-east---7a_f-10_east": RegionConnection("7a_f-10_north-east", "7a_f-10_east", []), + + "7a_f-10b_west---7a_f-10b_east": RegionConnection("7a_f-10b_west", "7a_f-10b_east", [[ItemName.springs, ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "7a_f-11_bottom---7a_f-11_top": RegionConnection("7a_f-11_bottom", "7a_f-11_top", [[ItemName.badeline_boosters, ItemName.swap_blocks, ItemName.springs, ItemName.red_boosters, ], ]), + "7a_f-11_top---7a_f-11_bottom": RegionConnection("7a_f-11_top", "7a_f-11_bottom", []), + + "7a_g-00_bottom---7a_g-00_top": RegionConnection("7a_g-00_bottom", "7a_g-00_top", [[ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7a_g-00b_bottom---7a_g-00b_c26": RegionConnection("7a_g-00b_bottom", "7a_g-00b_c26", []), + "7a_g-00b_c26---7a_g-00b_c24": RegionConnection("7a_g-00b_c26", "7a_g-00b_c24", [[ItemName.dash_refills, ], ]), + "7a_g-00b_c24---7a_g-00b_c21": RegionConnection("7a_g-00b_c24", "7a_g-00b_c21", [[ItemName.springs, ], ]), + "7a_g-00b_c21---7a_g-00b_top": RegionConnection("7a_g-00b_c21", "7a_g-00b_top", [[ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7a_g-01_bottom---7a_g-01_c18": RegionConnection("7a_g-01_bottom", "7a_g-01_c18", [[ItemName.blue_clouds, ], ]), + "7a_g-01_c18---7a_g-01_c16": RegionConnection("7a_g-01_c18", "7a_g-01_c16", [[ItemName.dash_refills, ItemName.blue_clouds, ], ]), + "7a_g-01_c16---7a_g-01_top": RegionConnection("7a_g-01_c16", "7a_g-01_top", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ItemName.pink_clouds, ItemName.badeline_boosters, ], ]), + + "7a_g-02_bottom---7a_g-02_top": RegionConnection("7a_g-02_bottom", "7a_g-02_top", [[ItemName.blue_clouds, ItemName.feathers, ], ]), + + "7a_g-03_bottom---7a_g-03_goal": RegionConnection("7a_g-03_bottom", "7a_g-03_goal", [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ], ]), + + "7b_a-00_west---7b_a-00_east": RegionConnection("7b_a-00_west", "7b_a-00_east", [[ItemName.springs, ], ]), + + "7b_a-01_west---7b_a-01_east": RegionConnection("7b_a-01_west", "7b_a-01_east", [[ItemName.springs, ], ]), + + "7b_a-02_west---7b_a-02_east": RegionConnection("7b_a-02_west", "7b_a-02_east", [[ItemName.springs, ], ]), + + "7b_a-03_bottom---7b_a-03_top": RegionConnection("7b_a-03_bottom", "7b_a-03_top", [[ItemName.springs, ItemName.badeline_boosters, ], ]), + + "7b_b-00_bottom---7b_b-00_top": RegionConnection("7b_b-00_bottom", "7b_b-00_top", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + "7b_b-00_top---7b_b-00_bottom": RegionConnection("7b_b-00_top", "7b_b-00_bottom", []), + + "7b_b-01_bottom---7b_b-01_top": RegionConnection("7b_b-01_bottom", "7b_b-01_top", [[ItemName.traffic_blocks, ], ]), + "7b_b-01_top---7b_b-01_bottom": RegionConnection("7b_b-01_top", "7b_b-01_bottom", []), + + "7b_b-02_west---7b_b-02_east": RegionConnection("7b_b-02_west", "7b_b-02_east", [[ItemName.springs, ], ]), + + "7b_b-03_bottom---7b_b-03_top": RegionConnection("7b_b-03_bottom", "7b_b-03_top", [[ItemName.traffic_blocks, ItemName.badeline_boosters, ], ]), + + "7b_c-01_west---7b_c-01_east": RegionConnection("7b_c-01_west", "7b_c-01_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + + "7b_c-00_west---7b_c-00_east": RegionConnection("7b_c-00_west", "7b_c-00_east", [[ItemName.dream_blocks, ], ]), + + "7b_c-02_west---7b_c-02_east": RegionConnection("7b_c-02_west", "7b_c-02_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + + "7b_c-03_bottom---7b_c-03_top": RegionConnection("7b_c-03_bottom", "7b_c-03_top", [[ItemName.dream_blocks, ItemName.badeline_boosters, ], ]), + + "7b_d-00_west---7b_d-00_east": RegionConnection("7b_d-00_west", "7b_d-00_east", [[ItemName.springs, ], ]), + + "7b_d-01_west---7b_d-01_east": RegionConnection("7b_d-01_west", "7b_d-01_east", [[ItemName.dash_refills, ], ]), + + "7b_d-02_west---7b_d-02_east": RegionConnection("7b_d-02_west", "7b_d-02_east", [[ItemName.springs, ItemName.moving_platforms, ItemName.coins, ], ]), + + "7b_d-03_bottom---7b_d-03_top": RegionConnection("7b_d-03_bottom", "7b_d-03_top", [[ItemName.springs, ItemName.badeline_boosters, ], ]), + + "7b_e-00_west---7b_e-00_east": RegionConnection("7b_e-00_west", "7b_e-00_east", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + + "7b_e-01_west---7b_e-01_east": RegionConnection("7b_e-01_west", "7b_e-01_east", [[ItemName.move_blocks, ItemName.springs, ], ]), + + "7b_e-02_west---7b_e-02_east": RegionConnection("7b_e-02_west", "7b_e-02_east", []), + + "7b_e-03_bottom---7b_e-03_top": RegionConnection("7b_e-03_bottom", "7b_e-03_top", [[ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ], ]), + + "7b_f-00_west---7b_f-00_east": RegionConnection("7b_f-00_west", "7b_f-00_east", [[ItemName.springs, ItemName.swap_blocks, ], ]), + + "7b_f-01_west---7b_f-01_east": RegionConnection("7b_f-01_west", "7b_f-01_east", [[ItemName.red_boosters, ], ]), + + "7b_f-02_west---7b_f-02_east": RegionConnection("7b_f-02_west", "7b_f-02_east", [[ItemName.springs, ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7b_f-03_bottom---7b_f-03_top": RegionConnection("7b_f-03_bottom", "7b_f-03_top", [[ItemName.dash_refills, ItemName.swap_blocks, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7b_g-00_bottom---7b_g-00_top": RegionConnection("7b_g-00_bottom", "7b_g-00_top", [[ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7b_g-01_bottom---7b_g-01_top": RegionConnection("7b_g-01_bottom", "7b_g-01_top", [[ItemName.springs, ItemName.dash_refills, ItemName.pink_clouds, ItemName.blue_clouds, ItemName.badeline_boosters, ], ]), + + "7b_g-02_bottom---7b_g-02_top": RegionConnection("7b_g-02_bottom", "7b_g-02_top", [[ItemName.springs, ItemName.dash_refills, ItemName.pink_clouds, ItemName.blue_clouds, ItemName.badeline_boosters, ], ]), + + "7b_g-03_bottom---7b_g-03_goal": RegionConnection("7b_g-03_bottom", "7b_g-03_goal", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.blue_clouds, ], ]), + + "7c_01_west---7c_01_east": RegionConnection("7c_01_west", "7c_01_east", [[ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7c_02_west---7c_02_east": RegionConnection("7c_02_west", "7c_02_east", [[ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ], ]), + + "7c_03_west---7c_03_goal": RegionConnection("7c_03_west", "7c_03_goal", [[ItemName.pink_clouds, ItemName.dash_refills, ItemName.springs, ], ]), + + + "8a_bridge_west---8a_bridge_east": RegionConnection("8a_bridge_west", "8a_bridge_east", []), + "8a_bridge_east---8a_bridge_west": RegionConnection("8a_bridge_east", "8a_bridge_west", []), + + + "9a_00_west---9a_00_east": RegionConnection("9a_00_west", "9a_00_east", []), + "9a_00_east---9a_00_west": RegionConnection("9a_00_east", "9a_00_west", []), + + + "9a_01_west---9a_01_east": RegionConnection("9a_01_west", "9a_01_east", [[ItemName.dash_refills, ], ]), + "9a_01_east---9a_01_west": RegionConnection("9a_01_east", "9a_01_west", []), + + "9a_02_west---9a_02_east": RegionConnection("9a_02_west", "9a_02_east", []), + "9a_02_east---9a_02_west": RegionConnection("9a_02_east", "9a_02_west", []), + + "9a_a-00_west---9a_a-00_east": RegionConnection("9a_a-00_west", "9a_a-00_east", [[ItemName.dash_refills, ], ]), + "9a_a-00_east---9a_a-00_west": RegionConnection("9a_a-00_east", "9a_a-00_west", []), + + "9a_a-01_west---9a_a-01_east": RegionConnection("9a_a-01_west", "9a_a-01_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "9a_a-01_east---9a_a-01_west": RegionConnection("9a_a-01_east", "9a_a-01_west", []), + + "9a_a-02_west---9a_a-02_east": RegionConnection("9a_a-02_west", "9a_a-02_east", [[ItemName.core_blocks, ], ]), + "9a_a-02_east---9a_a-02_west": RegionConnection("9a_a-02_east", "9a_a-02_west", [[ItemName.core_blocks, ], ]), + + "9a_a-03_bottom---9a_a-03_top": RegionConnection("9a_a-03_bottom", "9a_a-03_top", []), + "9a_a-03_top---9a_a-03_bottom": RegionConnection("9a_a-03_top", "9a_a-03_bottom", []), + + "9a_b-00_west---9a_b-00_south": RegionConnection("9a_b-00_west", "9a_b-00_south", []), + "9a_b-00_south---9a_b-00_west": RegionConnection("9a_b-00_south", "9a_b-00_west", []), + "9a_b-00_south---9a_b-00_east": RegionConnection("9a_b-00_south", "9a_b-00_east", []), + "9a_b-00_south---9a_b-00_north": RegionConnection("9a_b-00_south", "9a_b-00_north", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + "9a_b-00_north---9a_b-00_south": RegionConnection("9a_b-00_north", "9a_b-00_south", []), + "9a_b-00_east---9a_b-00_south": RegionConnection("9a_b-00_east", "9a_b-00_south", []), + + "9a_b-01_west---9a_b-01_east": RegionConnection("9a_b-01_west", "9a_b-01_east", [[ItemName.core_blocks, ], ]), + "9a_b-01_east---9a_b-01_west": RegionConnection("9a_b-01_east", "9a_b-01_west", [[ItemName.core_blocks, ], ]), + + "9a_b-02_west---9a_b-02_east": RegionConnection("9a_b-02_west", "9a_b-02_east", [[ItemName.core_blocks, ], ]), + "9a_b-02_east---9a_b-02_west": RegionConnection("9a_b-02_east", "9a_b-02_west", [[ItemName.core_blocks, ], ]), + + "9a_b-03_west---9a_b-03_east": RegionConnection("9a_b-03_west", "9a_b-03_east", [[ItemName.core_blocks, ], ]), + "9a_b-03_east---9a_b-03_west": RegionConnection("9a_b-03_east", "9a_b-03_west", [[ItemName.core_blocks, ], ]), + + "9a_b-04_north-west---9a_b-04_east": RegionConnection("9a_b-04_north-west", "9a_b-04_east", [[ItemName.core_toggles, ], ]), + "9a_b-04_west---9a_b-04_east": RegionConnection("9a_b-04_west", "9a_b-04_east", [[ItemName.core_blocks, ItemName.core_toggles, ], ]), + + "9a_b-05_east---9a_b-05_west": RegionConnection("9a_b-05_east", "9a_b-05_west", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.dash_refills, ItemName.coins, ], ]), + + + "9a_b-07b_bottom---9a_b-07b_top": RegionConnection("9a_b-07b_bottom", "9a_b-07b_top", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + "9a_b-07b_top---9a_b-07b_bottom": RegionConnection("9a_b-07b_top", "9a_b-07b_bottom", []), + + "9a_b-07_bottom---9a_b-07_top": RegionConnection("9a_b-07_bottom", "9a_b-07_top", [[ItemName.core_toggles, ItemName.core_blocks, ItemName.bumpers, ], ]), + + "9a_c-00_west---9a_c-00_east": RegionConnection("9a_c-00_west", "9a_c-00_east", [[ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ], ]), + "9a_c-00_north-east---9a_c-00_east": RegionConnection("9a_c-00_north-east", "9a_c-00_east", [[ItemName.core_toggles, ], ]), + "9a_c-00_east---9a_c-00_north-east": RegionConnection("9a_c-00_east", "9a_c-00_north-east", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + + "9a_c-01_west---9a_c-01_east": RegionConnection("9a_c-01_west", "9a_c-01_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-01_east---9a_c-01_west": RegionConnection("9a_c-01_east", "9a_c-01_west", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + "9a_c-02_west---9a_c-02_east": RegionConnection("9a_c-02_west", "9a_c-02_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "9a_c-03_west---9a_c-03_north": RegionConnection("9a_c-03_west", "9a_c-03_north", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-03_west---9a_c-03_east": RegionConnection("9a_c-03_west", "9a_c-03_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-03_north-west---9a_c-03_west": RegionConnection("9a_c-03_north-west", "9a_c-03_west", []), + "9a_c-03_north-east---9a_c-03_east": RegionConnection("9a_c-03_north-east", "9a_c-03_east", []), + + "9a_c-03b_south---9a_c-03b_west": RegionConnection("9a_c-03b_south", "9a_c-03b_west", []), + "9a_c-03b_south---9a_c-03b_east": RegionConnection("9a_c-03b_south", "9a_c-03b_east", [[ItemName.core_toggles, ], ]), + "9a_c-03b_east---9a_c-03b_south": RegionConnection("9a_c-03b_east", "9a_c-03b_south", [[ItemName.core_toggles, ], ]), + + "9a_c-04_west---9a_c-04_east": RegionConnection("9a_c-04_west", "9a_c-04_east", [[ItemName.dash_refills, ], ]), + "9a_c-04_east---9a_c-04_west": RegionConnection("9a_c-04_east", "9a_c-04_west", [[ItemName.dash_refills, ], ]), + + "9a_d-00_bottom---9a_d-00_top": RegionConnection("9a_d-00_bottom", "9a_d-00_top", [[ItemName.dash_refills, ], ]), + + "9a_d-01_bottom---9a_d-01_top": RegionConnection("9a_d-01_bottom", "9a_d-01_top", [[ItemName.dash_refills, ], ]), + + "9a_d-02_bottom---9a_d-02_top": RegionConnection("9a_d-02_bottom", "9a_d-02_top", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9a_d-03_bottom---9a_d-03_top": RegionConnection("9a_d-03_bottom", "9a_d-03_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ], ]), + + "9a_d-04_bottom---9a_d-04_top": RegionConnection("9a_d-04_bottom", "9a_d-04_top", [[ItemName.dash_refills, ], ]), + + "9a_d-05_bottom---9a_d-05_top": RegionConnection("9a_d-05_bottom", "9a_d-05_top", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.fire_ice_balls, ], ]), + + "9a_d-06_bottom---9a_d-06_top": RegionConnection("9a_d-06_bottom", "9a_d-06_top", [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + + "9a_d-07_bottom---9a_d-07_top": RegionConnection("9a_d-07_bottom", "9a_d-07_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.springs, ItemName.badeline_boosters, ], ]), + + "9a_d-08_west---9a_d-08_east": RegionConnection("9a_d-08_west", "9a_d-08_east", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.bumpers, ], ]), + + "9a_d-09_west---9a_d-09_east": RegionConnection("9a_d-09_west", "9a_d-09_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9a_d-10_west---9a_d-10_east": RegionConnection("9a_d-10_west", "9a_d-10_east", [[ItemName.bumpers, ItemName.core_toggles, ], ]), + + "9a_d-10b_west---9a_d-10b_east": RegionConnection("9a_d-10b_west", "9a_d-10b_east", [[ItemName.dash_refills, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ], ]), + + "9a_d-10c_west---9a_d-10c_east": RegionConnection("9a_d-10c_west", "9a_d-10c_east", [[ItemName.feathers, ItemName.core_toggles, ], ]), + + "9a_d-11_west---9a_d-11_center": RegionConnection("9a_d-11_west", "9a_d-11_center", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + "9a_d-11_center---9a_d-11_east": RegionConnection("9a_d-11_center", "9a_d-11_east", []), + + "9a_space_west---9a_space_goal": RegionConnection("9a_space_west", "9a_space_goal", []), + + + "9b_01_west---9b_01_east": RegionConnection("9b_01_west", "9b_01_east", []), + "9b_01_east---9b_01_west": RegionConnection("9b_01_east", "9b_01_west", []), + + "9b_a-00_west---9b_a-00_east": RegionConnection("9b_a-00_west", "9b_a-00_east", [[ItemName.dash_refills, ], ]), + "9b_a-00_east---9b_a-00_west": RegionConnection("9b_a-00_east", "9b_a-00_west", [[ItemName.dash_refills, ], ]), + + "9b_a-01_west---9b_a-01_east": RegionConnection("9b_a-01_west", "9b_a-01_east", [[ItemName.core_blocks, ], ]), + + "9b_a-02_west---9b_a-02_east": RegionConnection("9b_a-02_west", "9b_a-02_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + "9b_a-03_west---9b_a-03_east": RegionConnection("9b_a-03_west", "9b_a-03_east", [[ItemName.fire_ice_balls, ], ]), + "9b_a-03_east---9b_a-03_west": RegionConnection("9b_a-03_east", "9b_a-03_west", [[ItemName.fire_ice_balls, ], ]), + + "9b_a-04_west---9b_a-04_east": RegionConnection("9b_a-04_west", "9b_a-04_east", [[ItemName.core_blocks, ItemName.dash_refills, ], ]), + + "9b_a-05_west---9b_a-05_east": RegionConnection("9b_a-05_west", "9b_a-05_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "9b_b-00_west---9b_b-00_east": RegionConnection("9b_b-00_west", "9b_b-00_east", [[ItemName.core_blocks, ], ]), + + "9b_b-01_west---9b_b-01_east": RegionConnection("9b_b-01_west", "9b_b-01_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.bumpers, ], ]), + + "9b_b-02_west---9b_b-02_east": RegionConnection("9b_b-02_west", "9b_b-02_east", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.dash_refills, ItemName.coins, ], ]), + + "9b_b-03_west---9b_b-03_east": RegionConnection("9b_b-03_west", "9b_b-03_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9b_b-04_west---9b_b-04_east": RegionConnection("9b_b-04_west", "9b_b-04_east", [[ItemName.dash_refills, ], ]), + + "9b_b-05_west---9b_b-05_east": RegionConnection("9b_b-05_west", "9b_b-05_east", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.fire_ice_balls, ], ]), + + "9b_c-01_bottom---9b_c-01_top": RegionConnection("9b_c-01_bottom", "9b_c-01_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.springs, ], ]), + + "9b_c-02_bottom---9b_c-02_top": RegionConnection("9b_c-02_bottom", "9b_c-02_top", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.bumpers, ItemName.fire_ice_balls, ], ]), + + "9b_c-03_bottom---9b_c-03_top": RegionConnection("9b_c-03_bottom", "9b_c-03_top", [[ItemName.dash_refills, ItemName.springs, ], ]), + + "9b_c-04_bottom---9b_c-04_top": RegionConnection("9b_c-04_bottom", "9b_c-04_top", [[ItemName.dash_refills, ItemName.springs, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.badeline_boosters, ], ]), + + "9b_c-05_west---9b_c-05_east": RegionConnection("9b_c-05_west", "9b_c-05_east", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.core_blocks, ItemName.bumpers, ], ]), + + "9b_c-06_west---9b_c-06_east": RegionConnection("9b_c-06_west", "9b_c-06_east", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ], ]), + "9b_c-06_east---9b_c-06_west": RegionConnection("9b_c-06_east", "9b_c-06_west", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ], ]), + + "9b_c-08_west---9b_c-08_east": RegionConnection("9b_c-08_west", "9b_c-08_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9b_c-07_west---9b_c-07_east": RegionConnection("9b_c-07_west", "9b_c-07_east", [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + + "9b_space_west---9b_space_goal": RegionConnection("9b_space_west", "9b_space_goal", [[ItemName.dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9c_intro_west---9c_intro_east": RegionConnection("9c_intro_west", "9c_intro_east", []), + "9c_intro_east---9c_intro_west": RegionConnection("9c_intro_east", "9c_intro_west", []), + + "9c_00_west---9c_00_east": RegionConnection("9c_00_west", "9c_00_east", [[ItemName.dash_refills, ], ]), + + "9c_01_west---9c_01_east": RegionConnection("9c_01_west", "9c_01_east", [[ItemName.core_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.bumpers, ], ]), + + "9c_02_west---9c_02_goal": RegionConnection("9c_02_west", "9c_02_goal", [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.dream_blocks, ItemName.bumpers, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ], ]), + + "10a_intro-00-past_west---10a_intro-00-past_east": RegionConnection("10a_intro-00-past_west", "10a_intro-00-past_east", []), + "10a_intro-00-past_east---10a_intro-00-past_west": RegionConnection("10a_intro-00-past_east", "10a_intro-00-past_west", []), + + "10a_intro-01-future_west---10a_intro-01-future_east": RegionConnection("10a_intro-01-future_west", "10a_intro-01-future_east", [[ItemName.badeline_boosters, ItemName.blue_clouds, ], ]), + + "10a_intro-02-launch_bottom---10a_intro-02-launch_top": RegionConnection("10a_intro-02-launch_bottom", "10a_intro-02-launch_top", [[ItemName.badeline_boosters, ItemName.blue_clouds, ], ]), + "10a_intro-02-launch_top---10a_intro-02-launch_bottom": RegionConnection("10a_intro-02-launch_top", "10a_intro-02-launch_bottom", []), + + "10a_intro-03-space_west---10a_intro-03-space_east": RegionConnection("10a_intro-03-space_west", "10a_intro-03-space_east", []), + "10a_intro-03-space_east---10a_intro-03-space_west": RegionConnection("10a_intro-03-space_east", "10a_intro-03-space_west", []), + + "10a_a-00_west---10a_a-00_east": RegionConnection("10a_a-00_west", "10a_a-00_east", [[ItemName.double_dash_refills, ], ]), + "10a_a-00_east---10a_a-00_west": RegionConnection("10a_a-00_east", "10a_a-00_west", []), + + "10a_a-01_west---10a_a-01_east": RegionConnection("10a_a-01_west", "10a_a-01_east", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + "10a_a-01_east---10a_a-01_west": RegionConnection("10a_a-01_east", "10a_a-01_west", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + + "10a_a-02_west---10a_a-02_east": RegionConnection("10a_a-02_west", "10a_a-02_east", [[ItemName.double_dash_refills, ItemName.swap_blocks, ], ]), + + "10a_a-03_west---10a_a-03_east": RegionConnection("10a_a-03_west", "10a_a-03_east", [[ItemName.double_dash_refills, ItemName.swap_blocks, ], ]), + + "10a_a-04_west---10a_a-04_east": RegionConnection("10a_a-04_west", "10a_a-04_east", [[ItemName.double_dash_refills, ItemName.springs, ], ]), + + "10a_a-05_west---10a_a-05_east": RegionConnection("10a_a-05_west", "10a_a-05_east", [[ItemName.coins, ItemName.springs, ], ]), + + "10a_b-00_west---10a_b-00_east": RegionConnection("10a_b-00_west", "10a_b-00_east", [[ItemName.pufferfish, ], ]), + + "10a_b-01_west---10a_b-01_east": RegionConnection("10a_b-01_west", "10a_b-01_east", [[ItemName.pufferfish, ], ]), + + "10a_b-02_west---10a_b-02_east": RegionConnection("10a_b-02_west", "10a_b-02_east", [[ItemName.pufferfish, ItemName.coins, ], ]), + + "10a_b-03_west---10a_b-03_east": RegionConnection("10a_b-03_west", "10a_b-03_east", [[ItemName.pufferfish, ItemName.coins, ItemName.dream_blocks, ], ]), + + "10a_b-04_west---10a_b-04_east": RegionConnection("10a_b-04_west", "10a_b-04_east", [[ItemName.pufferfish, ItemName.coins, ItemName.springs, ], ]), + + "10a_b-05_west---10a_b-05_east": RegionConnection("10a_b-05_west", "10a_b-05_east", [[ItemName.pufferfish, ItemName.springs, ], ]), + + "10a_b-06_west---10a_b-06_east": RegionConnection("10a_b-06_west", "10a_b-06_east", [[ItemName.pufferfish, ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "10a_b-07_west---10a_b-07_east": RegionConnection("10a_b-07_west", "10a_b-07_east", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + + "10a_c-00_west---10a_c-00_east": RegionConnection("10a_c-00_west", "10a_c-00_east", [[ItemName.jellyfish, ], ]), + "10a_c-00_west---10a_c-00_north-east": RegionConnection("10a_c-00_west", "10a_c-00_north-east", [[ItemName.jellyfish, ItemName.dash_refills, ], ]), + + "10a_c-00b_west---10a_c-00b_east": RegionConnection("10a_c-00b_west", "10a_c-00b_east", [[ItemName.jellyfish, ItemName.springs, ], ]), + + "10a_c-01_west---10a_c-01_east": RegionConnection("10a_c-01_west", "10a_c-01_east", [[ItemName.jellyfish, ], ]), + + "10a_c-02_west---10a_c-02_east": RegionConnection("10a_c-02_west", "10a_c-02_east", [[ItemName.jellyfish, ], ]), + + "10a_c-alt-00_west---10a_c-alt-00_east": RegionConnection("10a_c-alt-00_west", "10a_c-alt-00_east", [[ItemName.jellyfish, ItemName.double_dash_refills, ], ]), + + "10a_c-alt-01_west---10a_c-alt-01_east": RegionConnection("10a_c-alt-01_west", "10a_c-alt-01_east", []), + + "10a_c-03_south-west---10a_c-03_south": RegionConnection("10a_c-03_south-west", "10a_c-03_south", []), + "10a_c-03_south---10a_c-03_north": RegionConnection("10a_c-03_south", "10a_c-03_north", [[ItemName.jellyfish, ItemName.springs, ], ]), + "10a_c-03_north---10a_c-03_south": RegionConnection("10a_c-03_north", "10a_c-03_south", []), + + "10a_d-00_south---10a_d-00_south-east": RegionConnection("10a_d-00_south", "10a_d-00_south-east", [[ItemName.red_boosters, ], ]), + "10a_d-00_south---10a_d-00_north": RegionConnection("10a_d-00_south", "10a_d-00_north", [[ItemName.red_boosters, "Farewell - Power Source Key 1", "Farewell - Power Source Key 2", "Farewell - Power Source Key 3", "Farewell - Power Source Key 4", "Farewell - Power Source Key 5", ], ]), + "10a_d-00_north---10a_d-00_south": RegionConnection("10a_d-00_north", "10a_d-00_south", [["Farewell - Power Source Key 5", ], ]), + "10a_d-00_south-east---10a_d-00_south": RegionConnection("10a_d-00_south-east", "10a_d-00_south", [[ItemName.double_dash_refills, ItemName.dash_switches, ], ]), + "10a_d-00_south-east---10a_d-00_north-west": RegionConnection("10a_d-00_south-east", "10a_d-00_north-west", [[ItemName.double_dash_refills, ItemName.springs, ItemName.dash_switches, ], ]), + "10a_d-00_north-west---10a_d-00_south": RegionConnection("10a_d-00_north-west", "10a_d-00_south", [[ItemName.jellyfish, ItemName.dash_switches, ], ]), + "10a_d-00_north-west---10a_d-00_breaker": RegionConnection("10a_d-00_north-west", "10a_d-00_breaker", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ItemName.breaker_boxes, ], ]), + "10a_d-00_breaker---10a_d-00_south": RegionConnection("10a_d-00_breaker", "10a_d-00_south", []), + "10a_d-00_breaker---10a_d-00_north-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-east-door", []), + "10a_d-00_breaker---10a_d-00_south-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-east-door", []), + "10a_d-00_breaker---10a_d-00_south-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-west-door", []), + "10a_d-00_breaker---10a_d-00_west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_west-door", []), + "10a_d-00_breaker---10a_d-00_north-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-west-door", []), + "10a_d-00_north-east-door---10a_d-00_south": RegionConnection("10a_d-00_north-east-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_south-east-door---10a_d-00_south": RegionConnection("10a_d-00_south-east-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_south-west-door---10a_d-00_south": RegionConnection("10a_d-00_south-west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_west-door---10a_d-00_south": RegionConnection("10a_d-00_west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_north-west-door---10a_d-00_south": RegionConnection("10a_d-00_north-west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + + + + + + "10a_d-05_south---10a_d-05_north": RegionConnection("10a_d-05_south", "10a_d-05_north", [[ItemName.red_boosters, ], ]), + + "10a_e-00y_south---10a_e-00y_north": RegionConnection("10a_e-00y_south", "10a_e-00y_north", [[ItemName.red_boosters, ], ]), + "10a_e-00y_south---10a_e-00y_south-east": RegionConnection("10a_e-00y_south", "10a_e-00y_south-east", []), + "10a_e-00y_south-east---10a_e-00y_south": RegionConnection("10a_e-00y_south-east", "10a_e-00y_south", []), + "10a_e-00y_north-east---10a_e-00y_north": RegionConnection("10a_e-00y_north-east", "10a_e-00y_north", [[ItemName.red_boosters, ], ]), + + "10a_e-00yb_south---10a_e-00yb_north": RegionConnection("10a_e-00yb_south", "10a_e-00yb_north", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.double_dash_refills, ], ]), + + "10a_e-00z_south---10a_e-00z_north": RegionConnection("10a_e-00z_south", "10a_e-00z_north", []), + "10a_e-00z_north---10a_e-00z_south": RegionConnection("10a_e-00z_north", "10a_e-00z_south", []), + + "10a_e-00_south---10a_e-00_north": RegionConnection("10a_e-00_south", "10a_e-00_north", [[ItemName.blue_clouds, ItemName.pufferfish, ItemName.coins, ItemName.double_dash_refills, ], ]), + + "10a_e-00b_south---10a_e-00b_north": RegionConnection("10a_e-00b_south", "10a_e-00b_north", [[ItemName.jellyfish, ItemName.springs, ], ]), + "10a_e-00b_north---10a_e-00b_south": RegionConnection("10a_e-00b_north", "10a_e-00b_south", []), + + "10a_e-01_south---10a_e-01_north": RegionConnection("10a_e-01_south", "10a_e-01_north", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ], ]), + + "10a_e-02_west---10a_e-02_east": RegionConnection("10a_e-02_west", "10a_e-02_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.coins, ], ]), + + "10a_e-03_west---10a_e-03_east": RegionConnection("10a_e-03_west", "10a_e-03_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ], ]), + "10a_e-03_east---10a_e-03_east": RegionConnection("10a_e-03_east", "10a_e-03_east", [[ItemName.pufferfish, ], ]), + + "10a_e-04_west---10a_e-04_east": RegionConnection("10a_e-04_west", "10a_e-04_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ], ]), + + "10a_e-05_west---10a_e-05_east": RegionConnection("10a_e-05_west", "10a_e-05_east", [[ItemName.pufferfish, ItemName.springs, ItemName.coins, ItemName.traffic_blocks, ], ]), + + "10a_e-05b_west---10a_e-05b_east": RegionConnection("10a_e-05b_west", "10a_e-05b_east", [[ItemName.pufferfish, ItemName.swap_blocks, ], ]), + + "10a_e-05c_west---10a_e-05c_east": RegionConnection("10a_e-05c_west", "10a_e-05c_east", [[ItemName.pufferfish, ItemName.swap_blocks, ItemName.double_dash_refills, ], ]), + + "10a_e-06_west---10a_e-06_east": RegionConnection("10a_e-06_west", "10a_e-06_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.coins, ], ]), + + "10a_e-07_west---10a_e-07_east": RegionConnection("10a_e-07_west", "10a_e-07_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ItemName.move_blocks, ], ]), + + "10a_e-08_west---10a_e-08_east": RegionConnection("10a_e-08_west", "10a_e-08_east", [[ItemName.jellyfish, ItemName.springs, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_f-door_west---10b_f-door_east": RegionConnection("10b_f-door_west", "10b_f-door_east", [[ItemName.double_dash_refills, ], ]), + "10b_f-door_east---10b_f-door_west": RegionConnection("10b_f-door_east", "10b_f-door_west", []), + + "10b_f-00_west---10b_f-00_east": RegionConnection("10b_f-00_west", "10b_f-00_east", [[ItemName.springs, ItemName.dream_blocks, ], ]), + + "10b_f-01_west---10b_f-01_east": RegionConnection("10b_f-01_west", "10b_f-01_east", []), + "10b_f-01_east---10b_f-01_west": RegionConnection("10b_f-01_east", "10b_f-01_west", []), + + "10b_f-02_west---10b_f-02_east": RegionConnection("10b_f-02_west", "10b_f-02_east", []), + + "10b_f-03_west---10b_f-03_east": RegionConnection("10b_f-03_west", "10b_f-03_east", [[ItemName.double_dash_refills, ], ]), + + "10b_f-04_west---10b_f-04_east": RegionConnection("10b_f-04_west", "10b_f-04_east", []), + "10b_f-04_east---10b_f-04_west": RegionConnection("10b_f-04_east", "10b_f-04_west", []), + + "10b_f-05_west---10b_f-05_east": RegionConnection("10b_f-05_west", "10b_f-05_east", [[ItemName.double_dash_refills, ], ]), + + "10b_f-06_west---10b_f-06_east": RegionConnection("10b_f-06_west", "10b_f-06_east", [[ItemName.double_dash_refills, ItemName.kevin_blocks, ItemName.dream_blocks, ItemName.coins, ], ]), + + "10b_f-07_west---10b_f-07_east": RegionConnection("10b_f-07_west", "10b_f-07_east", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + + "10b_f-08_west---10b_f-08_east": RegionConnection("10b_f-08_west", "10b_f-08_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.move_blocks, ], ]), + + "10b_f-09_west---10b_f-09_east": RegionConnection("10b_f-09_west", "10b_f-09_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_g-00_bottom---10b_g-00_top": RegionConnection("10b_g-00_bottom", "10b_g-00_top", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + "10b_g-00_top---10b_g-00_bottom": RegionConnection("10b_g-00_top", "10b_g-00_bottom", []), + + "10b_g-01_bottom---10b_g-01_top": RegionConnection("10b_g-01_bottom", "10b_g-01_top", [[ItemName.blue_boosters, ], ]), + "10b_g-01_top---10b_g-01_bottom": RegionConnection("10b_g-01_top", "10b_g-01_bottom", []), + + "10b_g-03_bottom---10b_g-03_top": RegionConnection("10b_g-03_bottom", "10b_g-03_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "10b_g-02_west---10b_g-02_east": RegionConnection("10b_g-02_west", "10b_g-02_east", [[ItemName.dream_blocks, ], ]), + + "10b_g-04_west---10b_g-04_east": RegionConnection("10b_g-04_west", "10b_g-04_east", [[ItemName.move_blocks, ItemName.springs, ], ]), + + "10b_g-05_west---10b_g-05_east": RegionConnection("10b_g-05_west", "10b_g-05_east", []), + + "10b_g-06_west---10b_g-06_east": RegionConnection("10b_g-06_west", "10b_g-06_east", [[ItemName.double_dash_refills, ItemName.feathers, ], ]), + + "10b_h-00b_west---10b_h-00b_east": RegionConnection("10b_h-00b_west", "10b_h-00b_east", [[ItemName.double_dash_refills, ItemName.feathers, ], ]), + + "10b_h-00_west---10b_h-00_east": RegionConnection("10b_h-00_west", "10b_h-00_east", [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + + "10b_h-01_west---10b_h-01_east": RegionConnection("10b_h-01_west", "10b_h-01_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.springs, ItemName.move_blocks, ], ]), + + "10b_h-02_west---10b_h-02_east": RegionConnection("10b_h-02_west", "10b_h-02_east", [[ItemName.red_boosters, ], ]), + + "10b_h-03_west---10b_h-03_east": RegionConnection("10b_h-03_west", "10b_h-03_east", [[ItemName.coins, ItemName.double_dash_refills, ItemName.springs, ], ]), + + "10b_h-03b_west---10b_h-03b_east": RegionConnection("10b_h-03b_west", "10b_h-03b_east", [[ItemName.coins, ItemName.double_dash_refills, ItemName.core_blocks, ], ]), + + "10b_h-04_top---10b_h-04_east": RegionConnection("10b_h-04_top", "10b_h-04_east", []), + "10b_h-04_top---10b_h-04_bottom": RegionConnection("10b_h-04_top", "10b_h-04_bottom", [[ItemName.red_boosters, ], ]), + + "10b_h-04b_west---10b_h-04b_east": RegionConnection("10b_h-04b_west", "10b_h-04b_east", [[ItemName.double_dash_refills, ], ]), + + "10b_h-05_west---10b_h-05_top": RegionConnection("10b_h-05_west", "10b_h-05_top", []), + "10b_h-05_top---10b_h-05_east": RegionConnection("10b_h-05_top", "10b_h-05_east", [[ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_h-06_west---10b_h-06_east": RegionConnection("10b_h-06_west", "10b_h-06_east", [[ItemName.dash_refills, ItemName.springs, ItemName.feathers, ], ]), + + "10b_h-06b_bottom---10b_h-06b_top": RegionConnection("10b_h-06b_bottom", "10b_h-06b_top", [[ItemName.fire_ice_balls, ItemName.coins, ], ]), + "10b_h-06b_top---10b_h-06b_bottom": RegionConnection("10b_h-06b_top", "10b_h-06b_bottom", []), + + "10b_h-07_west---10b_h-07_east": RegionConnection("10b_h-07_west", "10b_h-07_east", [[ItemName.blue_boosters, ItemName.springs, ItemName.coins, ], ]), + + "10b_h-08_west---10b_h-08_east": RegionConnection("10b_h-08_west", "10b_h-08_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_h-09_west---10b_h-09_east": RegionConnection("10b_h-09_west", "10b_h-09_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.kevin_blocks, ], ]), + + "10b_h-10_west---10b_h-10_east": RegionConnection("10b_h-10_west", "10b_h-10_east", [[ItemName.feathers, ItemName.springs, ItemName.badeline_boosters, ], ]), + + "10b_i-00_west---10b_i-00_east": RegionConnection("10b_i-00_west", "10b_i-00_east", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + "10b_i-00_east---10b_i-00_west": RegionConnection("10b_i-00_east", "10b_i-00_west", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + + "10b_i-00b_west---10b_i-00b_east": RegionConnection("10b_i-00b_west", "10b_i-00b_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.springs, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + + "10b_i-01_west---10b_i-01_east": RegionConnection("10b_i-01_west", "10b_i-01_east", [[ItemName.coins, ItemName.springs, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_i-02_west---10b_i-02_east": RegionConnection("10b_i-02_west", "10b_i-02_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "10b_i-03_west---10b_i-03_east": RegionConnection("10b_i-03_west", "10b_i-03_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_i-04_west---10b_i-04_east": RegionConnection("10b_i-04_west", "10b_i-04_east", [[ItemName.red_boosters, ItemName.coins, ], ]), + + "10b_i-05_west---10b_i-05_east": RegionConnection("10b_i-05_west", "10b_i-05_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_j-00_west---10b_j-00_east": RegionConnection("10b_j-00_west", "10b_j-00_east", [[ItemName.dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-00b_west---10b_j-00b_east": RegionConnection("10b_j-00b_west", "10b_j-00b_east", [[ItemName.double_dash_refills, ItemName.springs, ItemName.jellyfish, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-01_west---10b_j-01_east": RegionConnection("10b_j-01_west", "10b_j-01_east", [[ItemName.dash_refills, ItemName.springs, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-02_west---10b_j-02_east": RegionConnection("10b_j-02_west", "10b_j-02_east", [[ItemName.jellyfish, ItemName.springs, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-03_west---10b_j-03_east": RegionConnection("10b_j-03_west", "10b_j-03_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-04_west---10b_j-04_east": RegionConnection("10b_j-04_west", "10b_j-04_east", [[ItemName.jellyfish, ItemName.bird, ], ]), + + "10b_j-05_west---10b_j-05_east": RegionConnection("10b_j-05_west", "10b_j-05_east", [[ItemName.bird, ItemName.badeline_boosters, ItemName.feathers, ], ]), + + "10b_j-06_west---10b_j-06_east": RegionConnection("10b_j-06_west", "10b_j-06_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-07_west---10b_j-07_east": RegionConnection("10b_j-07_west", "10b_j-07_east", [[ItemName.pufferfish, ItemName.feathers, ItemName.springs, ItemName.bird, ], ]), + + "10b_j-08_west---10b_j-08_east": RegionConnection("10b_j-08_west", "10b_j-08_east", [[ItemName.dream_blocks, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-09_west---10b_j-09_east": RegionConnection("10b_j-09_west", "10b_j-09_east", [[ItemName.jellyfish, ItemName.springs, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-10_west---10b_j-10_east": RegionConnection("10b_j-10_west", "10b_j-10_east", [[ItemName.pufferfish, ItemName.swap_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-11_west---10b_j-11_east": RegionConnection("10b_j-11_west", "10b_j-11_east", [[ItemName.springs, ItemName.move_blocks, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-12_west---10b_j-12_east": RegionConnection("10b_j-12_west", "10b_j-12_east", [[ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ], ]), + + "10b_j-13_west---10b_j-13_east": RegionConnection("10b_j-13_west", "10b_j-13_east", [[ItemName.springs, ItemName.feathers, ItemName.double_dash_refills, ], ]), + + "10b_j-14_west---10b_j-14_east": RegionConnection("10b_j-14_west", "10b_j-14_east", [[ItemName.traffic_blocks, ItemName.pufferfish, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-14b_west---10b_j-14b_east": RegionConnection("10b_j-14b_west", "10b_j-14b_east", [[ItemName.springs, ItemName.jellyfish, ItemName.double_dash_refills, ], ]), + + "10b_j-15_west---10b_j-15_east": RegionConnection("10b_j-15_west", "10b_j-15_east", [[ItemName.kevin_blocks, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-16_west---10b_j-16_east": RegionConnection("10b_j-16_west", "10b_j-16_east", [[ItemName.jellyfish, ItemName.pufferfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + "10b_j-16_west---10b_j-16_top": RegionConnection("10b_j-16_west", "10b_j-16_top", [[ItemName.jellyfish, ItemName.pufferfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-17_south---10b_j-17_west": RegionConnection("10b_j-17_south", "10b_j-17_west", []), + "10b_j-17_west---10b_j-17_south": RegionConnection("10b_j-17_west", "10b_j-17_south", []), + "10b_j-17_north---10b_j-17_south": RegionConnection("10b_j-17_north", "10b_j-17_south", []), + "10b_j-17_north---10b_j-17_east": RegionConnection("10b_j-17_north", "10b_j-17_east", []), + + "10b_j-18_west---10b_j-18_east": RegionConnection("10b_j-18_west", "10b_j-18_east", []), + + "10b_j-19_bottom---10b_j-19_top": RegionConnection("10b_j-19_bottom", "10b_j-19_top", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_GOAL_main---10b_GOAL_moon": RegionConnection("10b_GOAL_main", "10b_GOAL_moon", []), + "10b_GOAL_moon---10b_GOAL_main": RegionConnection("10b_GOAL_moon", "10b_GOAL_main", []), + + "10c_end-golden_bottom---10c_end-golden_top": RegionConnection("10c_end-golden_bottom", "10c_end-golden_top", [[ItemName.double_dash_refills, ItemName.jellyfish, ItemName.springs, ItemName.pufferfish, ItemName.badeline_boosters, ], ]), + +} + +all_locations: dict[str, LevelLocation] = { + "0a_-1_car": LevelLocation("0a_-1_car", "Prologue - Car", "0a_-1_main", LocationType.car, []), + "0a_3_clear": LevelLocation("0a_3_clear", "Prologue - Level Clear", "0a_3_east", LocationType.level_clear, []), + + "1a_2_strawberry": LevelLocation("1a_2_strawberry", "Forsaken City A - Room 2 Strawberry", "1a_2_west", LocationType.strawberry, [[ItemName.springs, ], ]), + "1a_3_strawberry": LevelLocation("1a_3_strawberry", "Forsaken City A - Room 3 Strawberry", "1a_3_east", LocationType.strawberry, []), + "1a_3b_strawberry": LevelLocation("1a_3b_strawberry", "Forsaken City A - Room 3b Strawberry", "1a_3b_top", LocationType.strawberry, []), + "1a_5_strawberry": LevelLocation("1a_5_strawberry", "Forsaken City A - Room 5 Strawberry", "1a_5_north-west", LocationType.strawberry, []), + "1a_5z_strawberry": LevelLocation("1a_5z_strawberry", "Forsaken City A - Room 5z Strawberry", "1a_5z_east", LocationType.strawberry, [[ItemName.springs, ], ]), + "1a_5a_strawberry": LevelLocation("1a_5a_strawberry", "Forsaken City A - Room 5a Strawberry", "1a_5a_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_6_strawberry": LevelLocation("1a_6_strawberry", "Forsaken City A - Room 6 Strawberry", "1a_6_east", LocationType.strawberry, []), + "1a_7zb_strawberry": LevelLocation("1a_7zb_strawberry", "Forsaken City A - Room 7zb Strawberry", "1a_7zb_west", LocationType.strawberry, []), + "1a_s1_strawberry": LevelLocation("1a_s1_strawberry", "Forsaken City A - Room s1 Strawberry", "1a_s1_east", LocationType.strawberry, []), + "1a_s1_crystal_heart": LevelLocation("1a_s1_crystal_heart", "Forsaken City A - Crystal Heart", "1a_s1_east", LocationType.crystal_heart, []), + "1a_7z_strawberry": LevelLocation("1a_7z_strawberry", "Forsaken City A - Room 7z Strawberry", "1a_7z_bottom", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_8zb_strawberry": LevelLocation("1a_8zb_strawberry", "Forsaken City A - Room 8zb Strawberry", "1a_8zb_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_7a_strawberry": LevelLocation("1a_7a_strawberry", "Forsaken City A - Room 7a Strawberry", "1a_7a_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9z_strawberry": LevelLocation("1a_9z_strawberry", "Forsaken City A - Room 9z Strawberry", "1a_9z_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_8b_strawberry": LevelLocation("1a_8b_strawberry", "Forsaken City A - Room 8b Strawberry", "1a_8b_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9_strawberry": LevelLocation("1a_9_strawberry", "Forsaken City A - Room 9 Strawberry", "1a_9_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9b_strawberry": LevelLocation("1a_9b_strawberry", "Forsaken City A - Room 9b Strawberry", "1a_9b_east", LocationType.strawberry, []), + "1a_9c_strawberry": LevelLocation("1a_9c_strawberry", "Forsaken City A - Room 9c Strawberry", "1a_9c_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_10zb_strawberry": LevelLocation("1a_10zb_strawberry", "Forsaken City A - Room 10zb Strawberry", "1a_10zb_east", LocationType.strawberry, []), + "1a_11_strawberry": LevelLocation("1a_11_strawberry", "Forsaken City A - Room 11 Strawberry", "1a_11_south", LocationType.strawberry, []), + "1a_11z_cassette": LevelLocation("1a_11z_cassette", "Forsaken City A - Cassette", "1a_11z_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "1a_12z_strawberry": LevelLocation("1a_12z_strawberry", "Forsaken City A - Room 12z Strawberry", "1a_12z_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_end_clear": LevelLocation("1a_end_clear", "Forsaken City A - Level Clear", "1a_end_main", LocationType.level_clear, []), + "1a_end_golden": LevelLocation("1a_end_golden", "Forsaken City A - Golden Strawberry", "1a_end_main", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1a_end_winged_golden": LevelLocation("1a_end_winged_golden", "Forsaken City A - Winged Golden Strawberry", "1a_end_main", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ], ]), + + "1b_03_binoculars": LevelLocation("1b_03_binoculars", "Forsaken City B - Room 03 Binoculars", "1b_03_west", LocationType.binoculars, []), + "1b_09_binoculars": LevelLocation("1b_09_binoculars", "Forsaken City B - Room 09 Binoculars", "1b_09_west", LocationType.binoculars, []), + "1b_end_clear": LevelLocation("1b_end_clear", "Forsaken City B - Level Clear", "1b_end_goal", LocationType.level_clear, []), + "1b_end_golden": LevelLocation("1b_end_golden", "Forsaken City B - Golden Strawberry", "1b_end_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + + "1c_01_binoculars": LevelLocation("1c_01_binoculars", "Forsaken City C - Room 01 Binoculars", "1c_01_west", LocationType.binoculars, []), + "1c_02_binoculars": LevelLocation("1c_02_binoculars", "Forsaken City C - Room 02 Binoculars", "1c_02_west", LocationType.binoculars, []), + "1c_02_clear": LevelLocation("1c_02_clear", "Forsaken City C - Level Clear", "1c_02_goal", LocationType.level_clear, []), + "1c_02_golden": LevelLocation("1c_02_golden", "Forsaken City C - Golden Strawberry", "1c_02_goal", LocationType.golden_strawberry, [[ItemName.traffic_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "2a_s2_crystal_heart": LevelLocation("2a_s2_crystal_heart", "Old Site A - Crystal Heart", "2a_s2_bottom", LocationType.crystal_heart, []), + "2a_1_strawberry": LevelLocation("2a_1_strawberry", "Old Site A - Room 1 Strawberry", "2a_1_north-west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d0_strawberry": LevelLocation("2a_d0_strawberry", "Old Site A - Room d0 Strawberry", "2a_d0_north", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d3_binoculars": LevelLocation("2a_d3_binoculars", "Old Site A - Room d3 Binoculars", "2a_d3_north", LocationType.binoculars, []), + "2a_d3_strawberry": LevelLocation("2a_d3_strawberry", "Old Site A - Room d3 Strawberry", "2a_d3_south", LocationType.strawberry, []), + "2a_d2_strawberry_1": LevelLocation("2a_d2_strawberry_1", "Old Site A - Room d2 Strawberry 1", "2a_d2_north-west", LocationType.strawberry, []), + "2a_d2_strawberry_2": LevelLocation("2a_d2_strawberry_2", "Old Site A - Room d2 Strawberry 2", "2a_d2_east", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d9_cassette": LevelLocation("2a_d9_cassette", "Old Site A - Cassette", "2a_d9_north-west", LocationType.cassette, [[ItemName.dream_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "2a_d1_strawberry": LevelLocation("2a_d1_strawberry", "Old Site A - Room d1 Strawberry", "2a_d1_south-west", LocationType.strawberry, [[ItemName.dream_blocks, ItemName.strawberry_seeds, ], ]), + "2a_d6_strawberry": LevelLocation("2a_d6_strawberry", "Old Site A - Room d6 Strawberry", "2a_d6_west", LocationType.strawberry, []), + "2a_d4_strawberry": LevelLocation("2a_d4_strawberry", "Old Site A - Room d4 Strawberry", "2a_d4_west", LocationType.strawberry, [[ItemName.traffic_blocks, ItemName.dream_blocks, ], ]), + "2a_d5_strawberry": LevelLocation("2a_d5_strawberry", "Old Site A - Room d5 Strawberry", "2a_d5_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_4_strawberry": LevelLocation("2a_4_strawberry", "Old Site A - Room 4 Strawberry", "2a_4_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_5_strawberry": LevelLocation("2a_5_strawberry", "Old Site A - Room 5 Strawberry", "2a_5_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_8_strawberry": LevelLocation("2a_8_strawberry", "Old Site A - Room 8 Strawberry", "2a_8_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_9_strawberry": LevelLocation("2a_9_strawberry", "Old Site A - Room 9 Strawberry", "2a_9_south", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_9b_strawberry": LevelLocation("2a_9b_strawberry", "Old Site A - Room 9b Strawberry", "2a_9b_east", LocationType.strawberry, []), + "2a_10_strawberry": LevelLocation("2a_10_strawberry", "Old Site A - Room 10 Strawberry", "2a_10_top", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_12c_strawberry": LevelLocation("2a_12c_strawberry", "Old Site A - Room 12c Strawberry", "2a_12c_south", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_12d_strawberry": LevelLocation("2a_12d_strawberry", "Old Site A - Room 12d Strawberry", "2a_12d_north-west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_end_3c_strawberry": LevelLocation("2a_end_3c_strawberry", "Old Site A - Room end_3c Strawberry", "2a_end_3c_bottom", LocationType.strawberry, [[ItemName.springs, ], ]), + "2a_end_6_clear": LevelLocation("2a_end_6_clear", "Old Site A - Level Clear", "2a_end_6_main", LocationType.level_clear, []), + "2a_end_6_golden": LevelLocation("2a_end_6_golden", "Old Site A - Golden Strawberry", "2a_end_6_main", LocationType.golden_strawberry, [[ItemName.dream_blocks, ItemName.coins, ItemName.dash_refills, ], ]), + + "2b_10_binoculars": LevelLocation("2b_10_binoculars", "Old Site B - Room 10 Binoculars", "2b_10_west", LocationType.binoculars, []), + "2b_11_binoculars": LevelLocation("2b_11_binoculars", "Old Site B - Room 11 Binoculars", "2b_11_bottom", LocationType.binoculars, []), + "2b_end_clear": LevelLocation("2b_end_clear", "Old Site B - Level Clear", "2b_end_goal", LocationType.level_clear, []), + "2b_end_golden": LevelLocation("2b_end_golden", "Old Site B - Golden Strawberry", "2b_end_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ItemName.blue_cassette_blocks, ], ]), + + "2c_02_binoculars": LevelLocation("2c_02_binoculars", "Old Site C - Room 02 Binoculars", "2c_02_west", LocationType.binoculars, []), + "2c_02_clear": LevelLocation("2c_02_clear", "Old Site C - Level Clear", "2c_02_goal", LocationType.level_clear, []), + "2c_02_golden": LevelLocation("2c_02_golden", "Old Site C - Golden Strawberry", "2c_02_goal", LocationType.golden_strawberry, [[ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "3a_s2_strawberry_1": LevelLocation("3a_s2_strawberry_1", "Celestial Resort A - Room s2 Strawberry 1", "3a_s2_west", LocationType.strawberry, []), + "3a_s2_strawberry_2": LevelLocation("3a_s2_strawberry_2", "Celestial Resort A - Room s2 Strawberry 2", "3a_s2_north-west", LocationType.strawberry, []), + "3a_s3_key_1": LevelLocation("3a_s3_key_1", "Celestial Resort A - Front Door Key", "3a_s3_west", LocationType.key, []), + "3a_s3_strawberry": LevelLocation("3a_s3_strawberry", "Celestial Resort A - Room s3 Strawberry", "3a_s3_north", LocationType.strawberry, []), + "3a_00-a_strawberry": LevelLocation("3a_00-a_strawberry", "Celestial Resort A - Room 00-a Strawberry", "3a_00-a_east", LocationType.strawberry, []), + "3a_02-b_hallway_key_1": LevelLocation("3a_02-b_hallway_key_1", "Celestial Resort A - Hallway Key 1", "3a_02-b_east", LocationType.key, []), + "3a_00-b_strawberry": LevelLocation("3a_00-b_strawberry", "Celestial Resort A - Room 00-b Strawberry", "3a_00-b_east", LocationType.strawberry, []), + "3a_04-b_strawberry": LevelLocation("3a_04-b_strawberry", "Celestial Resort A - Room 04-b Strawberry", "3a_04-b_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_06-a_strawberry": LevelLocation("3a_06-a_strawberry", "Celestial Resort A - Room 06-a Strawberry", "3a_06-a_west", LocationType.strawberry, []), + "3a_07-b_strawberry": LevelLocation("3a_07-b_strawberry", "Celestial Resort A - Room 07-b Strawberry", "3a_07-b_top", LocationType.strawberry, []), + "3a_07-b_key_2": LevelLocation("3a_07-b_key_2", "Celestial Resort A - Hallway Key 2", "3a_07-b_east", LocationType.key, []), + "3a_06-b_strawberry": LevelLocation("3a_06-b_strawberry", "Celestial Resort A - Room 06-b Strawberry", "3a_06-b_east", LocationType.strawberry, []), + "3a_06-c_strawberry": LevelLocation("3a_06-c_strawberry", "Celestial Resort A - Room 06-c Strawberry", "3a_06-c_south-west", LocationType.strawberry, []), + "3a_05-c_strawberry": LevelLocation("3a_05-c_strawberry", "Celestial Resort A - Room 05-c Strawberry", "3a_05-c_east", LocationType.strawberry, []), + "3a_09-b_key_4": LevelLocation("3a_09-b_key_4", "Celestial Resort A - Huge Mess Key", "3a_09-b_center", LocationType.key, [[ItemName.brown_clutter, ItemName.green_clutter, ItemName.pink_clutter, ], ]), + "3a_10-x_brown_clutter": LevelLocation("3a_10-x_brown_clutter", "Celestial Resort A - Brown Clutter", "3a_10-x_south-east", LocationType.clutter, []), + "3a_12-y_strawberry": LevelLocation("3a_12-y_strawberry", "Celestial Resort A - Room 12-y Strawberry", "3a_12-y_west", LocationType.strawberry, []), + "3a_10-y_strawberry": LevelLocation("3a_10-y_strawberry", "Celestial Resort A - Room 10-y Strawberry", "3a_10-y_bottom", LocationType.strawberry, []), + "3a_11-c_crystal_heart": LevelLocation("3a_11-c_crystal_heart", "Celestial Resort A - Crystal Heart", "3a_11-c_south-east", LocationType.crystal_heart, []), + "3a_12-c_strawberry": LevelLocation("3a_12-c_strawberry", "Celestial Resort A - Room 12-c Strawberry", "3a_12-c_west", LocationType.strawberry, []), + "3a_11-d_strawberry": LevelLocation("3a_11-d_strawberry", "Celestial Resort A - Room 11-d Strawberry", "3a_11-d_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_10-d_green_clutter": LevelLocation("3a_10-d_green_clutter", "Celestial Resort A - Green Clutter", "3a_10-d_main", LocationType.clutter, []), + "3a_13-b_strawberry": LevelLocation("3a_13-b_strawberry", "Celestial Resort A - Room 13-b Strawberry", "3a_13-b_top", LocationType.strawberry, []), + "3a_13-x_strawberry": LevelLocation("3a_13-x_strawberry", "Celestial Resort A - Room 13-x Strawberry", "3a_13-x_west", LocationType.strawberry, []), + "3a_12-x_pink_clutter": LevelLocation("3a_12-x_pink_clutter", "Celestial Resort A - Pink Clutter", "3a_12-x_east", LocationType.clutter, []), + "3a_08-x_strawberry": LevelLocation("3a_08-x_strawberry", "Celestial Resort A - Room 08-x Strawberry", "3a_08-x_west", LocationType.strawberry, []), + "3a_06-d_strawberry": LevelLocation("3a_06-d_strawberry", "Celestial Resort A - Room 06-d Strawberry", "3a_06-d_east", LocationType.strawberry, []), + "3a_04-c_strawberry": LevelLocation("3a_04-c_strawberry", "Celestial Resort A - Room 04-c Strawberry", "3a_04-c_east", LocationType.strawberry, []), + "3a_02-c_key_5": LevelLocation("3a_02-c_key_5", "Celestial Resort A - Presidential Suite Key", "3a_02-c_west", LocationType.key, []), + "3a_03-b_strawberry_1": LevelLocation("3a_03-b_strawberry_1", "Celestial Resort A - Room 03-b Strawberry 1", "3a_03-b_west", LocationType.strawberry, []), + "3a_03-b_strawberry_2": LevelLocation("3a_03-b_strawberry_2", "Celestial Resort A - Room 03-b Strawberry 2", "3a_03-b_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_01-c_cassette": LevelLocation("3a_01-c_cassette", "Celestial Resort A - Cassette", "3a_01-c_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "3a_roof03_strawberry": LevelLocation("3a_roof03_strawberry", "Celestial Resort A - Room roof03 Strawberry", "3a_roof03_west", LocationType.strawberry, []), + "3a_roof06_strawberry_1": LevelLocation("3a_roof06_strawberry_1", "Celestial Resort A - Room roof06 Strawberry 1", "3a_roof06_west", LocationType.strawberry, []), + "3a_roof06_strawberry_2": LevelLocation("3a_roof06_strawberry_2", "Celestial Resort A - Room roof06 Strawberry 2", "3a_roof06_west", LocationType.strawberry, []), + "3a_roof07_clear": LevelLocation("3a_roof07_clear", "Celestial Resort A - Level Clear", "3a_roof07_main", LocationType.level_clear, []), + "3a_roof07_golden": LevelLocation("3a_roof07_golden", "Celestial Resort A - Golden Strawberry", "3a_roof07_main", LocationType.golden_strawberry, [["Celestial Resort A - Front Door Key", "Celestial Resort A - Hallway Key 1", "Celestial Resort A - Hallway Key 2", "Celestial Resort A - Huge Mess Key", "Celestial Resort A - Presidential Suite Key", ItemName.sinking_platforms, ItemName.dash_refills, ItemName.brown_clutter, ItemName.green_clutter, ItemName.pink_clutter, ItemName.coins, ItemName.moving_platforms, ItemName.springs, ], ]), + + "3b_back_binoculars": LevelLocation("3b_back_binoculars", "Celestial Resort B - Room back Binoculars", "3b_back_east", LocationType.binoculars, []), + "3b_12_binoculars": LevelLocation("3b_12_binoculars", "Celestial Resort B - Room 12 Binoculars", "3b_12_west", LocationType.binoculars, []), + "3b_end_clear": LevelLocation("3b_end_clear", "Celestial Resort B - Level Clear", "3b_end_goal", LocationType.level_clear, []), + "3b_end_golden": LevelLocation("3b_end_golden", "Celestial Resort B - Golden Strawberry", "3b_end_goal", LocationType.golden_strawberry, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.moving_platforms, ItemName.sinking_platforms, ], ]), + + "3c_02_binoculars": LevelLocation("3c_02_binoculars", "Celestial Resort C - Room 02 Binoculars", "3c_02_west", LocationType.binoculars, []), + "3c_02_clear": LevelLocation("3c_02_clear", "Celestial Resort C - Level Clear", "3c_02_goal", LocationType.level_clear, []), + "3c_02_golden": LevelLocation("3c_02_golden", "Celestial Resort C - Golden Strawberry", "3c_02_goal", LocationType.golden_strawberry, [[ItemName.sinking_platforms, ItemName.dash_refills, ItemName.coins, ], ]), + + "4a_a-01x_strawberry": LevelLocation("4a_a-01x_strawberry", "Golden Ridge A - Room a-01x Strawberry", "4a_a-01x_west", LocationType.strawberry, []), + "4a_a-02_strawberry": LevelLocation("4a_a-02_strawberry", "Golden Ridge A - Room a-02 Strawberry", "4a_a-02_west", LocationType.strawberry, []), + "4a_a-03_strawberry": LevelLocation("4a_a-03_strawberry", "Golden Ridge A - Room a-03 Strawberry", "4a_a-03_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_a-04_strawberry": LevelLocation("4a_a-04_strawberry", "Golden Ridge A - Room a-04 Strawberry", "4a_a-04_east", LocationType.strawberry, [[ItemName.blue_clouds, ], ]), + "4a_a-06_strawberry": LevelLocation("4a_a-06_strawberry", "Golden Ridge A - Room a-06 Strawberry", "4a_a-06_west", LocationType.strawberry, []), + "4a_a-07_strawberry": LevelLocation("4a_a-07_strawberry", "Golden Ridge A - Room a-07 Strawberry", "4a_a-07_east", LocationType.strawberry, []), + "4a_a-10_strawberry": LevelLocation("4a_a-10_strawberry", "Golden Ridge A - Room a-10 Strawberry", "4a_a-10_east", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.springs, ], ]), + "4a_a-11_binoculars": LevelLocation("4a_a-11_binoculars", "Golden Ridge A - Room a-11 Binoculars", "4a_a-11_east", LocationType.binoculars, []), + "4a_a-11_cassette": LevelLocation("4a_a-11_cassette", "Golden Ridge A - Cassette", "4a_a-11_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "4a_a-09_strawberry": LevelLocation("4a_a-09_strawberry", "Golden Ridge A - Room a-09 Strawberry", "4a_a-09_top", LocationType.strawberry, []), + "4a_b-01_strawberry_1": LevelLocation("4a_b-01_strawberry_1", "Golden Ridge A - Room b-01 Strawberry 1", "4a_b-01_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-01_strawberry_2": LevelLocation("4a_b-01_strawberry_2", "Golden Ridge A - Room b-01 Strawberry 2", "4a_b-01_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-04_strawberry": LevelLocation("4a_b-04_strawberry", "Golden Ridge A - Room b-04 Strawberry", "4a_b-04_north-west", LocationType.strawberry, []), + "4a_b-07_strawberry": LevelLocation("4a_b-07_strawberry", "Golden Ridge A - Room b-07 Strawberry", "4a_b-07_west", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "4a_b-03_strawberry": LevelLocation("4a_b-03_strawberry", "Golden Ridge A - Room b-03 Strawberry", "4a_b-03_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-02_strawberry_1": LevelLocation("4a_b-02_strawberry_1", "Golden Ridge A - Room b-02 Strawberry 1", "4a_b-02_south-west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-02_binoculars": LevelLocation("4a_b-02_binoculars", "Golden Ridge A - Room b-02 Binoculars", "4a_b-02_south-west", LocationType.binoculars, []), + "4a_b-02_strawberry_2": LevelLocation("4a_b-02_strawberry_2", "Golden Ridge A - Room b-02 Strawberry 2", "4a_b-02_north-east", LocationType.strawberry, []), + "4a_b-sec_crystal_heart": LevelLocation("4a_b-sec_crystal_heart", "Golden Ridge A - Crystal Heart", "4a_b-sec_west", LocationType.crystal_heart, [[ItemName.white_block, ], ]), + "4a_b-secb_strawberry": LevelLocation("4a_b-secb_strawberry", "Golden Ridge A - Room b-secb Strawberry", "4a_b-secb_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-08_strawberry": LevelLocation("4a_b-08_strawberry", "Golden Ridge A - Room b-08 Strawberry", "4a_b-08_west", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + "4a_c-00_strawberry": LevelLocation("4a_c-00_strawberry", "Golden Ridge A - Room c-00 Strawberry", "4a_c-00_west", LocationType.strawberry, []), + "4a_c-01_strawberry": LevelLocation("4a_c-01_strawberry", "Golden Ridge A - Room c-01 Strawberry", "4a_c-01_east", LocationType.strawberry, []), + "4a_c-05_strawberry": LevelLocation("4a_c-05_strawberry", "Golden Ridge A - Room c-05 Strawberry", "4a_c-05_east", LocationType.strawberry, [[ItemName.blue_boosters, ItemName.move_blocks, ], ]), + "4a_c-06_strawberry": LevelLocation("4a_c-06_strawberry", "Golden Ridge A - Room c-06 Strawberry", "4a_c-06_west", LocationType.strawberry, [[ItemName.coins, ItemName.move_blocks, ], ]), + "4a_c-06b_strawberry": LevelLocation("4a_c-06b_strawberry", "Golden Ridge A - Room c-06b Strawberry", "4a_c-06b_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.blue_boosters, ], ]), + "4a_c-08_strawberry": LevelLocation("4a_c-08_strawberry", "Golden Ridge A - Room c-08 Strawberry", "4a_c-08_east", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_c-10_strawberry": LevelLocation("4a_c-10_strawberry", "Golden Ridge A - Room c-10 Strawberry", "4a_c-10_top", LocationType.strawberry, []), + "4a_d-00b_strawberry": LevelLocation("4a_d-00b_strawberry", "Golden Ridge A - Room d-00b Strawberry", "4a_d-00b_east", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "4a_d-00b_binoculars": LevelLocation("4a_d-00b_binoculars", "Golden Ridge A - Room d-00b Binoculars", "4a_d-00b_east", LocationType.binoculars, []), + "4a_d-01_strawberry": LevelLocation("4a_d-01_strawberry", "Golden Ridge A - Room d-01 Strawberry", "4a_d-01_east", LocationType.strawberry, []), + "4a_d-04_strawberry": LevelLocation("4a_d-04_strawberry", "Golden Ridge A - Room d-04 Strawberry", "4a_d-04_east", LocationType.strawberry, []), + "4a_d-07_strawberry": LevelLocation("4a_d-07_strawberry", "Golden Ridge A - Room d-07 Strawberry", "4a_d-07_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_d-09_strawberry": LevelLocation("4a_d-09_strawberry", "Golden Ridge A - Room d-09 Strawberry", "4a_d-09_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_d-10_clear": LevelLocation("4a_d-10_clear", "Golden Ridge A - Level Clear", "4a_d-10_goal", LocationType.level_clear, []), + "4a_d-10_golden": LevelLocation("4a_d-10_golden", "Golden Ridge A - Golden Strawberry", "4a_d-10_goal", LocationType.golden_strawberry, [[ItemName.blue_clouds, ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ], ]), + + "4b_b-02_binoculars": LevelLocation("4b_b-02_binoculars", "Golden Ridge B - Room b-02 Binoculars", "4b_b-02_bottom", LocationType.binoculars, []), + "4b_c-03_binoculars": LevelLocation("4b_c-03_binoculars", "Golden Ridge B - Room c-03 Binoculars", "4b_c-03_bottom", LocationType.binoculars, []), + "4b_d-01_binoculars": LevelLocation("4b_d-01_binoculars", "Golden Ridge B - Room d-01 Binoculars", "4b_d-01_west", LocationType.binoculars, []), + "4b_end_binoculars": LevelLocation("4b_end_binoculars", "Golden Ridge B - Room end Binoculars", "4b_end_west", LocationType.binoculars, []), + "4b_end_clear": LevelLocation("4b_end_clear", "Golden Ridge B - Level Clear", "4b_end_goal", LocationType.level_clear, []), + "4b_end_golden": LevelLocation("4b_end_golden", "Golden Ridge B - Golden Strawberry", "4b_end_goal", LocationType.golden_strawberry, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.moving_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ], ]), + + "4c_01_binoculars": LevelLocation("4c_01_binoculars", "Golden Ridge C - Room 01 Binoculars", "4c_01_west", LocationType.binoculars, []), + "4c_02_binoculars": LevelLocation("4c_02_binoculars", "Golden Ridge C - Room 02 Binoculars", "4c_02_west", LocationType.binoculars, []), + "4c_02_clear": LevelLocation("4c_02_clear", "Golden Ridge C - Level Clear", "4c_02_goal", LocationType.level_clear, []), + "4c_02_golden": LevelLocation("4c_02_golden", "Golden Ridge C - Golden Strawberry", "4c_02_goal", LocationType.golden_strawberry, [[ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ], ]), + + "5a_a-00x_strawberry": LevelLocation("5a_a-00x_strawberry", "Mirror Temple A - Room a-00x Strawberry", "5a_a-00x_east", LocationType.strawberry, []), + "5a_a-01_strawberry_1": LevelLocation("5a_a-01_strawberry_1", "Mirror Temple A - Room a-01 Strawberry 1", "5a_a-01_center", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_a-01_strawberry_2": LevelLocation("5a_a-01_strawberry_2", "Mirror Temple A - Room a-01 Strawberry 2", "5a_a-01_center", LocationType.strawberry, []), + "5a_a-02_strawberry": LevelLocation("5a_a-02_strawberry", "Mirror Temple A - Room a-02 Strawberry", "5a_a-02_west", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_a-03_strawberry": LevelLocation("5a_a-03_strawberry", "Mirror Temple A - Room a-03 Strawberry", "5a_a-03_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_a-04_strawberry": LevelLocation("5a_a-04_strawberry", "Mirror Temple A - Room a-04 Strawberry", "5a_a-04_east", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.springs, ], ]), + "5a_a-05_strawberry": LevelLocation("5a_a-05_strawberry", "Mirror Temple A - Room a-05 Strawberry", "5a_a-05_center", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_a-06_strawberry": LevelLocation("5a_a-06_strawberry", "Mirror Temple A - Room a-06 Strawberry", "5a_a-06_west", LocationType.strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_a-07_strawberry": LevelLocation("5a_a-07_strawberry", "Mirror Temple A - Room a-07 Strawberry", "5a_a-07_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + "5a_a-08_key_1": LevelLocation("5a_a-08_key_1", "Mirror Temple A - Entrance Key", "5a_a-08_east", LocationType.key, []), + "5a_a-11_strawberry": LevelLocation("5a_a-11_strawberry", "Mirror Temple A - Room a-11 Strawberry", "5a_a-11_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + "5a_a-15_strawberry": LevelLocation("5a_a-15_strawberry", "Mirror Temple A - Room a-15 Strawberry", "5a_a-15_south", LocationType.strawberry, [[ItemName.coins, ItemName.red_boosters, ], ]), + "5a_a-14_strawberry": LevelLocation("5a_a-14_strawberry", "Mirror Temple A - Room a-14 Strawberry", "5a_a-14_south", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5a_b-18_strawberry": LevelLocation("5a_b-18_strawberry", "Mirror Temple A - Room b-18 Strawberry", "5a_b-18_south", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-01c_strawberry": LevelLocation("5a_b-01c_strawberry", "Mirror Temple A - Room b-01c Strawberry", "5a_b-01c_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-20_strawberry_1": LevelLocation("5a_b-20_strawberry_1", "Mirror Temple A - Room b-20 Strawberry 1", "5a_b-20_south", LocationType.strawberry, []), + "5a_b-20_strawberry_2": LevelLocation("5a_b-20_strawberry_2", "Mirror Temple A - Room b-20 Strawberry 2", "5a_b-20_east", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_b-21_strawberry": LevelLocation("5a_b-21_strawberry", "Mirror Temple A - Room b-21 Strawberry", "5a_b-21_east", LocationType.strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-03_strawberry": LevelLocation("5a_b-03_strawberry", "Mirror Temple A - Room b-03 Strawberry", "5a_b-03_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-05_strawberry": LevelLocation("5a_b-05_strawberry", "Mirror Temple A - Room b-05 Strawberry", "5a_b-05_west", LocationType.strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-04_key_2": LevelLocation("5a_b-04_key_2", "Mirror Temple A - Depths Key", "5a_b-04_east", LocationType.key, []), + "5a_b-10_strawberry": LevelLocation("5a_b-10_strawberry", "Mirror Temple A - Room b-10 Strawberry", "5a_b-10_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-12_strawberry": LevelLocation("5a_b-12_strawberry", "Mirror Temple A - Room b-12 Strawberry", "5a_b-12_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-17_strawberry_2": LevelLocation("5a_b-17_strawberry_2", "Mirror Temple A - Room b-17 Strawberry 2", "5a_b-17_west", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.springs, ], ]), + "5a_b-17_strawberry_1": LevelLocation("5a_b-17_strawberry_1", "Mirror Temple A - Room b-17 Strawberry 1", "5a_b-17_north-west", LocationType.strawberry, []), + "5a_b-22_binoculars": LevelLocation("5a_b-22_binoculars", "Mirror Temple A - Room b-22 Binoculars", "5a_b-22_west", LocationType.binoculars, []), + "5a_b-22_cassette": LevelLocation("5a_b-22_cassette", "Mirror Temple A - Cassette", "5a_b-22_west", LocationType.cassette, [[ItemName.red_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "5a_b-15_crystal_heart": LevelLocation("5a_b-15_crystal_heart", "Mirror Temple A - Crystal Heart", "5a_b-15_west", LocationType.crystal_heart, [[ItemName.swap_blocks, ], ]), + "5a_c-08_strawberry": LevelLocation("5a_c-08_strawberry", "Mirror Temple A - Room c-08 Strawberry", "5a_c-08_east", LocationType.strawberry, [[ItemName.seekers, ], ]), + "5a_d-04_key_3": LevelLocation("5a_d-04_key_3", "Mirror Temple A - Search Key 1", "5a_d-04_south-west-left", LocationType.key, []), + "5a_d-04_key_4": LevelLocation("5a_d-04_key_4", "Mirror Temple A - Search Key 2", "5a_d-04_south-west-right", LocationType.key, []), + "5a_d-04_strawberry_2": LevelLocation("5a_d-04_strawberry_2", "Mirror Temple A - Room d-04 Strawberry 2", "5a_d-04_south-east", LocationType.strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-04_strawberry_1": LevelLocation("5a_d-04_strawberry_1", "Mirror Temple A - Room d-04 Strawberry 1", "5a_d-04_north", LocationType.strawberry, []), + "5a_d-15_strawberry_2": LevelLocation("5a_d-15_strawberry_2", "Mirror Temple A - Room d-15 Strawberry 2", "5a_d-15_center", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5a_d-15_key_5": LevelLocation("5a_d-15_key_5", "Mirror Temple A - Search Key 3", "5a_d-15_center", LocationType.key, [[ItemName.swap_blocks, ItemName.seekers, ], ]), + "5a_d-15_strawberry_1": LevelLocation("5a_d-15_strawberry_1", "Mirror Temple A - Room d-15 Strawberry 1", "5a_d-15_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_d-13_strawberry": LevelLocation("5a_d-13_strawberry", "Mirror Temple A - Room d-13 Strawberry", "5a_d-13_west", LocationType.strawberry, []), + "5a_d-19_strawberry": LevelLocation("5a_d-19_strawberry", "Mirror Temple A - Room d-19 Strawberry", "5a_d-19_east", LocationType.strawberry, [["Mirror Temple A - Search Key 3", ], ]), + "5a_e-06_strawberry": LevelLocation("5a_e-06_strawberry", "Mirror Temple A - Room e-06 Strawberry", "5a_e-06_east", LocationType.strawberry, [[ItemName.dash_switches, ], ]), + "5a_e-11_clear": LevelLocation("5a_e-11_clear", "Mirror Temple A - Level Clear", "5a_e-11_goal", LocationType.level_clear, []), + "5a_e-11_golden": LevelLocation("5a_e-11_golden", "Mirror Temple A - Golden Strawberry", "5a_e-11_goal", LocationType.golden_strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ItemName.dash_switches, "Mirror Temple A - Entrance Key", "Mirror Temple A - Depths Key", "Mirror Temple A - Search Key 1", "Mirror Temple A - Search Key 2", ItemName.seekers, ItemName.coins, ItemName.theo_crystal, ], ]), + + "5b_b-02_key_1": LevelLocation("5b_b-02_key_1", "Mirror Temple B - Central Chamber Key 1", "5b_b-02_south-west", LocationType.key, []), + "5b_b-02_key_2": LevelLocation("5b_b-02_key_2", "Mirror Temple B - Central Chamber Key 2", "5b_b-02_south-east", LocationType.key, []), + "5b_b-09_binoculars": LevelLocation("5b_b-09_binoculars", "Mirror Temple B - Room b-09 Binoculars", "5b_b-09_bottom", LocationType.binoculars, []), + "5b_d-05_clear": LevelLocation("5b_d-05_clear", "Mirror Temple B - Level Clear", "5b_d-05_goal", LocationType.level_clear, []), + "5b_d-05_golden": LevelLocation("5b_d-05_golden", "Mirror Temple B - Golden Strawberry", "5b_d-05_goal", LocationType.golden_strawberry, [["Mirror Temple B - Central Chamber Key 1", "Mirror Temple B - Central Chamber Key 2", ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.theo_crystal, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.swap_blocks, ], ]), + + "5c_02_binoculars": LevelLocation("5c_02_binoculars", "Mirror Temple C - Room 02 Binoculars", "5c_02_west", LocationType.binoculars, []), + "5c_02_clear": LevelLocation("5c_02_clear", "Mirror Temple C - Level Clear", "5c_02_goal", LocationType.level_clear, []), + "5c_02_golden": LevelLocation("5c_02_golden", "Mirror Temple C - Golden Strawberry", "5c_02_goal", LocationType.golden_strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ItemName.dash_switches, ItemName.swap_blocks, ], ]), + + "6a_04c_crystal_heart": LevelLocation("6a_04c_crystal_heart", "Reflection A - Crystal Heart", "6a_04c_east", LocationType.crystal_heart, []), + "6a_04e_binoculars": LevelLocation("6a_04e_binoculars", "Reflection A - Room 04e Binoculars", "6a_04e_east", LocationType.binoculars, []), + "6a_04e_cassette": LevelLocation("6a_04e_cassette", "Reflection A - Cassette", "6a_04e_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + "6a_boss-20_golden": LevelLocation("6a_boss-20_golden", "Reflection A - Golden Strawberry", "6a_boss-20_east", LocationType.golden_strawberry, [[ItemName.feathers, ItemName.dash_refills, ItemName.kevin_blocks, ItemName.bumpers, ItemName.springs, ], ]), + "6a_after-01_clear": LevelLocation("6a_after-01_clear", "Reflection A - Level Clear", "6a_after-01_goal", LocationType.level_clear, []), + + "6b_a-02_binoculars": LevelLocation("6b_a-02_binoculars", "Reflection B - Room a-02 Binoculars", "6b_a-02_bottom", LocationType.binoculars, []), + "6b_a-06_binoculars": LevelLocation("6b_a-06_binoculars", "Reflection B - Room a-06 Binoculars", "6b_a-06_west", LocationType.binoculars, []), + "6b_d-05_clear": LevelLocation("6b_d-05_clear", "Reflection B - Level Clear", "6b_d-05_goal", LocationType.level_clear, []), + "6b_d-05_golden": LevelLocation("6b_d-05_golden", "Reflection B - Golden Strawberry", "6b_d-05_goal", LocationType.golden_strawberry, [[ItemName.blue_cassette_blocks, ItemName.bumpers, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6c_02_binoculars_1": LevelLocation("6c_02_binoculars_1", "Reflection C - Room 02 Binoculars 1", "6c_02_west", LocationType.binoculars, []), + "6c_02_binoculars_2": LevelLocation("6c_02_binoculars_2", "Reflection C - Room 02 Binoculars 2", "6c_02_west", LocationType.binoculars, [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ], ]), + "6c_02_clear": LevelLocation("6c_02_clear", "Reflection C - Level Clear", "6c_02_goal", LocationType.level_clear, []), + "6c_02_golden": LevelLocation("6c_02_golden", "Reflection C - Golden Strawberry", "6c_02_goal", LocationType.golden_strawberry, [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.feathers, ], ]), + + "7a_a-02b_strawberry": LevelLocation("7a_a-02b_strawberry", "The Summit A - Room a-02b Strawberry", "7a_a-02b_east", LocationType.strawberry, []), + "7a_a-04b_strawberry_1": LevelLocation("7a_a-04b_strawberry_1", "The Summit A - Room a-04b Strawberry 1", "7a_a-04b_east", LocationType.strawberry, [[ItemName.springs, ItemName.dash_refills, ], ]), + "7a_a-04b_strawberry_2": LevelLocation("7a_a-04b_strawberry_2", "The Summit A - Room a-04b Strawberry 2", "7a_a-04b_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_a-05_strawberry": LevelLocation("7a_a-05_strawberry", "The Summit A - Room a-05 Strawberry", "7a_a-05_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_a-06_gem_1": LevelLocation("7a_a-06_gem_1", "The Summit A - Gem 1", "7a_a-06_top-side", LocationType.gem, []), + "7a_b-01_binoculars": LevelLocation("7a_b-01_binoculars", "The Summit A - Room b-01 Binoculars", "7a_b-01_west", LocationType.binoculars, []), + "7a_b-02_binoculars": LevelLocation("7a_b-02_binoculars", "The Summit A - Room b-02 Binoculars", "7a_b-02_south", LocationType.binoculars, []), + "7a_b-02_strawberry": LevelLocation("7a_b-02_strawberry", "The Summit A - Room b-02 Strawberry", "7a_b-02_south", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "7a_b-02b_binoculars": LevelLocation("7a_b-02b_binoculars", "The Summit A - Room b-02b Binoculars", "7a_b-02b_south", LocationType.binoculars, []), + "7a_b-02b_strawberry": LevelLocation("7a_b-02b_strawberry", "The Summit A - Room b-02b Strawberry", "7a_b-02b_north-east", LocationType.strawberry, []), + "7a_b-02e_strawberry": LevelLocation("7a_b-02e_strawberry", "The Summit A - Room b-02e Strawberry", "7a_b-02e_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "7a_b-02d_gem_2": LevelLocation("7a_b-02d_gem_2", "The Summit A - Gem 2", "7a_b-02d_south", LocationType.gem, []), + "7a_b-04_strawberry": LevelLocation("7a_b-04_strawberry", "The Summit A - Room b-04 Strawberry", "7a_b-04_west", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_b-08_strawberry": LevelLocation("7a_b-08_strawberry", "The Summit A - Room b-08 Strawberry", "7a_b-08_east", LocationType.strawberry, []), + "7a_b-09_strawberry": LevelLocation("7a_b-09_strawberry", "The Summit A - Room b-09 Strawberry", "7a_b-09_top-side", LocationType.strawberry, []), + "7a_c-03b_binoculars": LevelLocation("7a_c-03b_binoculars", "The Summit A - Room c-03b Binoculars", "7a_c-03b_east", LocationType.binoculars, []), + "7a_c-03b_strawberry": LevelLocation("7a_c-03b_strawberry", "The Summit A - Room c-03b Strawberry", "7a_c-03b_east", LocationType.strawberry, [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "7a_c-05_binoculars": LevelLocation("7a_c-05_binoculars", "The Summit A - Room c-05 Binoculars", "7a_c-05_west", LocationType.binoculars, []), + "7a_c-05_strawberry": LevelLocation("7a_c-05_strawberry", "The Summit A - Room c-05 Strawberry", "7a_c-05_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-06b_strawberry": LevelLocation("7a_c-06b_strawberry", "The Summit A - Room c-06b Strawberry", "7a_c-06b_west", LocationType.strawberry, []), + "7a_c-06c_binoculars": LevelLocation("7a_c-06c_binoculars", "The Summit A - Room c-06c Binoculars", "7a_c-06c_west", LocationType.binoculars, []), + "7a_c-06c_gem_3": LevelLocation("7a_c-06c_gem_3", "The Summit A - Gem 3", "7a_c-06c_west", LocationType.gem, [[ItemName.dream_blocks, ItemName.coins, ], ]), + "7a_c-07b_binoculars": LevelLocation("7a_c-07b_binoculars", "The Summit A - Room c-07b Binoculars", "7a_c-07b_east", LocationType.binoculars, []), + "7a_c-07b_strawberry": LevelLocation("7a_c-07b_strawberry", "The Summit A - Room c-07b Strawberry", "7a_c-07b_east", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-08_strawberry": LevelLocation("7a_c-08_strawberry", "The Summit A - Room c-08 Strawberry", "7a_c-08_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-09_strawberry": LevelLocation("7a_c-09_strawberry", "The Summit A - Room c-09 Strawberry", "7a_c-09_top", LocationType.strawberry, []), + "7a_d-00_strawberry": LevelLocation("7a_d-00_strawberry", "The Summit A - Room d-00 Strawberry", "7a_d-00_bottom", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_d-01c_strawberry": LevelLocation("7a_d-01c_strawberry", "The Summit A - Room d-01c Strawberry", "7a_d-01c_east", LocationType.strawberry, [[ItemName.sinking_platforms, ], ]), + "7a_d-01d_strawberry": LevelLocation("7a_d-01d_strawberry", "The Summit A - Room d-01d Strawberry", "7a_d-01d_west", LocationType.strawberry, [[ItemName.coins, ItemName.dash_refills, ], ]), + "7a_d-03_strawberry": LevelLocation("7a_d-03_strawberry", "The Summit A - Room d-03 Strawberry", "7a_d-03_west", LocationType.strawberry, []), + "7a_d-03b_cassette": LevelLocation("7a_d-03b_cassette", "The Summit A - Cassette", "7a_d-03b_east", LocationType.cassette, [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + "7a_d-04_strawberry": LevelLocation("7a_d-04_strawberry", "The Summit A - Room d-04 Strawberry", "7a_d-04_west", LocationType.strawberry, []), + "7a_d-05b_gem_4": LevelLocation("7a_d-05b_gem_4", "The Summit A - Gem 4", "7a_d-05b_west", LocationType.gem, [[ItemName.dash_refills, ], ]), + "7a_d-07_strawberry": LevelLocation("7a_d-07_strawberry", "The Summit A - Room d-07 Strawberry", "7a_d-07_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_d-08_strawberry": LevelLocation("7a_d-08_strawberry", "The Summit A - Room d-08 Strawberry", "7a_d-08_east", LocationType.strawberry, []), + "7a_d-10b_strawberry": LevelLocation("7a_d-10b_strawberry", "The Summit A - Room d-10b Strawberry", "7a_d-10b_east", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_e-01c_gem_5": LevelLocation("7a_e-01c_gem_5", "The Summit A - Gem 5", "7a_e-01c_west", LocationType.gem, []), + "7a_e-02_strawberry": LevelLocation("7a_e-02_strawberry", "The Summit A - Room e-02 Strawberry", "7a_e-02_west", LocationType.strawberry, [[ItemName.pink_clouds, ], ]), + "7a_e-05_strawberry": LevelLocation("7a_e-05_strawberry", "The Summit A - Room e-05 Strawberry", "7a_e-05_east", LocationType.strawberry, []), + "7a_e-07_strawberry": LevelLocation("7a_e-07_strawberry", "The Summit A - Room e-07 Strawberry", "7a_e-07_bottom", LocationType.strawberry, [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "7a_e-09_strawberry": LevelLocation("7a_e-09_strawberry", "The Summit A - Room e-09 Strawberry", "7a_e-09_east", LocationType.strawberry, []), + "7a_e-11_strawberry": LevelLocation("7a_e-11_strawberry", "The Summit A - Room e-11 Strawberry", "7a_e-11_east", LocationType.strawberry, []), + "7a_e-12_strawberry": LevelLocation("7a_e-12_strawberry", "The Summit A - Room e-12 Strawberry", "7a_e-12_west", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.dash_refills, ], ]), + "7a_e-10_strawberry": LevelLocation("7a_e-10_strawberry", "The Summit A - Room e-10 Strawberry", "7a_e-10_south", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "7a_e-13_strawberry": LevelLocation("7a_e-13_strawberry", "The Summit A - Room e-13 Strawberry", "7a_e-13_top", LocationType.strawberry, []), + "7a_f-00_strawberry": LevelLocation("7a_f-00_strawberry", "The Summit A - Room f-00 Strawberry", "7a_f-00_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "7a_f-01_strawberry": LevelLocation("7a_f-01_strawberry", "The Summit A - Room f-01 Strawberry", "7a_f-01_south", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "7a_f-02b_gem_6": LevelLocation("7a_f-02b_gem_6", "The Summit A - Gem 6", "7a_f-02b_east", LocationType.gem, []), + "7a_f-07_strawberry": LevelLocation("7a_f-07_strawberry", "The Summit A - Room f-07 Strawberry", "7a_f-07_south-west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "7a_f-07_key": LevelLocation("7a_f-07_key", "The Summit A - 2500 M Key", "7a_f-07_south-east", LocationType.key, [[ItemName.red_boosters, ], ]), + "7a_f-08b_strawberry": LevelLocation("7a_f-08b_strawberry", "The Summit A - Room f-08b Strawberry", "7a_f-08b_east", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "7a_f-08c_strawberry": LevelLocation("7a_f-08c_strawberry", "The Summit A - Room f-08c Strawberry", "7a_f-08c_east", LocationType.strawberry, []), + "7a_f-11_strawberry_1": LevelLocation("7a_f-11_strawberry_1", "The Summit A - Room f-11 Strawberry 1", "7a_f-11_top", LocationType.strawberry, []), + "7a_f-11_strawberry_2": LevelLocation("7a_f-11_strawberry_2", "The Summit A - Room f-11 Strawberry 2", "7a_f-11_top", LocationType.strawberry, []), + "7a_f-11_strawberry_3": LevelLocation("7a_f-11_strawberry_3", "The Summit A - Room f-11 Strawberry 3", "7a_f-11_top", LocationType.strawberry, [[ItemName.dash_switches, ], ]), + "7a_g-00b_crystal_heart": LevelLocation("7a_g-00b_crystal_heart", "The Summit A - Crystal Heart", "7a_g-00b_bottom", LocationType.crystal_heart, [["The Summit A - Gem 1", "The Summit A - Gem 2", "The Summit A - Gem 3", "The Summit A - Gem 4", "The Summit A - Gem 5", "The Summit A - Gem 6", ], ]), + "7a_g-00b_strawberry_1": LevelLocation("7a_g-00b_strawberry_1", "The Summit A - Room g-00b Strawberry 1", "7a_g-00b_c26", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_g-00b_strawberry_2": LevelLocation("7a_g-00b_strawberry_2", "The Summit A - Room g-00b Strawberry 2", "7a_g-00b_c24", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_g-00b_strawberry_3": LevelLocation("7a_g-00b_strawberry_3", "The Summit A - Room g-00b Strawberry 3", "7a_g-00b_c21", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_g-01_strawberry_1": LevelLocation("7a_g-01_strawberry_1", "The Summit A - Room g-01 Strawberry 1", "7a_g-01_c18", LocationType.strawberry, [[ItemName.dash_refills, ItemName.blue_clouds, ], ]), + "7a_g-01_strawberry_2": LevelLocation("7a_g-01_strawberry_2", "The Summit A - Room g-01 Strawberry 2", "7a_g-01_c16", LocationType.strawberry, []), + "7a_g-01_strawberry_3": LevelLocation("7a_g-01_strawberry_3", "The Summit A - Room g-01 Strawberry 3", "7a_g-01_c16", LocationType.strawberry, []), + "7a_g-03_binoculars": LevelLocation("7a_g-03_binoculars", "The Summit A - Room g-03 Binoculars", "7a_g-03_bottom", LocationType.binoculars, [[ItemName.springs, ], ]), + "7a_g-03_strawberry": LevelLocation("7a_g-03_strawberry", "The Summit A - Room g-03 Strawberry", "7a_g-03_bottom", LocationType.strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ], ]), + "7a_g-03_clear": LevelLocation("7a_g-03_clear", "The Summit A - Level Clear", "7a_g-03_goal", LocationType.level_clear, []), + "7a_g-03_golden": LevelLocation("7a_g-03_golden", "The Summit A - Golden Strawberry", "7a_g-03_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ItemName.red_boosters, ItemName.swap_blocks, ItemName.dash_switches, "The Summit A - 2500 M Key", ItemName.move_blocks, ItemName.blue_boosters, ItemName.dream_blocks, ItemName.traffic_blocks, ], ]), + + "7b_b-01_binoculars": LevelLocation("7b_b-01_binoculars", "The Summit B - Room b-01 Binoculars", "7b_b-01_bottom", LocationType.binoculars, []), + "7b_b-02_binoculars": LevelLocation("7b_b-02_binoculars", "The Summit B - Room b-02 Binoculars", "7b_b-02_west", LocationType.binoculars, [[ItemName.springs, ], ]), + "7b_g-03_clear": LevelLocation("7b_g-03_clear", "The Summit B - Level Clear", "7b_g-03_goal", LocationType.level_clear, []), + "7b_g-03_golden": LevelLocation("7b_g-03_golden", "The Summit B - Golden Strawberry", "7b_g-03_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ItemName.red_boosters, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.dream_blocks, ItemName.traffic_blocks, ], ]), + + "7c_01_binoculars": LevelLocation("7c_01_binoculars", "The Summit C - Room 01 Binoculars", "7c_01_west", LocationType.binoculars, []), + "7c_03_binoculars": LevelLocation("7c_03_binoculars", "The Summit C - Room 03 Binoculars", "7c_03_west", LocationType.binoculars, []), + "7c_03_clear": LevelLocation("7c_03_clear", "The Summit C - Level Clear", "7c_03_goal", LocationType.level_clear, []), + "7c_03_golden": LevelLocation("7c_03_golden", "The Summit C - Golden Strawberry", "7c_03_goal", LocationType.golden_strawberry, [[ItemName.pink_clouds, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ], ]), + + + "9a_0x_car": LevelLocation("9a_0x_car", "Core A - Car", "9a_0x_east", LocationType.car, []), + "9a_b-06_strawberry": LevelLocation("9a_b-06_strawberry", "Core A - Room b-06 Strawberry", "9a_b-06_east", LocationType.strawberry, [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ], ]), + "9a_c-00b_strawberry": LevelLocation("9a_c-00b_strawberry", "Core A - Room c-00b Strawberry", "9a_c-00b_west", LocationType.strawberry, [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + "9a_c-02_strawberry": LevelLocation("9a_c-02_strawberry", "Core A - Room c-02 Strawberry", "9a_c-02_west", LocationType.strawberry, [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + "9a_c-03b_strawberry": LevelLocation("9a_c-03b_strawberry", "Core A - Room c-03b Strawberry", "9a_c-03b_south", LocationType.strawberry, [[ItemName.core_toggles, ], ]), + "9a_d-06_strawberry": LevelLocation("9a_d-06_strawberry", "Core A - Room d-06 Strawberry", "9a_d-06_bottom", LocationType.strawberry, [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + "9a_d-11_cassette": LevelLocation("9a_d-11_cassette", "Core A - Cassette", "9a_d-11_center", LocationType.cassette, []), + "9a_space_clear": LevelLocation("9a_space_clear", "Core A - Level Clear", "9a_space_goal", LocationType.level_clear, []), + "9a_space_golden": LevelLocation("9a_space_golden", "Core A - Golden Strawberry", "9a_space_goal", LocationType.golden_strawberry, [[ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.bumpers, ItemName.feathers, ItemName.badeline_boosters, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9b_space_clear": LevelLocation("9b_space_clear", "Core B - Level Clear", "9b_space_goal", LocationType.level_clear, []), + "9b_space_golden": LevelLocation("9b_space_golden", "Core B - Golden Strawberry", "9b_space_goal", LocationType.golden_strawberry, [[ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ItemName.springs, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.badeline_boosters, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9c_01_binoculars": LevelLocation("9c_01_binoculars", "Core C - Room 01 Binoculars", "9c_01_west", LocationType.binoculars, []), + "9c_02_binoculars": LevelLocation("9c_02_binoculars", "Core C - Room 02 Binoculars", "9c_02_west", LocationType.binoculars, []), + "9c_02_clear": LevelLocation("9c_02_clear", "Core C - Level Clear", "9c_02_goal", LocationType.level_clear, []), + "9c_02_golden": LevelLocation("9c_02_golden", "Core C - Golden Strawberry", "9c_02_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.dream_blocks, ItemName.bumpers, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ], ]), + + "10a_a-04_binoculars": LevelLocation("10a_a-04_binoculars", "Farewell - Room a-04 Binoculars", "10a_a-04_west", LocationType.binoculars, []), + "10a_b-06_binoculars": LevelLocation("10a_b-06_binoculars", "Farewell - Room b-06 Binoculars", "10a_b-06_west", LocationType.binoculars, []), + "10a_d-00_binoculars": LevelLocation("10a_d-00_binoculars", "Farewell - Room d-00 Binoculars", "10a_d-00_south", LocationType.binoculars, []), + "10a_d-04_binoculars": LevelLocation("10a_d-04_binoculars", "Farewell - Room d-04 Binoculars", "10a_d-04_west", LocationType.binoculars, []), + "10a_d-04_key_1": LevelLocation("10a_d-04_key_1", "Farewell - Power Source Key 1", "10a_d-04_west", LocationType.key, [[ItemName.double_dash_refills, ItemName.jellyfish, ], ]), + "10a_d-03_binoculars": LevelLocation("10a_d-03_binoculars", "Farewell - Room d-03 Binoculars", "10a_d-03_west", LocationType.binoculars, [[ItemName.breaker_boxes, ], ]), + "10a_d-03_key_2": LevelLocation("10a_d-03_key_2", "Farewell - Power Source Key 2", "10a_d-03_west", LocationType.key, [[ItemName.breaker_boxes, ItemName.double_dash_refills, ItemName.jellyfish, ], ]), + "10a_d-01_binoculars": LevelLocation("10a_d-01_binoculars", "Farewell - Room d-01 Binoculars", "10a_d-01_east", LocationType.binoculars, []), + "10a_d-01_key_3": LevelLocation("10a_d-01_key_3", "Farewell - Power Source Key 3", "10a_d-01_east", LocationType.key, [[ItemName.dash_refills, ItemName.dash_switches, ItemName.jellyfish, ], ]), + "10a_d-02_binoculars": LevelLocation("10a_d-02_binoculars", "Farewell - Room d-02 Binoculars", "10a_d-02_bottom", LocationType.binoculars, [[ItemName.breaker_boxes, ], ]), + "10a_d-02_key_4": LevelLocation("10a_d-02_key_4", "Farewell - Power Source Key 4", "10a_d-02_bottom", LocationType.key, [[ItemName.breaker_boxes, ItemName.double_dash_refills, ItemName.springs, ItemName.move_blocks, ItemName.jellyfish, ], ]), + "10a_d-05_binoculars": LevelLocation("10a_d-05_binoculars", "Farewell - Room d-05 Binoculars", "10a_d-05_west", LocationType.binoculars, []), + "10a_d-05_key_5": LevelLocation("10a_d-05_key_5", "Farewell - Power Source Key 5", "10a_d-05_west", LocationType.key, [[ItemName.double_dash_refills, ItemName.coins, ItemName.red_boosters, ItemName.jellyfish, ], ]), + "10a_e-00yb_binoculars": LevelLocation("10a_e-00yb_binoculars", "Farewell - Room e-00yb Binoculars", "10a_e-00yb_south", LocationType.binoculars, []), + "10a_e-00b_binoculars": LevelLocation("10a_e-00b_binoculars", "Farewell - Room e-00b Binoculars", "10a_e-00b_south", LocationType.binoculars, []), + "10a_e-01_binoculars": LevelLocation("10a_e-01_binoculars", "Farewell - Room e-01 Binoculars", "10a_e-01_south", LocationType.binoculars, []), + "10a_e-01_car": LevelLocation("10a_e-01_car", "Farewell - Secret Car", "10a_e-01_south", LocationType.car, [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ], ]), + "10a_e-02_binoculars": LevelLocation("10a_e-02_binoculars", "Farewell - Room e-02 Binoculars", "10a_e-02_west", LocationType.binoculars, []), + "10a_e-04_binoculars": LevelLocation("10a_e-04_binoculars", "Farewell - Room e-04 Binoculars", "10a_e-04_west", LocationType.binoculars, []), + "10a_e-08_binoculars": LevelLocation("10a_e-08_binoculars", "Farewell - Room e-08 Binoculars", "10a_e-08_west", LocationType.binoculars, []), + "10a_e-08_crystal_heart": LevelLocation("10a_e-08_crystal_heart", "Farewell - Crystal Heart?", "10a_e-08_east", LocationType.crystal_heart, []), + + "10b_f-00_car": LevelLocation("10b_f-00_car", "Farewell - Internet Car", "10b_f-00_west", LocationType.car, []), + "10b_f-06_binoculars": LevelLocation("10b_f-06_binoculars", "Farewell - Room f-06 Binoculars", "10b_f-06_west", LocationType.binoculars, []), + "10b_f-07_binoculars": LevelLocation("10b_f-07_binoculars", "Farewell - Room f-07 Binoculars", "10b_f-07_west", LocationType.binoculars, []), + "10b_f-08_binoculars": LevelLocation("10b_f-08_binoculars", "Farewell - Room f-08 Binoculars", "10b_f-08_west", LocationType.binoculars, []), + "10b_f-09_binoculars": LevelLocation("10b_f-09_binoculars", "Farewell - Room f-09 Binoculars", "10b_f-09_west", LocationType.binoculars, []), + "10b_g-00_binoculars": LevelLocation("10b_g-00_binoculars", "Farewell - Room g-00 Binoculars", "10b_g-00_bottom", LocationType.binoculars, []), + "10b_g-04_binoculars": LevelLocation("10b_g-04_binoculars", "Farewell - Room g-04 Binoculars", "10b_g-04_west", LocationType.binoculars, []), + "10b_g-06_binoculars": LevelLocation("10b_g-06_binoculars", "Farewell - Room g-06 Binoculars", "10b_g-06_west", LocationType.binoculars, [[ItemName.double_dash_refills, ItemName.dash_refills, ItemName.springs, ItemName.feathers, ], ]), + "10b_h-01_binoculars": LevelLocation("10b_h-01_binoculars", "Farewell - Room h-01 Binoculars", "10b_h-01_west", LocationType.binoculars, []), + "10b_h-02_binoculars": LevelLocation("10b_h-02_binoculars", "Farewell - Room h-02 Binoculars", "10b_h-02_west", LocationType.binoculars, []), + "10b_h-03b_binoculars": LevelLocation("10b_h-03b_binoculars", "Farewell - Room h-03b Binoculars", "10b_h-03b_west", LocationType.binoculars, []), + "10b_h-04_binoculars": LevelLocation("10b_h-04_binoculars", "Farewell - Room h-04 Binoculars", "10b_h-04_top", LocationType.binoculars, []), + "10b_h-05_binoculars": LevelLocation("10b_h-05_binoculars", "Farewell - Room h-05 Binoculars", "10b_h-05_top", LocationType.binoculars, []), + "10b_h-06b_binoculars": LevelLocation("10b_h-06b_binoculars", "Farewell - Room h-06b Binoculars", "10b_h-06b_bottom", LocationType.binoculars, []), + "10b_h-07_binoculars_1": LevelLocation("10b_h-07_binoculars_1", "Farewell - Room h-07 Binoculars 1", "10b_h-07_west", LocationType.binoculars, []), + "10b_h-07_binoculars_2": LevelLocation("10b_h-07_binoculars_2", "Farewell - Room h-07 Binoculars 2", "10b_h-07_west", LocationType.binoculars, [[ItemName.blue_boosters, ItemName.springs, ItemName.coins, ], ]), + "10b_h-08_binoculars": LevelLocation("10b_h-08_binoculars", "Farewell - Room h-08 Binoculars", "10b_h-08_west", LocationType.binoculars, []), + "10b_h-09_binoculars": LevelLocation("10b_h-09_binoculars", "Farewell - Room h-09 Binoculars", "10b_h-09_west", LocationType.binoculars, []), + "10b_i-00b_binoculars": LevelLocation("10b_i-00b_binoculars", "Farewell - Room i-00b Binoculars", "10b_i-00b_west", LocationType.binoculars, []), + "10b_i-02_binoculars": LevelLocation("10b_i-02_binoculars", "Farewell - Room i-02 Binoculars", "10b_i-02_west", LocationType.binoculars, []), + "10b_i-04_binoculars": LevelLocation("10b_i-04_binoculars", "Farewell - Room i-04 Binoculars", "10b_i-04_west", LocationType.binoculars, []), + "10b_i-05_binoculars": LevelLocation("10b_i-05_binoculars", "Farewell - Room i-05 Binoculars", "10b_i-05_west", LocationType.binoculars, []), + "10b_j-16_binoculars": LevelLocation("10b_j-16_binoculars", "Farewell - Room j-16 Binoculars", "10b_j-16_west", LocationType.binoculars, []), + "10b_j-19_binoculars": LevelLocation("10b_j-19_binoculars", "Farewell - Room j-19 Binoculars", "10b_j-19_bottom", LocationType.binoculars, []), + "10b_j-19_moon_berry": LevelLocation("10b_j-19_moon_berry", "Farewell - Moon Berry", "10b_j-19_top", LocationType.strawberry, []), + "10b_GOAL_clear": LevelLocation("10b_GOAL_clear", "Farewell - Level Clear", "10b_GOAL_main", LocationType.level_clear, []), + + "10c_end-golden_binoculars_1": LevelLocation("10c_end-golden_binoculars_1", "Farewell - Room end-golden Binoculars 1", "10c_end-golden_bottom", LocationType.binoculars, []), + "10c_end-golden_binoculars_2": LevelLocation("10c_end-golden_binoculars_2", "Farewell - Room end-golden Binoculars 2", "10c_end-golden_bottom", LocationType.binoculars, []), + "10c_end-golden_binoculars_3": LevelLocation("10c_end-golden_binoculars_3", "Farewell - Room end-golden Binoculars 3", "10c_end-golden_bottom", LocationType.binoculars, [[ItemName.double_dash_refills, ItemName.jellyfish, ItemName.springs, ItemName.pufferfish, ], ]), + "10c_end-golden_golden": LevelLocation("10c_end-golden_golden", "Farewell - Golden Strawberry", "10c_end-golden_top", LocationType.golden_strawberry, [[ItemName.traffic_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.dream_blocks, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.coins, ItemName.red_boosters, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.badeline_boosters, ItemName.bird, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + +} + +all_regions: dict[str, PreRegion] = { + "0a_-1_main": PreRegion("0a_-1_main", "0a_-1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_-1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_-1_main"]), + "0a_-1_east": PreRegion("0a_-1_east", "0a_-1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_-1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_-1_east"]), + + "0a_0_west": PreRegion("0a_0_west", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_west"]), + "0a_0_main": PreRegion("0a_0_main", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_main"]), + "0a_0_north": PreRegion("0a_0_north", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_north"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_north"]), + "0a_0_east": PreRegion("0a_0_east", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_east"]), + + "0a_0b_south": PreRegion("0a_0b_south", "0a_0b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0b_south"]), + + "0a_1_west": PreRegion("0a_1_west", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_west"]), + "0a_1_main": PreRegion("0a_1_main", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_main"]), + "0a_1_east": PreRegion("0a_1_east", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_east"]), + + "0a_2_west": PreRegion("0a_2_west", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_west"]), + "0a_2_main": PreRegion("0a_2_main", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_main"]), + "0a_2_east": PreRegion("0a_2_east", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_east"]), + + "0a_3_west": PreRegion("0a_3_west", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_west"]), + "0a_3_main": PreRegion("0a_3_main", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_main"]), + "0a_3_east": PreRegion("0a_3_east", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_east"]), + + "1a_1_main": PreRegion("1a_1_main", "1a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_1_main"]), + "1a_1_east": PreRegion("1a_1_east", "1a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_1_east"]), + + "1a_2_west": PreRegion("1a_2_west", "1a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_2_west"]), + "1a_2_east": PreRegion("1a_2_east", "1a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_2_east"]), + + "1a_3_west": PreRegion("1a_3_west", "1a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3_west"]), + "1a_3_east": PreRegion("1a_3_east", "1a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3_east"]), + + "1a_4_west": PreRegion("1a_4_west", "1a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_4_west"]), + "1a_4_east": PreRegion("1a_4_east", "1a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_4_east"]), + + "1a_3b_west": PreRegion("1a_3b_west", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_west"]), + "1a_3b_east": PreRegion("1a_3b_east", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_east"]), + "1a_3b_top": PreRegion("1a_3b_top", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_top"]), + + "1a_5_bottom": PreRegion("1a_5_bottom", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_bottom"]), + "1a_5_west": PreRegion("1a_5_west", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_west"]), + "1a_5_north-west": PreRegion("1a_5_north-west", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_north-west"]), + "1a_5_center": PreRegion("1a_5_center", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_center"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_center"]), + "1a_5_south-east": PreRegion("1a_5_south-east", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_south-east"]), + "1a_5_north-east": PreRegion("1a_5_north-east", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_north-east"]), + "1a_5_top": PreRegion("1a_5_top", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_top"]), + + "1a_5z_east": PreRegion("1a_5z_east", "1a_5z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5z_east"]), + + "1a_5a_west": PreRegion("1a_5a_west", "1a_5a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5a_west"]), + + "1a_6_south-west": PreRegion("1a_6_south-west", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_south-west"]), + "1a_6_west": PreRegion("1a_6_west", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_west"]), + "1a_6_east": PreRegion("1a_6_east", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_east"]), + + "1a_6z_north-west": PreRegion("1a_6z_north-west", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_north-west"]), + "1a_6z_west": PreRegion("1a_6z_west", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_west"]), + "1a_6z_east": PreRegion("1a_6z_east", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_east"]), + + "1a_6zb_north-west": PreRegion("1a_6zb_north-west", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_north-west"]), + "1a_6zb_main": PreRegion("1a_6zb_main", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_main"]), + "1a_6zb_east": PreRegion("1a_6zb_east", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_east"]), + + "1a_7zb_west": PreRegion("1a_7zb_west", "1a_7zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7zb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7zb_west"]), + "1a_7zb_east": PreRegion("1a_7zb_east", "1a_7zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7zb_east"]), + + "1a_6a_west": PreRegion("1a_6a_west", "1a_6a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6a_west"]), + "1a_6a_east": PreRegion("1a_6a_east", "1a_6a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6a_east"]), + + "1a_6b_south-west": PreRegion("1a_6b_south-west", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_south-west"]), + "1a_6b_north-west": PreRegion("1a_6b_north-west", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_north-west"]), + "1a_6b_north-east": PreRegion("1a_6b_north-east", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_north-east"]), + + "1a_s0_west": PreRegion("1a_s0_west", "1a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s0_west"]), + "1a_s0_east": PreRegion("1a_s0_east", "1a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s0_east"]), + + "1a_s1_east": PreRegion("1a_s1_east", "1a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s1_east"]), + + "1a_6c_south-west": PreRegion("1a_6c_south-west", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_south-west"]), + "1a_6c_north-west": PreRegion("1a_6c_north-west", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_north-west"]), + "1a_6c_north-east": PreRegion("1a_6c_north-east", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_north-east"]), + + "1a_7_west": PreRegion("1a_7_west", "1a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7_west"]), + "1a_7_east": PreRegion("1a_7_east", "1a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7_east"]), + + "1a_7z_bottom": PreRegion("1a_7z_bottom", "1a_7z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7z_bottom"]), + "1a_7z_top": PreRegion("1a_7z_top", "1a_7z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7z_top"]), + + "1a_8z_bottom": PreRegion("1a_8z_bottom", "1a_8z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8z_bottom"]), + "1a_8z_top": PreRegion("1a_8z_top", "1a_8z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8z_top"]), + + "1a_8zb_west": PreRegion("1a_8zb_west", "1a_8zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8zb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8zb_west"]), + "1a_8zb_east": PreRegion("1a_8zb_east", "1a_8zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8zb_east"]), + + "1a_8_south-west": PreRegion("1a_8_south-west", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south-west"]), + "1a_8_west": PreRegion("1a_8_west", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_west"]), + "1a_8_south": PreRegion("1a_8_south", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south"]), + "1a_8_south-east": PreRegion("1a_8_south-east", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south-east"]), + "1a_8_north": PreRegion("1a_8_north", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_north"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_north"]), + "1a_8_north-east": PreRegion("1a_8_north-east", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_north-east"]), + + "1a_7a_east": PreRegion("1a_7a_east", "1a_7a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7a_east"]), + "1a_7a_west": PreRegion("1a_7a_west", "1a_7a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7a_west"]), + + "1a_9z_east": PreRegion("1a_9z_east", "1a_9z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9z_east"]), + + "1a_8b_east": PreRegion("1a_8b_east", "1a_8b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8b_east"]), + "1a_8b_west": PreRegion("1a_8b_west", "1a_8b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8b_west"]), + + "1a_9_east": PreRegion("1a_9_east", "1a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9_east"]), + "1a_9_west": PreRegion("1a_9_west", "1a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9_west"]), + + "1a_9b_east": PreRegion("1a_9b_east", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_east"]), + "1a_9b_north-east": PreRegion("1a_9b_north-east", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_north-east"]), + "1a_9b_west": PreRegion("1a_9b_west", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_west"]), + "1a_9b_north-west": PreRegion("1a_9b_north-west", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_north-west"]), + + "1a_9c_west": PreRegion("1a_9c_west", "1a_9c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9c_west"]), + + "1a_10_south-east": PreRegion("1a_10_south-east", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_south-east"]), + "1a_10_south-west": PreRegion("1a_10_south-west", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_south-west"]), + "1a_10_north-west": PreRegion("1a_10_north-west", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_north-west"]), + "1a_10_north-east": PreRegion("1a_10_north-east", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_north-east"]), + + "1a_10z_west": PreRegion("1a_10z_west", "1a_10z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10z_west"]), + "1a_10z_east": PreRegion("1a_10z_east", "1a_10z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10z_east"]), + + "1a_10zb_east": PreRegion("1a_10zb_east", "1a_10zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10zb_east"]), + + "1a_11_south-east": PreRegion("1a_11_south-east", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south-east"]), + "1a_11_south-west": PreRegion("1a_11_south-west", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south-west"]), + "1a_11_north": PreRegion("1a_11_north", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_north"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_north"]), + "1a_11_west": PreRegion("1a_11_west", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_west"]), + "1a_11_south": PreRegion("1a_11_south", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south"]), + + "1a_11z_east": PreRegion("1a_11z_east", "1a_11z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11z_east"]), + + "1a_10a_bottom": PreRegion("1a_10a_bottom", "1a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10a_bottom"]), + "1a_10a_top": PreRegion("1a_10a_top", "1a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10a_top"]), + + "1a_12_south-west": PreRegion("1a_12_south-west", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_south-west"]), + "1a_12_north-west": PreRegion("1a_12_north-west", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_north-west"]), + "1a_12_east": PreRegion("1a_12_east", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_east"]), + + "1a_12z_east": PreRegion("1a_12z_east", "1a_12z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12z_east"]), + + "1a_12a_bottom": PreRegion("1a_12a_bottom", "1a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12a_bottom"]), + "1a_12a_top": PreRegion("1a_12a_top", "1a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12a_top"]), + + "1a_end_south": PreRegion("1a_end_south", "1a_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_end_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_end_south"]), + "1a_end_main": PreRegion("1a_end_main", "1a_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_end_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_end_main"]), + + "1b_00_west": PreRegion("1b_00_west", "1b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_00_west"]), + "1b_00_east": PreRegion("1b_00_east", "1b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_00_east"]), + + "1b_01_west": PreRegion("1b_01_west", "1b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_01_west"]), + "1b_01_east": PreRegion("1b_01_east", "1b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_01_east"]), + + "1b_02_west": PreRegion("1b_02_west", "1b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02_west"]), + "1b_02_east": PreRegion("1b_02_east", "1b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02_east"]), + + "1b_02b_west": PreRegion("1b_02b_west", "1b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02b_west"]), + "1b_02b_east": PreRegion("1b_02b_east", "1b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02b_east"]), + + "1b_03_west": PreRegion("1b_03_west", "1b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_03_west"]), + "1b_03_east": PreRegion("1b_03_east", "1b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_03_east"]), + + "1b_04_west": PreRegion("1b_04_west", "1b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_04_west"]), + "1b_04_east": PreRegion("1b_04_east", "1b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_04_east"]), + + "1b_05_west": PreRegion("1b_05_west", "1b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05_west"]), + "1b_05_east": PreRegion("1b_05_east", "1b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05_east"]), + + "1b_05b_west": PreRegion("1b_05b_west", "1b_05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05b_west"]), + "1b_05b_east": PreRegion("1b_05b_east", "1b_05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05b_east"]), + + "1b_06_west": PreRegion("1b_06_west", "1b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_06_west"]), + "1b_06_east": PreRegion("1b_06_east", "1b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_06_east"]), + + "1b_07_bottom": PreRegion("1b_07_bottom", "1b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_07_bottom"]), + "1b_07_top": PreRegion("1b_07_top", "1b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_07_top"]), + + "1b_08_west": PreRegion("1b_08_west", "1b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08_west"]), + "1b_08_east": PreRegion("1b_08_east", "1b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08_east"]), + + "1b_08b_west": PreRegion("1b_08b_west", "1b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08b_west"]), + "1b_08b_east": PreRegion("1b_08b_east", "1b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08b_east"]), + + "1b_09_west": PreRegion("1b_09_west", "1b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_09_west"]), + "1b_09_east": PreRegion("1b_09_east", "1b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_09_east"]), + + "1b_10_west": PreRegion("1b_10_west", "1b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_10_west"]), + "1b_10_east": PreRegion("1b_10_east", "1b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_10_east"]), + + "1b_11_bottom": PreRegion("1b_11_bottom", "1b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_11_bottom"]), + "1b_11_top": PreRegion("1b_11_top", "1b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_11_top"]), + + "1b_end_west": PreRegion("1b_end_west", "1b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_end_west"]), + "1b_end_goal": PreRegion("1b_end_goal", "1b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_end_goal"]), + + "1c_00_west": PreRegion("1c_00_west", "1c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_00_west"]), + "1c_00_east": PreRegion("1c_00_east", "1c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_00_east"]), + + "1c_01_west": PreRegion("1c_01_west", "1c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_01_west"]), + "1c_01_east": PreRegion("1c_01_east", "1c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_01_east"]), + + "1c_02_west": PreRegion("1c_02_west", "1c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_02_west"]), + "1c_02_goal": PreRegion("1c_02_goal", "1c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_02_goal"]), + + "2a_start_main": PreRegion("2a_start_main", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_main"]), + "2a_start_top": PreRegion("2a_start_top", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_top"]), + "2a_start_east": PreRegion("2a_start_east", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_east"]), + + "2a_s0_bottom": PreRegion("2a_s0_bottom", "2a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s0_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s0_bottom"]), + "2a_s0_top": PreRegion("2a_s0_top", "2a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s0_top"]), + + "2a_s1_bottom": PreRegion("2a_s1_bottom", "2a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s1_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s1_bottom"]), + "2a_s1_top": PreRegion("2a_s1_top", "2a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s1_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s1_top"]), + + "2a_s2_bottom": PreRegion("2a_s2_bottom", "2a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s2_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s2_bottom"]), + + "2a_0_south-west": PreRegion("2a_0_south-west", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_south-west"]), + "2a_0_south-east": PreRegion("2a_0_south-east", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_south-east"]), + "2a_0_north-west": PreRegion("2a_0_north-west", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_north-west"]), + "2a_0_north-east": PreRegion("2a_0_north-east", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_north-east"]), + + "2a_1_south-west": PreRegion("2a_1_south-west", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south-west"]), + "2a_1_south": PreRegion("2a_1_south", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south"]), + "2a_1_south-east": PreRegion("2a_1_south-east", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south-east"]), + "2a_1_north-west": PreRegion("2a_1_north-west", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_north-west"]), + + "2a_d0_north": PreRegion("2a_d0_north", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north"]), + "2a_d0_north-west": PreRegion("2a_d0_north-west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north-west"]), + "2a_d0_west": PreRegion("2a_d0_west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_west"]), + "2a_d0_south-west": PreRegion("2a_d0_south-west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south-west"]), + "2a_d0_south": PreRegion("2a_d0_south", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south"]), + "2a_d0_south-east": PreRegion("2a_d0_south-east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south-east"]), + "2a_d0_east": PreRegion("2a_d0_east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_east"]), + "2a_d0_north-east": PreRegion("2a_d0_north-east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north-east"]), + + "2a_d7_west": PreRegion("2a_d7_west", "2a_d7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d7_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d7_west"]), + "2a_d7_east": PreRegion("2a_d7_east", "2a_d7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d7_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d7_east"]), + + "2a_d8_west": PreRegion("2a_d8_west", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_west"]), + "2a_d8_south-east": PreRegion("2a_d8_south-east", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_south-east"]), + "2a_d8_north-east": PreRegion("2a_d8_north-east", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_north-east"]), + + "2a_d3_west": PreRegion("2a_d3_west", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_west"]), + "2a_d3_north": PreRegion("2a_d3_north", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_north"]), + "2a_d3_south": PreRegion("2a_d3_south", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_south"]), + + "2a_d2_west": PreRegion("2a_d2_west", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_west"]), + "2a_d2_north-west": PreRegion("2a_d2_north-west", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_north-west"]), + "2a_d2_east": PreRegion("2a_d2_east", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_east"]), + + "2a_d9_north-west": PreRegion("2a_d9_north-west", "2a_d9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d9_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d9_north-west"]), + + "2a_d1_south-west": PreRegion("2a_d1_south-west", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_south-west"]), + "2a_d1_south-east": PreRegion("2a_d1_south-east", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_south-east"]), + "2a_d1_north-east": PreRegion("2a_d1_north-east", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_north-east"]), + + "2a_d6_west": PreRegion("2a_d6_west", "2a_d6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d6_west"]), + "2a_d6_east": PreRegion("2a_d6_east", "2a_d6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d6_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d6_east"]), + + "2a_d4_west": PreRegion("2a_d4_west", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_west"]), + "2a_d4_east": PreRegion("2a_d4_east", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_east"]), + "2a_d4_south": PreRegion("2a_d4_south", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_south"]), + + "2a_d5_west": PreRegion("2a_d5_west", "2a_d5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d5_west"]), + + "2a_3x_bottom": PreRegion("2a_3x_bottom", "2a_3x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3x_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3x_bottom"]), + "2a_3x_top": PreRegion("2a_3x_top", "2a_3x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3x_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3x_top"]), + + "2a_3_bottom": PreRegion("2a_3_bottom", "2a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3_bottom"]), + "2a_3_top": PreRegion("2a_3_top", "2a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3_top"]), + + "2a_4_bottom": PreRegion("2a_4_bottom", "2a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_4_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_4_bottom"]), + "2a_4_top": PreRegion("2a_4_top", "2a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_4_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_4_top"]), + + "2a_5_bottom": PreRegion("2a_5_bottom", "2a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_5_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_5_bottom"]), + "2a_5_top": PreRegion("2a_5_top", "2a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_5_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_5_top"]), + + "2a_6_bottom": PreRegion("2a_6_bottom", "2a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_6_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_6_bottom"]), + "2a_6_top": PreRegion("2a_6_top", "2a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_6_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_6_top"]), + + "2a_7_bottom": PreRegion("2a_7_bottom", "2a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_7_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_7_bottom"]), + "2a_7_top": PreRegion("2a_7_top", "2a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_7_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_7_top"]), + + "2a_8_bottom": PreRegion("2a_8_bottom", "2a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_8_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_8_bottom"]), + "2a_8_top": PreRegion("2a_8_top", "2a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_8_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_8_top"]), + + "2a_9_west": PreRegion("2a_9_west", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_west"]), + "2a_9_north": PreRegion("2a_9_north", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_north"]), + "2a_9_north-west": PreRegion("2a_9_north-west", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_north-west"]), + "2a_9_south": PreRegion("2a_9_south", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_south"]), + "2a_9_south-east": PreRegion("2a_9_south-east", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_south-east"]), + + "2a_9b_east": PreRegion("2a_9b_east", "2a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9b_east"]), + "2a_9b_west": PreRegion("2a_9b_west", "2a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9b_west"]), + + "2a_10_top": PreRegion("2a_10_top", "2a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_10_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_10_top"]), + "2a_10_bottom": PreRegion("2a_10_bottom", "2a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_10_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_10_bottom"]), + + "2a_2_north-west": PreRegion("2a_2_north-west", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_north-west"]), + "2a_2_south-west": PreRegion("2a_2_south-west", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_south-west"]), + "2a_2_south-east": PreRegion("2a_2_south-east", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_south-east"]), + + "2a_11_west": PreRegion("2a_11_west", "2a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_11_west"]), + "2a_11_east": PreRegion("2a_11_east", "2a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_11_east"]), + + "2a_12b_west": PreRegion("2a_12b_west", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_west"]), + "2a_12b_north": PreRegion("2a_12b_north", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_north"]), + "2a_12b_south": PreRegion("2a_12b_south", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_south"]), + "2a_12b_east": PreRegion("2a_12b_east", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_east"]), + "2a_12b_south-east": PreRegion("2a_12b_south-east", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_south-east"]), + + "2a_12c_south": PreRegion("2a_12c_south", "2a_12c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12c_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12c_south"]), + + "2a_12d_north-west": PreRegion("2a_12d_north-west", "2a_12d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12d_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12d_north-west"]), + "2a_12d_north": PreRegion("2a_12d_north", "2a_12d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12d_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12d_north"]), + + "2a_12_west": PreRegion("2a_12_west", "2a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12_west"]), + "2a_12_east": PreRegion("2a_12_east", "2a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12_east"]), + + "2a_13_west": PreRegion("2a_13_west", "2a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_13_west"]), + "2a_13_phone": PreRegion("2a_13_phone", "2a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_13_phone"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_13_phone"]), + + "2a_end_0_main": PreRegion("2a_end_0_main", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_main"]), + "2a_end_0_top": PreRegion("2a_end_0_top", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_top"]), + "2a_end_0_east": PreRegion("2a_end_0_east", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_east"]), + + "2a_end_s0_bottom": PreRegion("2a_end_s0_bottom", "2a_end_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s0_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s0_bottom"]), + "2a_end_s0_top": PreRegion("2a_end_s0_top", "2a_end_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s0_top"]), + + "2a_end_s1_bottom": PreRegion("2a_end_s1_bottom", "2a_end_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s1_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s1_bottom"]), + + "2a_end_1_west": PreRegion("2a_end_1_west", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_west"]), + "2a_end_1_north-east": PreRegion("2a_end_1_north-east", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_north-east"]), + "2a_end_1_east": PreRegion("2a_end_1_east", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_east"]), + + "2a_end_2_north-west": PreRegion("2a_end_2_north-west", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_north-west"]), + "2a_end_2_west": PreRegion("2a_end_2_west", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_west"]), + "2a_end_2_north-east": PreRegion("2a_end_2_north-east", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_north-east"]), + "2a_end_2_east": PreRegion("2a_end_2_east", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_east"]), + + "2a_end_3_north-west": PreRegion("2a_end_3_north-west", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_north-west"]), + "2a_end_3_west": PreRegion("2a_end_3_west", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_west"]), + "2a_end_3_east": PreRegion("2a_end_3_east", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_east"]), + + "2a_end_4_west": PreRegion("2a_end_4_west", "2a_end_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_4_west"]), + "2a_end_4_east": PreRegion("2a_end_4_east", "2a_end_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_4_east"]), + + "2a_end_3b_west": PreRegion("2a_end_3b_west", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_west"]), + "2a_end_3b_north": PreRegion("2a_end_3b_north", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_north"]), + "2a_end_3b_east": PreRegion("2a_end_3b_east", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_east"]), + + "2a_end_3cb_bottom": PreRegion("2a_end_3cb_bottom", "2a_end_3cb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3cb_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3cb_bottom"]), + "2a_end_3cb_top": PreRegion("2a_end_3cb_top", "2a_end_3cb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3cb_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3cb_top"]), + + "2a_end_3c_bottom": PreRegion("2a_end_3c_bottom", "2a_end_3c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3c_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3c_bottom"]), + + "2a_end_5_west": PreRegion("2a_end_5_west", "2a_end_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_5_west"]), + "2a_end_5_east": PreRegion("2a_end_5_east", "2a_end_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_5_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_5_east"]), + + "2a_end_6_west": PreRegion("2a_end_6_west", "2a_end_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_6_west"]), + "2a_end_6_main": PreRegion("2a_end_6_main", "2a_end_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_6_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_6_main"]), + + "2b_start_west": PreRegion("2b_start_west", "2b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_start_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_start_west"]), + "2b_start_east": PreRegion("2b_start_east", "2b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_start_east"]), + + "2b_00_west": PreRegion("2b_00_west", "2b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_00_west"]), + "2b_00_east": PreRegion("2b_00_east", "2b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_00_east"]), + + "2b_01_west": PreRegion("2b_01_west", "2b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01_west"]), + "2b_01_east": PreRegion("2b_01_east", "2b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01_east"]), + + "2b_01b_west": PreRegion("2b_01b_west", "2b_01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01b_west"]), + "2b_01b_east": PreRegion("2b_01b_east", "2b_01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01b_east"]), + + "2b_02b_west": PreRegion("2b_02b_west", "2b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02b_west"]), + "2b_02b_east": PreRegion("2b_02b_east", "2b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02b_east"]), + + "2b_02_west": PreRegion("2b_02_west", "2b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02_west"]), + "2b_02_east": PreRegion("2b_02_east", "2b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02_east"]), + + "2b_03_west": PreRegion("2b_03_west", "2b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_03_west"]), + "2b_03_east": PreRegion("2b_03_east", "2b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_03_east"]), + + "2b_04_bottom": PreRegion("2b_04_bottom", "2b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_04_bottom"]), + "2b_04_top": PreRegion("2b_04_top", "2b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_04_top"]), + + "2b_05_bottom": PreRegion("2b_05_bottom", "2b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_05_bottom"]), + "2b_05_top": PreRegion("2b_05_top", "2b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_05_top"]), + + "2b_06_west": PreRegion("2b_06_west", "2b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_06_west"]), + "2b_06_east": PreRegion("2b_06_east", "2b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_06_east"]), + + "2b_07_bottom": PreRegion("2b_07_bottom", "2b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_07_bottom"]), + "2b_07_top": PreRegion("2b_07_top", "2b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_07_top"]), + + "2b_08b_west": PreRegion("2b_08b_west", "2b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08b_west"]), + "2b_08b_east": PreRegion("2b_08b_east", "2b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08b_east"]), + + "2b_08_west": PreRegion("2b_08_west", "2b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08_west"]), + "2b_08_east": PreRegion("2b_08_east", "2b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08_east"]), + + "2b_09_west": PreRegion("2b_09_west", "2b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_09_west"]), + "2b_09_east": PreRegion("2b_09_east", "2b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_09_east"]), + + "2b_10_west": PreRegion("2b_10_west", "2b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_10_west"]), + "2b_10_east": PreRegion("2b_10_east", "2b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_10_east"]), + + "2b_11_bottom": PreRegion("2b_11_bottom", "2b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_11_bottom"]), + "2b_11_top": PreRegion("2b_11_top", "2b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_11_top"]), + + "2b_end_west": PreRegion("2b_end_west", "2b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_end_west"]), + "2b_end_goal": PreRegion("2b_end_goal", "2b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_end_goal"]), + + "2c_00_west": PreRegion("2c_00_west", "2c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_00_west"]), + "2c_00_east": PreRegion("2c_00_east", "2c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_00_east"]), + + "2c_01_west": PreRegion("2c_01_west", "2c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_01_west"]), + "2c_01_east": PreRegion("2c_01_east", "2c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_01_east"]), + + "2c_02_west": PreRegion("2c_02_west", "2c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_02_west"]), + "2c_02_goal": PreRegion("2c_02_goal", "2c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_02_goal"]), + + "3a_s0_main": PreRegion("3a_s0_main", "3a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s0_main"]), + "3a_s0_east": PreRegion("3a_s0_east", "3a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s0_east"]), + + "3a_s1_west": PreRegion("3a_s1_west", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_west"]), + "3a_s1_east": PreRegion("3a_s1_east", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_east"]), + "3a_s1_north-east": PreRegion("3a_s1_north-east", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_north-east"]), + + "3a_s2_west": PreRegion("3a_s2_west", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_west"]), + "3a_s2_north-west": PreRegion("3a_s2_north-west", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_north-west"]), + "3a_s2_east": PreRegion("3a_s2_east", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_east"]), + + "3a_s3_west": PreRegion("3a_s3_west", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_west"]), + "3a_s3_north": PreRegion("3a_s3_north", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_north"]), + "3a_s3_east": PreRegion("3a_s3_east", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_east"]), + + "3a_0x-a_west": PreRegion("3a_0x-a_west", "3a_0x-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-a_west"]), + "3a_0x-a_east": PreRegion("3a_0x-a_east", "3a_0x-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-a_east"]), + + "3a_00-a_west": PreRegion("3a_00-a_west", "3a_00-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-a_west"]), + "3a_00-a_east": PreRegion("3a_00-a_east", "3a_00-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-a_east"]), + + "3a_02-a_west": PreRegion("3a_02-a_west", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_west"]), + "3a_02-a_top": PreRegion("3a_02-a_top", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_top"]), + "3a_02-a_main": PreRegion("3a_02-a_main", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_main"]), + "3a_02-a_east": PreRegion("3a_02-a_east", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_east"]), + + "3a_02-b_west": PreRegion("3a_02-b_west", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_west"]), + "3a_02-b_east": PreRegion("3a_02-b_east", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_east"]), + "3a_02-b_far-east": PreRegion("3a_02-b_far-east", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_far-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_far-east"]), + + "3a_01-b_west": PreRegion("3a_01-b_west", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_west"]), + "3a_01-b_north-west": PreRegion("3a_01-b_north-west", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_north-west"]), + "3a_01-b_east": PreRegion("3a_01-b_east", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_east"]), + + "3a_00-b_south-west": PreRegion("3a_00-b_south-west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_south-west"]), + "3a_00-b_south-east": PreRegion("3a_00-b_south-east", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_south-east"]), + "3a_00-b_west": PreRegion("3a_00-b_west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_west"]), + "3a_00-b_north-west": PreRegion("3a_00-b_north-west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_north-west"]), + "3a_00-b_east": PreRegion("3a_00-b_east", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_east"]), + "3a_00-b_north": PreRegion("3a_00-b_north", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_north"]), + + "3a_00-c_south-west": PreRegion("3a_00-c_south-west", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_south-west"]), + "3a_00-c_south-east": PreRegion("3a_00-c_south-east", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_south-east"]), + "3a_00-c_north-east": PreRegion("3a_00-c_north-east", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_north-east"]), + + "3a_0x-b_west": PreRegion("3a_0x-b_west", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_west"]), + "3a_0x-b_south-east": PreRegion("3a_0x-b_south-east", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_south-east"]), + "3a_0x-b_north-east": PreRegion("3a_0x-b_north-east", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_north-east"]), + + "3a_03-a_west": PreRegion("3a_03-a_west", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_west"]), + "3a_03-a_top": PreRegion("3a_03-a_top", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_top"]), + "3a_03-a_east": PreRegion("3a_03-a_east", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_east"]), + + "3a_04-b_west": PreRegion("3a_04-b_west", "3a_04-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-b_west"]), + "3a_04-b_east": PreRegion("3a_04-b_east", "3a_04-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-b_east"]), + + "3a_05-a_west": PreRegion("3a_05-a_west", "3a_05-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-a_west"]), + "3a_05-a_east": PreRegion("3a_05-a_east", "3a_05-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-a_east"]), + + "3a_06-a_west": PreRegion("3a_06-a_west", "3a_06-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-a_west"]), + "3a_06-a_east": PreRegion("3a_06-a_east", "3a_06-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-a_east"]), + + "3a_07-a_west": PreRegion("3a_07-a_west", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_west"]), + "3a_07-a_top": PreRegion("3a_07-a_top", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_top"]), + "3a_07-a_east": PreRegion("3a_07-a_east", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_east"]), + + "3a_07-b_bottom": PreRegion("3a_07-b_bottom", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_bottom"]), + "3a_07-b_west": PreRegion("3a_07-b_west", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_west"]), + "3a_07-b_top": PreRegion("3a_07-b_top", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_top"]), + "3a_07-b_east": PreRegion("3a_07-b_east", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_east"]), + + "3a_06-b_west": PreRegion("3a_06-b_west", "3a_06-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-b_west"]), + "3a_06-b_east": PreRegion("3a_06-b_east", "3a_06-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-b_east"]), + + "3a_06-c_south-west": PreRegion("3a_06-c_south-west", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_south-west"]), + "3a_06-c_north-west": PreRegion("3a_06-c_north-west", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_north-west"]), + "3a_06-c_south-east": PreRegion("3a_06-c_south-east", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_south-east"]), + "3a_06-c_east": PreRegion("3a_06-c_east", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_east"]), + + "3a_05-c_east": PreRegion("3a_05-c_east", "3a_05-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-c_east"]), + + "3a_08-c_west": PreRegion("3a_08-c_west", "3a_08-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-c_west"]), + "3a_08-c_east": PreRegion("3a_08-c_east", "3a_08-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-c_east"]), + + "3a_08-b_west": PreRegion("3a_08-b_west", "3a_08-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-b_west"]), + "3a_08-b_east": PreRegion("3a_08-b_east", "3a_08-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-b_east"]), + + "3a_08-a_west": PreRegion("3a_08-a_west", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_west"]), + "3a_08-a_bottom": PreRegion("3a_08-a_bottom", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_bottom"]), + "3a_08-a_east": PreRegion("3a_08-a_east", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_east"]), + + "3a_09-b_west": PreRegion("3a_09-b_west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_west"]), + "3a_09-b_north-west": PreRegion("3a_09-b_north-west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-west"]), + "3a_09-b_center": PreRegion("3a_09-b_center", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_center"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_center"]), + "3a_09-b_south-west": PreRegion("3a_09-b_south-west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south-west"]), + "3a_09-b_south": PreRegion("3a_09-b_south", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south"]), + "3a_09-b_south-east": PreRegion("3a_09-b_south-east", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south-east"]), + "3a_09-b_east": PreRegion("3a_09-b_east", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_east"]), + "3a_09-b_north-east-right": PreRegion("3a_09-b_north-east-right", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-east-right"]), + "3a_09-b_north-east-top": PreRegion("3a_09-b_north-east-top", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-east-top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-east-top"]), + "3a_09-b_north": PreRegion("3a_09-b_north", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north"]), + + "3a_10-x_west": PreRegion("3a_10-x_west", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_west"]), + "3a_10-x_south-east": PreRegion("3a_10-x_south-east", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_south-east"]), + "3a_10-x_north-east-top": PreRegion("3a_10-x_north-east-top", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_north-east-top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_north-east-top"]), + "3a_10-x_north-east-right": PreRegion("3a_10-x_north-east-right", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_north-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_north-east-right"]), + + "3a_11-x_west": PreRegion("3a_11-x_west", "3a_11-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-x_west"]), + "3a_11-x_south": PreRegion("3a_11-x_south", "3a_11-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-x_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-x_south"]), + + "3a_11-y_west": PreRegion("3a_11-y_west", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_west"]), + "3a_11-y_east": PreRegion("3a_11-y_east", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_east"]), + "3a_11-y_south": PreRegion("3a_11-y_south", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_south"]), + + "3a_12-y_west": PreRegion("3a_12-y_west", "3a_12-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-y_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-y_west"]), + + "3a_11-z_west": PreRegion("3a_11-z_west", "3a_11-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-z_west"]), + "3a_11-z_east": PreRegion("3a_11-z_east", "3a_11-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-z_east"]), + + "3a_10-z_bottom": PreRegion("3a_10-z_bottom", "3a_10-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-z_bottom"]), + "3a_10-z_top": PreRegion("3a_10-z_top", "3a_10-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-z_top"]), + + "3a_10-y_bottom": PreRegion("3a_10-y_bottom", "3a_10-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-y_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-y_bottom"]), + "3a_10-y_top": PreRegion("3a_10-y_top", "3a_10-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-y_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-y_top"]), + + "3a_10-c_south-east": PreRegion("3a_10-c_south-east", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_south-east"]), + "3a_10-c_north-east": PreRegion("3a_10-c_north-east", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_north-east"]), + "3a_10-c_north-west": PreRegion("3a_10-c_north-west", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_north-west"]), + "3a_10-c_south-west": PreRegion("3a_10-c_south-west", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_south-west"]), + + "3a_11-c_west": PreRegion("3a_11-c_west", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_west"]), + "3a_11-c_east": PreRegion("3a_11-c_east", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_east"]), + "3a_11-c_south-east": PreRegion("3a_11-c_south-east", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_south-east"]), + "3a_11-c_south-west": PreRegion("3a_11-c_south-west", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_south-west"]), + + "3a_12-c_west": PreRegion("3a_12-c_west", "3a_12-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-c_west"]), + "3a_12-c_top": PreRegion("3a_12-c_top", "3a_12-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-c_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-c_top"]), + + "3a_12-d_bottom": PreRegion("3a_12-d_bottom", "3a_12-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-d_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-d_bottom"]), + "3a_12-d_top": PreRegion("3a_12-d_top", "3a_12-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-d_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-d_top"]), + + "3a_11-d_west": PreRegion("3a_11-d_west", "3a_11-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-d_west"]), + "3a_11-d_east": PreRegion("3a_11-d_east", "3a_11-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-d_east"]), + + "3a_10-d_west": PreRegion("3a_10-d_west", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_west"]), + "3a_10-d_main": PreRegion("3a_10-d_main", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_main"]), + "3a_10-d_east": PreRegion("3a_10-d_east", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_east"]), + + "3a_11-b_west": PreRegion("3a_11-b_west", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_west"]), + "3a_11-b_north-west": PreRegion("3a_11-b_north-west", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_north-west"]), + "3a_11-b_east": PreRegion("3a_11-b_east", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_east"]), + "3a_11-b_north-east": PreRegion("3a_11-b_north-east", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_north-east"]), + + "3a_12-b_west": PreRegion("3a_12-b_west", "3a_12-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-b_west"]), + "3a_12-b_east": PreRegion("3a_12-b_east", "3a_12-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-b_east"]), + + "3a_13-b_top": PreRegion("3a_13-b_top", "3a_13-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-b_top"]), + "3a_13-b_bottom": PreRegion("3a_13-b_bottom", "3a_13-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-b_bottom"]), + + "3a_13-a_west": PreRegion("3a_13-a_west", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_west"]), + "3a_13-a_south-west": PreRegion("3a_13-a_south-west", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_south-west"]), + "3a_13-a_east": PreRegion("3a_13-a_east", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_east"]), + + "3a_13-x_west": PreRegion("3a_13-x_west", "3a_13-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-x_west"]), + "3a_13-x_east": PreRegion("3a_13-x_east", "3a_13-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-x_east"]), + + "3a_12-x_west": PreRegion("3a_12-x_west", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_west"]), + "3a_12-x_north-east": PreRegion("3a_12-x_north-east", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_north-east"]), + "3a_12-x_east": PreRegion("3a_12-x_east", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_east"]), + + "3a_11-a_west": PreRegion("3a_11-a_west", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_west"]), + "3a_11-a_south": PreRegion("3a_11-a_south", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south"]), + "3a_11-a_south-east-bottom": PreRegion("3a_11-a_south-east-bottom", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south-east-bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south-east-bottom"]), + "3a_11-a_south-east-right": PreRegion("3a_11-a_south-east-right", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south-east-right"]), + + "3a_08-x_west": PreRegion("3a_08-x_west", "3a_08-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-x_west"]), + "3a_08-x_east": PreRegion("3a_08-x_east", "3a_08-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-x_east"]), + + "3a_09-d_bottom": PreRegion("3a_09-d_bottom", "3a_09-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-d_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-d_bottom"]), + "3a_09-d_top": PreRegion("3a_09-d_top", "3a_09-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-d_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-d_top"]), + + "3a_08-d_west": PreRegion("3a_08-d_west", "3a_08-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-d_west"]), + "3a_08-d_east": PreRegion("3a_08-d_east", "3a_08-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-d_east"]), + + "3a_06-d_west": PreRegion("3a_06-d_west", "3a_06-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-d_west"]), + "3a_06-d_east": PreRegion("3a_06-d_east", "3a_06-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-d_east"]), + + "3a_04-d_west": PreRegion("3a_04-d_west", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_west"]), + "3a_04-d_south-west": PreRegion("3a_04-d_south-west", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_south-west"]), + "3a_04-d_south": PreRegion("3a_04-d_south", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_south"]), + "3a_04-d_east": PreRegion("3a_04-d_east", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_east"]), + + "3a_04-c_west": PreRegion("3a_04-c_west", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_west"]), + "3a_04-c_north-west": PreRegion("3a_04-c_north-west", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_north-west"]), + "3a_04-c_east": PreRegion("3a_04-c_east", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_east"]), + + "3a_02-c_west": PreRegion("3a_02-c_west", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_west"]), + "3a_02-c_east": PreRegion("3a_02-c_east", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_east"]), + "3a_02-c_south-east": PreRegion("3a_02-c_south-east", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_south-east"]), + + "3a_03-b_west": PreRegion("3a_03-b_west", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_west"]), + "3a_03-b_east": PreRegion("3a_03-b_east", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_east"]), + "3a_03-b_north": PreRegion("3a_03-b_north", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_north"]), + + "3a_01-c_west": PreRegion("3a_01-c_west", "3a_01-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-c_west"]), + "3a_01-c_east": PreRegion("3a_01-c_east", "3a_01-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-c_east"]), + + "3a_02-d_west": PreRegion("3a_02-d_west", "3a_02-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-d_west"]), + "3a_02-d_east": PreRegion("3a_02-d_east", "3a_02-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-d_east"]), + + "3a_00-d_west": PreRegion("3a_00-d_west", "3a_00-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-d_west"]), + "3a_00-d_east": PreRegion("3a_00-d_east", "3a_00-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-d_east"]), + + "3a_roof00_west": PreRegion("3a_roof00_west", "3a_roof00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof00_west"]), + "3a_roof00_east": PreRegion("3a_roof00_east", "3a_roof00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof00_east"]), + + "3a_roof01_west": PreRegion("3a_roof01_west", "3a_roof01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof01_west"]), + "3a_roof01_east": PreRegion("3a_roof01_east", "3a_roof01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof01_east"]), + + "3a_roof02_west": PreRegion("3a_roof02_west", "3a_roof02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof02_west"]), + "3a_roof02_east": PreRegion("3a_roof02_east", "3a_roof02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof02_east"]), + + "3a_roof03_west": PreRegion("3a_roof03_west", "3a_roof03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof03_west"]), + "3a_roof03_east": PreRegion("3a_roof03_east", "3a_roof03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof03_east"]), + + "3a_roof04_west": PreRegion("3a_roof04_west", "3a_roof04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof04_west"]), + "3a_roof04_east": PreRegion("3a_roof04_east", "3a_roof04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof04_east"]), + + "3a_roof05_west": PreRegion("3a_roof05_west", "3a_roof05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof05_west"]), + "3a_roof05_east": PreRegion("3a_roof05_east", "3a_roof05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof05_east"]), + + "3a_roof06b_west": PreRegion("3a_roof06b_west", "3a_roof06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06b_west"]), + "3a_roof06b_east": PreRegion("3a_roof06b_east", "3a_roof06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06b_east"]), + + "3a_roof06_west": PreRegion("3a_roof06_west", "3a_roof06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06_west"]), + "3a_roof06_east": PreRegion("3a_roof06_east", "3a_roof06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06_east"]), + + "3a_roof07_west": PreRegion("3a_roof07_west", "3a_roof07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof07_west"]), + "3a_roof07_main": PreRegion("3a_roof07_main", "3a_roof07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof07_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof07_main"]), + + "3b_00_west": PreRegion("3b_00_west", "3b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_00_west"]), + "3b_00_east": PreRegion("3b_00_east", "3b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_00_east"]), + + "3b_back_east": PreRegion("3b_back_east", "3b_back", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_back_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_back_east"]), + + "3b_01_west": PreRegion("3b_01_west", "3b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_01_west"]), + "3b_01_east": PreRegion("3b_01_east", "3b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_01_east"]), + + "3b_02_west": PreRegion("3b_02_west", "3b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_02_west"]), + "3b_02_east": PreRegion("3b_02_east", "3b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_02_east"]), + + "3b_03_west": PreRegion("3b_03_west", "3b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_03_west"]), + "3b_03_east": PreRegion("3b_03_east", "3b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_03_east"]), + + "3b_04_west": PreRegion("3b_04_west", "3b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_04_west"]), + "3b_04_east": PreRegion("3b_04_east", "3b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_04_east"]), + + "3b_05_west": PreRegion("3b_05_west", "3b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_05_west"]), + "3b_05_east": PreRegion("3b_05_east", "3b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_05_east"]), + + "3b_06_west": PreRegion("3b_06_west", "3b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_06_west"]), + "3b_06_east": PreRegion("3b_06_east", "3b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_06_east"]), + + "3b_07_west": PreRegion("3b_07_west", "3b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_07_west"]), + "3b_07_east": PreRegion("3b_07_east", "3b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_07_east"]), + + "3b_08_bottom": PreRegion("3b_08_bottom", "3b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_08_bottom"]), + "3b_08_top": PreRegion("3b_08_top", "3b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_08_top"]), + + "3b_09_west": PreRegion("3b_09_west", "3b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_09_west"]), + "3b_09_east": PreRegion("3b_09_east", "3b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_09_east"]), + + "3b_10_west": PreRegion("3b_10_west", "3b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_10_west"]), + "3b_10_east": PreRegion("3b_10_east", "3b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_10_east"]), + + "3b_11_west": PreRegion("3b_11_west", "3b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_11_west"]), + "3b_11_east": PreRegion("3b_11_east", "3b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_11_east"]), + + "3b_13_west": PreRegion("3b_13_west", "3b_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_13_west"]), + "3b_13_east": PreRegion("3b_13_east", "3b_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_13_east"]), + + "3b_14_west": PreRegion("3b_14_west", "3b_14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_14_west"]), + "3b_14_east": PreRegion("3b_14_east", "3b_14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_14_east"]), + + "3b_15_west": PreRegion("3b_15_west", "3b_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_15_west"]), + "3b_15_east": PreRegion("3b_15_east", "3b_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_15_east"]), + + "3b_12_west": PreRegion("3b_12_west", "3b_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_12_west"]), + "3b_12_east": PreRegion("3b_12_east", "3b_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_12_east"]), + + "3b_16_west": PreRegion("3b_16_west", "3b_16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_16_west"]), + "3b_16_top": PreRegion("3b_16_top", "3b_16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_16_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_16_top"]), + + "3b_17_west": PreRegion("3b_17_west", "3b_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_17_west"]), + "3b_17_east": PreRegion("3b_17_east", "3b_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_17_east"]), + + "3b_18_west": PreRegion("3b_18_west", "3b_18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_18_west"]), + "3b_18_east": PreRegion("3b_18_east", "3b_18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_18_east"]), + + "3b_19_west": PreRegion("3b_19_west", "3b_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_19_west"]), + "3b_19_east": PreRegion("3b_19_east", "3b_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_19_east"]), + + "3b_21_west": PreRegion("3b_21_west", "3b_21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_21_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_21_west"]), + "3b_21_east": PreRegion("3b_21_east", "3b_21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_21_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_21_east"]), + + "3b_20_west": PreRegion("3b_20_west", "3b_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_20_west"]), + "3b_20_east": PreRegion("3b_20_east", "3b_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_20_east"]), + + "3b_end_west": PreRegion("3b_end_west", "3b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_end_west"]), + "3b_end_goal": PreRegion("3b_end_goal", "3b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_end_goal"]), + + "3c_00_west": PreRegion("3c_00_west", "3c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_00_west"]), + "3c_00_east": PreRegion("3c_00_east", "3c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_00_east"]), + + "3c_01_west": PreRegion("3c_01_west", "3c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_01_west"]), + "3c_01_east": PreRegion("3c_01_east", "3c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_01_east"]), + + "3c_02_west": PreRegion("3c_02_west", "3c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_02_west"]), + "3c_02_goal": PreRegion("3c_02_goal", "3c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_02_goal"]), + + "4a_a-00_west": PreRegion("4a_a-00_west", "4a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-00_west"]), + "4a_a-00_east": PreRegion("4a_a-00_east", "4a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-00_east"]), + + "4a_a-01_west": PreRegion("4a_a-01_west", "4a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01_west"]), + "4a_a-01_east": PreRegion("4a_a-01_east", "4a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01_east"]), + + "4a_a-01x_west": PreRegion("4a_a-01x_west", "4a_a-01x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01x_west"]), + "4a_a-01x_east": PreRegion("4a_a-01x_east", "4a_a-01x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01x_east"]), + + "4a_a-02_west": PreRegion("4a_a-02_west", "4a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-02_west"]), + "4a_a-02_east": PreRegion("4a_a-02_east", "4a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-02_east"]), + + "4a_a-03_west": PreRegion("4a_a-03_west", "4a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-03_west"]), + "4a_a-03_east": PreRegion("4a_a-03_east", "4a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-03_east"]), + + "4a_a-04_west": PreRegion("4a_a-04_west", "4a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-04_west"]), + "4a_a-04_east": PreRegion("4a_a-04_east", "4a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-04_east"]), + + "4a_a-05_west": PreRegion("4a_a-05_west", "4a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-05_west"]), + "4a_a-05_east": PreRegion("4a_a-05_east", "4a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-05_east"]), + + "4a_a-06_west": PreRegion("4a_a-06_west", "4a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-06_west"]), + "4a_a-06_east": PreRegion("4a_a-06_east", "4a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-06_east"]), + + "4a_a-07_west": PreRegion("4a_a-07_west", "4a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-07_west"]), + "4a_a-07_east": PreRegion("4a_a-07_east", "4a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-07_east"]), + + "4a_a-08_west": PreRegion("4a_a-08_west", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_west"]), + "4a_a-08_north-west": PreRegion("4a_a-08_north-west", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_north-west"]), + "4a_a-08_east": PreRegion("4a_a-08_east", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_east"]), + + "4a_a-10_west": PreRegion("4a_a-10_west", "4a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-10_west"]), + "4a_a-10_east": PreRegion("4a_a-10_east", "4a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-10_east"]), + + "4a_a-11_east": PreRegion("4a_a-11_east", "4a_a-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-11_east"]), + + "4a_a-09_bottom": PreRegion("4a_a-09_bottom", "4a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-09_bottom"]), + "4a_a-09_top": PreRegion("4a_a-09_top", "4a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-09_top"]), + + "4a_b-00_south": PreRegion("4a_b-00_south", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_south"]), + "4a_b-00_south-east": PreRegion("4a_b-00_south-east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_south-east"]), + "4a_b-00_east": PreRegion("4a_b-00_east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_east"]), + "4a_b-00_west": PreRegion("4a_b-00_west", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_west"]), + "4a_b-00_north-east": PreRegion("4a_b-00_north-east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north-east"]), + "4a_b-00_north-west": PreRegion("4a_b-00_north-west", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north-west"]), + "4a_b-00_north": PreRegion("4a_b-00_north", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north"]), + + "4a_b-01_west": PreRegion("4a_b-01_west", "4a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-01_west"]), + + "4a_b-04_west": PreRegion("4a_b-04_west", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_west"]), + "4a_b-04_north-west": PreRegion("4a_b-04_north-west", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_north-west"]), + "4a_b-04_east": PreRegion("4a_b-04_east", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_east"]), + + "4a_b-06_west": PreRegion("4a_b-06_west", "4a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-06_west"]), + "4a_b-06_east": PreRegion("4a_b-06_east", "4a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-06_east"]), + + "4a_b-07_west": PreRegion("4a_b-07_west", "4a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-07_west"]), + "4a_b-07_east": PreRegion("4a_b-07_east", "4a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-07_east"]), + + "4a_b-03_west": PreRegion("4a_b-03_west", "4a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-03_west"]), + "4a_b-03_east": PreRegion("4a_b-03_east", "4a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-03_east"]), + + "4a_b-02_south-west": PreRegion("4a_b-02_south-west", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_south-west"]), + "4a_b-02_north-west": PreRegion("4a_b-02_north-west", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north-west"]), + "4a_b-02_north-east": PreRegion("4a_b-02_north-east", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north-east"]), + "4a_b-02_north": PreRegion("4a_b-02_north", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north"]), + + "4a_b-sec_west": PreRegion("4a_b-sec_west", "4a_b-sec", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-sec_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-sec_west"]), + "4a_b-sec_east": PreRegion("4a_b-sec_east", "4a_b-sec", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-sec_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-sec_east"]), + + "4a_b-secb_west": PreRegion("4a_b-secb_west", "4a_b-secb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-secb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-secb_west"]), + + "4a_b-05_center": PreRegion("4a_b-05_center", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_center"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_center"]), + "4a_b-05_west": PreRegion("4a_b-05_west", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_west"]), + "4a_b-05_north-east": PreRegion("4a_b-05_north-east", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_north-east"]), + "4a_b-05_east": PreRegion("4a_b-05_east", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_east"]), + + "4a_b-08b_west": PreRegion("4a_b-08b_west", "4a_b-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08b_west"]), + "4a_b-08b_east": PreRegion("4a_b-08b_east", "4a_b-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08b_east"]), + + "4a_b-08_west": PreRegion("4a_b-08_west", "4a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08_west"]), + "4a_b-08_east": PreRegion("4a_b-08_east", "4a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08_east"]), + + "4a_c-00_west": PreRegion("4a_c-00_west", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_west"]), + "4a_c-00_east": PreRegion("4a_c-00_east", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_east"]), + "4a_c-00_north-west": PreRegion("4a_c-00_north-west", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_north-west"]), + + "4a_c-01_east": PreRegion("4a_c-01_east", "4a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-01_east"]), + + "4a_c-02_west": PreRegion("4a_c-02_west", "4a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-02_west"]), + "4a_c-02_east": PreRegion("4a_c-02_east", "4a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-02_east"]), + + "4a_c-04_west": PreRegion("4a_c-04_west", "4a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-04_west"]), + "4a_c-04_east": PreRegion("4a_c-04_east", "4a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-04_east"]), + + "4a_c-05_west": PreRegion("4a_c-05_west", "4a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-05_west"]), + "4a_c-05_east": PreRegion("4a_c-05_east", "4a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-05_east"]), + + "4a_c-06_bottom": PreRegion("4a_c-06_bottom", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_bottom"]), + "4a_c-06_west": PreRegion("4a_c-06_west", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_west"]), + "4a_c-06_top": PreRegion("4a_c-06_top", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_top"]), + + "4a_c-06b_east": PreRegion("4a_c-06b_east", "4a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06b_east"]), + + "4a_c-09_west": PreRegion("4a_c-09_west", "4a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-09_west"]), + "4a_c-09_east": PreRegion("4a_c-09_east", "4a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-09_east"]), + + "4a_c-07_west": PreRegion("4a_c-07_west", "4a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-07_west"]), + "4a_c-07_east": PreRegion("4a_c-07_east", "4a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-07_east"]), + + "4a_c-08_bottom": PreRegion("4a_c-08_bottom", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_bottom"]), + "4a_c-08_east": PreRegion("4a_c-08_east", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_east"]), + "4a_c-08_top": PreRegion("4a_c-08_top", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_top"]), + + "4a_c-10_bottom": PreRegion("4a_c-10_bottom", "4a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-10_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-10_bottom"]), + "4a_c-10_top": PreRegion("4a_c-10_top", "4a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-10_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-10_top"]), + + "4a_d-00_west": PreRegion("4a_d-00_west", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_west"]), + "4a_d-00_south": PreRegion("4a_d-00_south", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_south"]), + "4a_d-00_east": PreRegion("4a_d-00_east", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_east"]), + "4a_d-00_north-west": PreRegion("4a_d-00_north-west", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_north-west"]), + + "4a_d-00b_east": PreRegion("4a_d-00b_east", "4a_d-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00b_east"]), + + "4a_d-01_west": PreRegion("4a_d-01_west", "4a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-01_west"]), + "4a_d-01_east": PreRegion("4a_d-01_east", "4a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-01_east"]), + + "4a_d-02_west": PreRegion("4a_d-02_west", "4a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-02_west"]), + "4a_d-02_east": PreRegion("4a_d-02_east", "4a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-02_east"]), + + "4a_d-03_west": PreRegion("4a_d-03_west", "4a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-03_west"]), + "4a_d-03_east": PreRegion("4a_d-03_east", "4a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-03_east"]), + + "4a_d-04_west": PreRegion("4a_d-04_west", "4a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-04_west"]), + "4a_d-04_east": PreRegion("4a_d-04_east", "4a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-04_east"]), + + "4a_d-05_west": PreRegion("4a_d-05_west", "4a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-05_west"]), + "4a_d-05_east": PreRegion("4a_d-05_east", "4a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-05_east"]), + + "4a_d-06_west": PreRegion("4a_d-06_west", "4a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-06_west"]), + "4a_d-06_east": PreRegion("4a_d-06_east", "4a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-06_east"]), + + "4a_d-07_west": PreRegion("4a_d-07_west", "4a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-07_west"]), + "4a_d-07_east": PreRegion("4a_d-07_east", "4a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-07_east"]), + + "4a_d-08_west": PreRegion("4a_d-08_west", "4a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-08_west"]), + "4a_d-08_east": PreRegion("4a_d-08_east", "4a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-08_east"]), + + "4a_d-09_west": PreRegion("4a_d-09_west", "4a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-09_west"]), + "4a_d-09_east": PreRegion("4a_d-09_east", "4a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-09_east"]), + + "4a_d-10_west": PreRegion("4a_d-10_west", "4a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-10_west"]), + "4a_d-10_goal": PreRegion("4a_d-10_goal", "4a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-10_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-10_goal"]), + + "4b_a-00_west": PreRegion("4b_a-00_west", "4b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-00_west"]), + "4b_a-00_east": PreRegion("4b_a-00_east", "4b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-00_east"]), + + "4b_a-01_west": PreRegion("4b_a-01_west", "4b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-01_west"]), + "4b_a-01_east": PreRegion("4b_a-01_east", "4b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-01_east"]), + + "4b_a-02_west": PreRegion("4b_a-02_west", "4b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-02_west"]), + "4b_a-02_east": PreRegion("4b_a-02_east", "4b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-02_east"]), + + "4b_a-03_west": PreRegion("4b_a-03_west", "4b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-03_west"]), + "4b_a-03_east": PreRegion("4b_a-03_east", "4b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-03_east"]), + + "4b_a-04_west": PreRegion("4b_a-04_west", "4b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-04_west"]), + "4b_a-04_east": PreRegion("4b_a-04_east", "4b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-04_east"]), + + "4b_b-00_west": PreRegion("4b_b-00_west", "4b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-00_west"]), + "4b_b-00_east": PreRegion("4b_b-00_east", "4b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-00_east"]), + + "4b_b-01_west": PreRegion("4b_b-01_west", "4b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-01_west"]), + "4b_b-01_east": PreRegion("4b_b-01_east", "4b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-01_east"]), + + "4b_b-02_bottom": PreRegion("4b_b-02_bottom", "4b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-02_bottom"]), + "4b_b-02_top": PreRegion("4b_b-02_top", "4b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-02_top"]), + + "4b_b-03_west": PreRegion("4b_b-03_west", "4b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-03_west"]), + "4b_b-03_east": PreRegion("4b_b-03_east", "4b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-03_east"]), + + "4b_b-04_west": PreRegion("4b_b-04_west", "4b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-04_west"]), + "4b_b-04_east": PreRegion("4b_b-04_east", "4b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-04_east"]), + + "4b_c-00_west": PreRegion("4b_c-00_west", "4b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-00_west"]), + "4b_c-00_east": PreRegion("4b_c-00_east", "4b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-00_east"]), + + "4b_c-01_west": PreRegion("4b_c-01_west", "4b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-01_west"]), + "4b_c-01_east": PreRegion("4b_c-01_east", "4b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-01_east"]), + + "4b_c-02_west": PreRegion("4b_c-02_west", "4b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-02_west"]), + "4b_c-02_east": PreRegion("4b_c-02_east", "4b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-02_east"]), + + "4b_c-03_bottom": PreRegion("4b_c-03_bottom", "4b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-03_bottom"]), + "4b_c-03_top": PreRegion("4b_c-03_top", "4b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-03_top"]), + + "4b_c-04_west": PreRegion("4b_c-04_west", "4b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-04_west"]), + "4b_c-04_east": PreRegion("4b_c-04_east", "4b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-04_east"]), + + "4b_d-00_west": PreRegion("4b_d-00_west", "4b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-00_west"]), + "4b_d-00_east": PreRegion("4b_d-00_east", "4b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-00_east"]), + + "4b_d-01_west": PreRegion("4b_d-01_west", "4b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-01_west"]), + "4b_d-01_east": PreRegion("4b_d-01_east", "4b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-01_east"]), + + "4b_d-02_west": PreRegion("4b_d-02_west", "4b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-02_west"]), + "4b_d-02_east": PreRegion("4b_d-02_east", "4b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-02_east"]), + + "4b_d-03_west": PreRegion("4b_d-03_west", "4b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-03_west"]), + "4b_d-03_east": PreRegion("4b_d-03_east", "4b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-03_east"]), + + "4b_end_west": PreRegion("4b_end_west", "4b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_end_west"]), + "4b_end_goal": PreRegion("4b_end_goal", "4b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_end_goal"]), + + "4c_00_west": PreRegion("4c_00_west", "4c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_00_west"]), + "4c_00_east": PreRegion("4c_00_east", "4c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_00_east"]), + + "4c_01_west": PreRegion("4c_01_west", "4c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_01_west"]), + "4c_01_east": PreRegion("4c_01_east", "4c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_01_east"]), + + "4c_02_west": PreRegion("4c_02_west", "4c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_02_west"]), + "4c_02_goal": PreRegion("4c_02_goal", "4c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_02_goal"]), + + "5a_a-00b_west": PreRegion("5a_a-00b_west", "5a_a-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00b_west"]), + "5a_a-00b_east": PreRegion("5a_a-00b_east", "5a_a-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00b_east"]), + + "5a_a-00x_east": PreRegion("5a_a-00x_east", "5a_a-00x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00x_east"]), + + "5a_a-00d_west": PreRegion("5a_a-00d_west", "5a_a-00d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00d_west"]), + "5a_a-00d_east": PreRegion("5a_a-00d_east", "5a_a-00d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00d_east"]), + + "5a_a-00c_west": PreRegion("5a_a-00c_west", "5a_a-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00c_west"]), + "5a_a-00c_east": PreRegion("5a_a-00c_east", "5a_a-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00c_east"]), + + "5a_a-00_west": PreRegion("5a_a-00_west", "5a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00_west"]), + "5a_a-00_east": PreRegion("5a_a-00_east", "5a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00_east"]), + + "5a_a-01_west": PreRegion("5a_a-01_west", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_west"]), + "5a_a-01_center": PreRegion("5a_a-01_center", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_center"]), + "5a_a-01_east": PreRegion("5a_a-01_east", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_east"]), + "5a_a-01_south-west": PreRegion("5a_a-01_south-west", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_south-west"]), + "5a_a-01_south-east": PreRegion("5a_a-01_south-east", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_south-east"]), + "5a_a-01_north": PreRegion("5a_a-01_north", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_north"]), + + "5a_a-02_west": PreRegion("5a_a-02_west", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_west"]), + "5a_a-02_north": PreRegion("5a_a-02_north", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_north"]), + "5a_a-02_south": PreRegion("5a_a-02_south", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_south"]), + + "5a_a-03_west": PreRegion("5a_a-03_west", "5a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-03_west"]), + "5a_a-03_east": PreRegion("5a_a-03_east", "5a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-03_east"]), + + "5a_a-04_east": PreRegion("5a_a-04_east", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_east"]), + "5a_a-04_north": PreRegion("5a_a-04_north", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_north"]), + "5a_a-04_south": PreRegion("5a_a-04_south", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_south"]), + + "5a_a-05_north-west": PreRegion("5a_a-05_north-west", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_north-west"]), + "5a_a-05_center": PreRegion("5a_a-05_center", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_center"]), + "5a_a-05_north-east": PreRegion("5a_a-05_north-east", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_north-east"]), + "5a_a-05_south-west": PreRegion("5a_a-05_south-west", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_south-west"]), + "5a_a-05_south-east": PreRegion("5a_a-05_south-east", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_south-east"]), + + "5a_a-06_west": PreRegion("5a_a-06_west", "5a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-06_west"]), + + "5a_a-07_east": PreRegion("5a_a-07_east", "5a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-07_east"]), + + "5a_a-08_west": PreRegion("5a_a-08_west", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_west"]), + "5a_a-08_center": PreRegion("5a_a-08_center", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_center"]), + "5a_a-08_east": PreRegion("5a_a-08_east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_east"]), + "5a_a-08_south": PreRegion("5a_a-08_south", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_south"]), + "5a_a-08_south-east": PreRegion("5a_a-08_south-east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_south-east"]), + "5a_a-08_north-east": PreRegion("5a_a-08_north-east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_north-east"]), + "5a_a-08_north": PreRegion("5a_a-08_north", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_north"]), + + "5a_a-10_west": PreRegion("5a_a-10_west", "5a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-10_west"]), + "5a_a-10_east": PreRegion("5a_a-10_east", "5a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-10_east"]), + + "5a_a-09_west": PreRegion("5a_a-09_west", "5a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-09_west"]), + "5a_a-09_east": PreRegion("5a_a-09_east", "5a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-09_east"]), + + "5a_a-11_east": PreRegion("5a_a-11_east", "5a_a-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-11_east"]), + + "5a_a-12_north-west": PreRegion("5a_a-12_north-west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_north-west"]), + "5a_a-12_west": PreRegion("5a_a-12_west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_west"]), + "5a_a-12_south-west": PreRegion("5a_a-12_south-west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_south-west"]), + "5a_a-12_east": PreRegion("5a_a-12_east", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_east"]), + + "5a_a-15_south": PreRegion("5a_a-15_south", "5a_a-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-15_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-15_south"]), + + "5a_a-14_south": PreRegion("5a_a-14_south", "5a_a-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-14_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-14_south"]), + + "5a_a-13_west": PreRegion("5a_a-13_west", "5a_a-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-13_west"]), + "5a_a-13_east": PreRegion("5a_a-13_east", "5a_a-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-13_east"]), + + "5a_b-00_west": PreRegion("5a_b-00_west", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_west"]), + "5a_b-00_north-west": PreRegion("5a_b-00_north-west", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_north-west"]), + "5a_b-00_east": PreRegion("5a_b-00_east", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_east"]), + + "5a_b-18_south": PreRegion("5a_b-18_south", "5a_b-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-18_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-18_south"]), + + "5a_b-01_south-west": PreRegion("5a_b-01_south-west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south-west"]), + "5a_b-01_center": PreRegion("5a_b-01_center", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_center"]), + "5a_b-01_west": PreRegion("5a_b-01_west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_west"]), + "5a_b-01_north-west": PreRegion("5a_b-01_north-west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north-west"]), + "5a_b-01_north": PreRegion("5a_b-01_north", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north"]), + "5a_b-01_north-east": PreRegion("5a_b-01_north-east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north-east"]), + "5a_b-01_east": PreRegion("5a_b-01_east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_east"]), + "5a_b-01_south-east": PreRegion("5a_b-01_south-east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south-east"]), + "5a_b-01_south": PreRegion("5a_b-01_south", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south"]), + + "5a_b-01c_west": PreRegion("5a_b-01c_west", "5a_b-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01c_west"]), + "5a_b-01c_east": PreRegion("5a_b-01c_east", "5a_b-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01c_east"]), + + "5a_b-20_north-west": PreRegion("5a_b-20_north-west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_north-west"]), + "5a_b-20_west": PreRegion("5a_b-20_west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_west"]), + "5a_b-20_south-west": PreRegion("5a_b-20_south-west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_south-west"]), + "5a_b-20_south": PreRegion("5a_b-20_south", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_south"]), + "5a_b-20_east": PreRegion("5a_b-20_east", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_east"]), + + "5a_b-21_east": PreRegion("5a_b-21_east", "5a_b-21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-21_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-21_east"]), + + "5a_b-01b_west": PreRegion("5a_b-01b_west", "5a_b-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01b_west"]), + "5a_b-01b_east": PreRegion("5a_b-01b_east", "5a_b-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01b_east"]), + + "5a_b-02_center": PreRegion("5a_b-02_center", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_center"]), + "5a_b-02_west": PreRegion("5a_b-02_west", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_west"]), + "5a_b-02_north-west": PreRegion("5a_b-02_north-west", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north-west"]), + "5a_b-02_north": PreRegion("5a_b-02_north", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north"]), + "5a_b-02_north-east": PreRegion("5a_b-02_north-east", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north-east"]), + "5a_b-02_east-upper": PreRegion("5a_b-02_east-upper", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_east-upper"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_east-upper"]), + "5a_b-02_east-lower": PreRegion("5a_b-02_east-lower", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_east-lower"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_east-lower"]), + "5a_b-02_south-east": PreRegion("5a_b-02_south-east", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_south-east"]), + "5a_b-02_south": PreRegion("5a_b-02_south", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_south"]), + + "5a_b-03_east": PreRegion("5a_b-03_east", "5a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-03_east"]), + + "5a_b-05_west": PreRegion("5a_b-05_west", "5a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-05_west"]), + + "5a_b-04_west": PreRegion("5a_b-04_west", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_west"]), + "5a_b-04_east": PreRegion("5a_b-04_east", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_east"]), + "5a_b-04_south": PreRegion("5a_b-04_south", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_south"]), + + "5a_b-07_north": PreRegion("5a_b-07_north", "5a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-07_north"]), + "5a_b-07_south": PreRegion("5a_b-07_south", "5a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-07_south"]), + + "5a_b-08_west": PreRegion("5a_b-08_west", "5a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-08_west"]), + "5a_b-08_east": PreRegion("5a_b-08_east", "5a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-08_east"]), + + "5a_b-09_north": PreRegion("5a_b-09_north", "5a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-09_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-09_north"]), + "5a_b-09_south": PreRegion("5a_b-09_south", "5a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-09_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-09_south"]), + + "5a_b-10_east": PreRegion("5a_b-10_east", "5a_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-10_east"]), + + "5a_b-11_north-west": PreRegion("5a_b-11_north-west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_north-west"]), + "5a_b-11_west": PreRegion("5a_b-11_west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_west"]), + "5a_b-11_south-west": PreRegion("5a_b-11_south-west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_south-west"]), + "5a_b-11_south-east": PreRegion("5a_b-11_south-east", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_south-east"]), + "5a_b-11_east": PreRegion("5a_b-11_east", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_east"]), + + "5a_b-12_west": PreRegion("5a_b-12_west", "5a_b-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-12_west"]), + "5a_b-12_east": PreRegion("5a_b-12_east", "5a_b-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-12_east"]), + + "5a_b-13_west": PreRegion("5a_b-13_west", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_west"]), + "5a_b-13_east": PreRegion("5a_b-13_east", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_east"]), + "5a_b-13_north-east": PreRegion("5a_b-13_north-east", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_north-east"]), + + "5a_b-17_west": PreRegion("5a_b-17_west", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_west"]), + "5a_b-17_east": PreRegion("5a_b-17_east", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_east"]), + "5a_b-17_north-west": PreRegion("5a_b-17_north-west", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_north-west"]), + + "5a_b-22_west": PreRegion("5a_b-22_west", "5a_b-22", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-22_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-22_west"]), + + "5a_b-06_west": PreRegion("5a_b-06_west", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_west"]), + "5a_b-06_east": PreRegion("5a_b-06_east", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_east"]), + "5a_b-06_north-east": PreRegion("5a_b-06_north-east", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_north-east"]), + + "5a_b-19_west": PreRegion("5a_b-19_west", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_west"]), + "5a_b-19_east": PreRegion("5a_b-19_east", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_east"]), + "5a_b-19_north-west": PreRegion("5a_b-19_north-west", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_north-west"]), + + "5a_b-14_west": PreRegion("5a_b-14_west", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_west"]), + "5a_b-14_south": PreRegion("5a_b-14_south", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_south"]), + "5a_b-14_north": PreRegion("5a_b-14_north", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_north"]), + + "5a_b-15_west": PreRegion("5a_b-15_west", "5a_b-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-15_west"]), + + "5a_b-16_bottom": PreRegion("5a_b-16_bottom", "5a_b-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-16_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-16_bottom"]), + "5a_b-16_mirror": PreRegion("5a_b-16_mirror", "5a_b-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-16_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-16_mirror"]), + + "5a_void_east": PreRegion("5a_void_east", "5a_void", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_void_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_void_east"]), + "5a_void_west": PreRegion("5a_void_west", "5a_void", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_void_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_void_west"]), + + "5a_c-00_bottom": PreRegion("5a_c-00_bottom", "5a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-00_bottom"]), + "5a_c-00_top": PreRegion("5a_c-00_top", "5a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-00_top"]), + + "5a_c-01_west": PreRegion("5a_c-01_west", "5a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01_west"]), + "5a_c-01_east": PreRegion("5a_c-01_east", "5a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01_east"]), + + "5a_c-01b_west": PreRegion("5a_c-01b_west", "5a_c-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01b_west"]), + "5a_c-01b_east": PreRegion("5a_c-01b_east", "5a_c-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01b_east"]), + + "5a_c-01c_west": PreRegion("5a_c-01c_west", "5a_c-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01c_west"]), + "5a_c-01c_east": PreRegion("5a_c-01c_east", "5a_c-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01c_east"]), + + "5a_c-08b_west": PreRegion("5a_c-08b_west", "5a_c-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08b_west"]), + "5a_c-08b_east": PreRegion("5a_c-08b_east", "5a_c-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08b_east"]), + + "5a_c-08_west": PreRegion("5a_c-08_west", "5a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08_west"]), + "5a_c-08_east": PreRegion("5a_c-08_east", "5a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08_east"]), + + "5a_c-10_west": PreRegion("5a_c-10_west", "5a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-10_west"]), + "5a_c-10_east": PreRegion("5a_c-10_east", "5a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-10_east"]), + + "5a_c-12_west": PreRegion("5a_c-12_west", "5a_c-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-12_west"]), + "5a_c-12_east": PreRegion("5a_c-12_east", "5a_c-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-12_east"]), + + "5a_c-07_west": PreRegion("5a_c-07_west", "5a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-07_west"]), + "5a_c-07_east": PreRegion("5a_c-07_east", "5a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-07_east"]), + + "5a_c-11_west": PreRegion("5a_c-11_west", "5a_c-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-11_west"]), + "5a_c-11_east": PreRegion("5a_c-11_east", "5a_c-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-11_east"]), + + "5a_c-09_west": PreRegion("5a_c-09_west", "5a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-09_west"]), + "5a_c-09_east": PreRegion("5a_c-09_east", "5a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-09_east"]), + + "5a_c-13_west": PreRegion("5a_c-13_west", "5a_c-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-13_west"]), + "5a_c-13_east": PreRegion("5a_c-13_east", "5a_c-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-13_east"]), + + "5a_d-00_south": PreRegion("5a_d-00_south", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_south"]), + "5a_d-00_north": PreRegion("5a_d-00_north", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_north"]), + "5a_d-00_west": PreRegion("5a_d-00_west", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_west"]), + "5a_d-00_east": PreRegion("5a_d-00_east", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_east"]), + + "5a_d-01_south": PreRegion("5a_d-01_south", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south"]), + "5a_d-01_center": PreRegion("5a_d-01_center", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_center"]), + "5a_d-01_south-west-left": PreRegion("5a_d-01_south-west-left", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-west-left"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-west-left"]), + "5a_d-01_south-west-down": PreRegion("5a_d-01_south-west-down", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-west-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-west-down"]), + "5a_d-01_south-east-right": PreRegion("5a_d-01_south-east-right", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-east-right"]), + "5a_d-01_south-east-down": PreRegion("5a_d-01_south-east-down", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-east-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-east-down"]), + "5a_d-01_west": PreRegion("5a_d-01_west", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_west"]), + "5a_d-01_east": PreRegion("5a_d-01_east", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_east"]), + "5a_d-01_north-west": PreRegion("5a_d-01_north-west", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_north-west"]), + "5a_d-01_north-east": PreRegion("5a_d-01_north-east", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_north-east"]), + + "5a_d-09_east": PreRegion("5a_d-09_east", "5a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-09_east"]), + "5a_d-09_west": PreRegion("5a_d-09_west", "5a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-09_west"]), + + "5a_d-04_east": PreRegion("5a_d-04_east", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_east"]), + "5a_d-04_west": PreRegion("5a_d-04_west", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_west"]), + "5a_d-04_south-west-left": PreRegion("5a_d-04_south-west-left", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-west-left"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-west-left"]), + "5a_d-04_south-west-right": PreRegion("5a_d-04_south-west-right", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-west-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-west-right"]), + "5a_d-04_south-east": PreRegion("5a_d-04_south-east", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-east"]), + "5a_d-04_north": PreRegion("5a_d-04_north", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_north"]), + + "5a_d-05_north": PreRegion("5a_d-05_north", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_north"]), + "5a_d-05_east": PreRegion("5a_d-05_east", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_east"]), + "5a_d-05_south": PreRegion("5a_d-05_south", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_south"]), + "5a_d-05_west": PreRegion("5a_d-05_west", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_west"]), + + "5a_d-06_north-east": PreRegion("5a_d-06_north-east", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_north-east"]), + "5a_d-06_south-east": PreRegion("5a_d-06_south-east", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_south-east"]), + "5a_d-06_south-west": PreRegion("5a_d-06_south-west", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_south-west"]), + "5a_d-06_north-west": PreRegion("5a_d-06_north-west", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_north-west"]), + + "5a_d-07_west": PreRegion("5a_d-07_west", "5a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-07_west"]), + "5a_d-07_north": PreRegion("5a_d-07_north", "5a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-07_north"]), + + "5a_d-02_east": PreRegion("5a_d-02_east", "5a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-02_east"]), + "5a_d-02_west": PreRegion("5a_d-02_west", "5a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-02_west"]), + + "5a_d-03_east": PreRegion("5a_d-03_east", "5a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-03_east"]), + "5a_d-03_west": PreRegion("5a_d-03_west", "5a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-03_west"]), + + "5a_d-15_north-west": PreRegion("5a_d-15_north-west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_north-west"]), + "5a_d-15_center": PreRegion("5a_d-15_center", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_center"]), + "5a_d-15_west": PreRegion("5a_d-15_west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_west"]), + "5a_d-15_south-west": PreRegion("5a_d-15_south-west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south-west"]), + "5a_d-15_south": PreRegion("5a_d-15_south", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south"]), + "5a_d-15_south-east": PreRegion("5a_d-15_south-east", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south-east"]), + + "5a_d-13_east": PreRegion("5a_d-13_east", "5a_d-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-13_east"]), + "5a_d-13_west": PreRegion("5a_d-13_west", "5a_d-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-13_west"]), + + "5a_d-19b_south-east-right": PreRegion("5a_d-19b_south-east-right", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-east-right"]), + "5a_d-19b_south-east-down": PreRegion("5a_d-19b_south-east-down", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-east-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-east-down"]), + "5a_d-19b_south-west": PreRegion("5a_d-19b_south-west", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-west"]), + "5a_d-19b_north-east": PreRegion("5a_d-19b_north-east", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_north-east"]), + + "5a_d-19_east": PreRegion("5a_d-19_east", "5a_d-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19_east"]), + "5a_d-19_west": PreRegion("5a_d-19_west", "5a_d-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19_west"]), + + "5a_d-10_west": PreRegion("5a_d-10_west", "5a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-10_west"]), + "5a_d-10_east": PreRegion("5a_d-10_east", "5a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-10_east"]), + + "5a_d-20_west": PreRegion("5a_d-20_west", "5a_d-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-20_west"]), + "5a_d-20_east": PreRegion("5a_d-20_east", "5a_d-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-20_east"]), + + "5a_e-00_west": PreRegion("5a_e-00_west", "5a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-00_west"]), + "5a_e-00_east": PreRegion("5a_e-00_east", "5a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-00_east"]), + + "5a_e-01_west": PreRegion("5a_e-01_west", "5a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-01_west"]), + "5a_e-01_east": PreRegion("5a_e-01_east", "5a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-01_east"]), + + "5a_e-02_west": PreRegion("5a_e-02_west", "5a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-02_west"]), + "5a_e-02_east": PreRegion("5a_e-02_east", "5a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-02_east"]), + + "5a_e-03_west": PreRegion("5a_e-03_west", "5a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-03_west"]), + "5a_e-03_east": PreRegion("5a_e-03_east", "5a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-03_east"]), + + "5a_e-04_west": PreRegion("5a_e-04_west", "5a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-04_west"]), + "5a_e-04_east": PreRegion("5a_e-04_east", "5a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-04_east"]), + + "5a_e-06_west": PreRegion("5a_e-06_west", "5a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-06_west"]), + "5a_e-06_east": PreRegion("5a_e-06_east", "5a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-06_east"]), + + "5a_e-05_west": PreRegion("5a_e-05_west", "5a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-05_west"]), + "5a_e-05_east": PreRegion("5a_e-05_east", "5a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-05_east"]), + + "5a_e-07_west": PreRegion("5a_e-07_west", "5a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-07_west"]), + "5a_e-07_east": PreRegion("5a_e-07_east", "5a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-07_east"]), + + "5a_e-08_west": PreRegion("5a_e-08_west", "5a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-08_west"]), + "5a_e-08_east": PreRegion("5a_e-08_east", "5a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-08_east"]), + + "5a_e-09_west": PreRegion("5a_e-09_west", "5a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-09_west"]), + "5a_e-09_east": PreRegion("5a_e-09_east", "5a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-09_east"]), + + "5a_e-10_west": PreRegion("5a_e-10_west", "5a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-10_west"]), + "5a_e-10_east": PreRegion("5a_e-10_east", "5a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-10_east"]), + + "5a_e-11_west": PreRegion("5a_e-11_west", "5a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-11_west"]), + "5a_e-11_goal": PreRegion("5a_e-11_goal", "5a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-11_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-11_goal"]), + + "5b_start_west": PreRegion("5b_start_west", "5b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_start_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_start_west"]), + "5b_start_east": PreRegion("5b_start_east", "5b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_start_east"]), + + "5b_a-00_west": PreRegion("5b_a-00_west", "5b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-00_west"]), + "5b_a-00_east": PreRegion("5b_a-00_east", "5b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-00_east"]), + + "5b_a-01_west": PreRegion("5b_a-01_west", "5b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-01_west"]), + "5b_a-01_east": PreRegion("5b_a-01_east", "5b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-01_east"]), + + "5b_a-02_west": PreRegion("5b_a-02_west", "5b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-02_west"]), + "5b_a-02_east": PreRegion("5b_a-02_east", "5b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-02_east"]), + + "5b_b-00_south": PreRegion("5b_b-00_south", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_south"]), + "5b_b-00_west": PreRegion("5b_b-00_west", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_west"]), + "5b_b-00_north": PreRegion("5b_b-00_north", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_north"]), + "5b_b-00_east": PreRegion("5b_b-00_east", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_east"]), + + "5b_b-01_west": PreRegion("5b_b-01_west", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_west"]), + "5b_b-01_north": PreRegion("5b_b-01_north", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_north"]), + "5b_b-01_east": PreRegion("5b_b-01_east", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_east"]), + + "5b_b-04_east": PreRegion("5b_b-04_east", "5b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-04_east"]), + "5b_b-04_west": PreRegion("5b_b-04_west", "5b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-04_west"]), + + "5b_b-02_south": PreRegion("5b_b-02_south", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south"]), + "5b_b-02_center": PreRegion("5b_b-02_center", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_center"]), + "5b_b-02_north-west": PreRegion("5b_b-02_north-west", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north-west"]), + "5b_b-02_north-east": PreRegion("5b_b-02_north-east", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north-east"]), + "5b_b-02_north": PreRegion("5b_b-02_north", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north"]), + "5b_b-02_south-west": PreRegion("5b_b-02_south-west", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south-west"]), + "5b_b-02_south-east": PreRegion("5b_b-02_south-east", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south-east"]), + + "5b_b-05_north": PreRegion("5b_b-05_north", "5b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-05_north"]), + "5b_b-05_south": PreRegion("5b_b-05_south", "5b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-05_south"]), + + "5b_b-06_east": PreRegion("5b_b-06_east", "5b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-06_east"]), + + "5b_b-07_north": PreRegion("5b_b-07_north", "5b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-07_north"]), + "5b_b-07_south": PreRegion("5b_b-07_south", "5b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-07_south"]), + + "5b_b-03_west": PreRegion("5b_b-03_west", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_west"]), + "5b_b-03_main": PreRegion("5b_b-03_main", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_main"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_main"]), + "5b_b-03_north": PreRegion("5b_b-03_north", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_north"]), + "5b_b-03_east": PreRegion("5b_b-03_east", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_east"]), + + "5b_b-08_south": PreRegion("5b_b-08_south", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_south"]), + "5b_b-08_north": PreRegion("5b_b-08_north", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_north"]), + "5b_b-08_east": PreRegion("5b_b-08_east", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_east"]), + + "5b_b-09_bottom": PreRegion("5b_b-09_bottom", "5b_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-09_bottom"]), + "5b_b-09_mirror": PreRegion("5b_b-09_mirror", "5b_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-09_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-09_mirror"]), + + "5b_c-00_bottom": PreRegion("5b_c-00_bottom", "5b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-00_bottom"]), + "5b_c-00_mirror": PreRegion("5b_c-00_mirror", "5b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-00_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-00_mirror"]), + + "5b_c-01_west": PreRegion("5b_c-01_west", "5b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-01_west"]), + "5b_c-01_east": PreRegion("5b_c-01_east", "5b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-01_east"]), + + "5b_c-02_west": PreRegion("5b_c-02_west", "5b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-02_west"]), + "5b_c-02_east": PreRegion("5b_c-02_east", "5b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-02_east"]), + + "5b_c-03_west": PreRegion("5b_c-03_west", "5b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-03_west"]), + "5b_c-03_east": PreRegion("5b_c-03_east", "5b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-03_east"]), + + "5b_c-04_west": PreRegion("5b_c-04_west", "5b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-04_west"]), + "5b_c-04_east": PreRegion("5b_c-04_east", "5b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-04_east"]), + + "5b_d-00_west": PreRegion("5b_d-00_west", "5b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-00_west"]), + "5b_d-00_east": PreRegion("5b_d-00_east", "5b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-00_east"]), + + "5b_d-01_west": PreRegion("5b_d-01_west", "5b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-01_west"]), + "5b_d-01_east": PreRegion("5b_d-01_east", "5b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-01_east"]), + + "5b_d-02_west": PreRegion("5b_d-02_west", "5b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-02_west"]), + "5b_d-02_east": PreRegion("5b_d-02_east", "5b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-02_east"]), + + "5b_d-03_west": PreRegion("5b_d-03_west", "5b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-03_west"]), + "5b_d-03_east": PreRegion("5b_d-03_east", "5b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-03_east"]), + + "5b_d-04_west": PreRegion("5b_d-04_west", "5b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-04_west"]), + "5b_d-04_east": PreRegion("5b_d-04_east", "5b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-04_east"]), + + "5b_d-05_west": PreRegion("5b_d-05_west", "5b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-05_west"]), + "5b_d-05_goal": PreRegion("5b_d-05_goal", "5b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-05_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-05_goal"]), + + "5c_00_west": PreRegion("5c_00_west", "5c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_00_west"]), + "5c_00_east": PreRegion("5c_00_east", "5c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_00_east"]), + + "5c_01_west": PreRegion("5c_01_west", "5c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_01_west"]), + "5c_01_east": PreRegion("5c_01_east", "5c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_01_east"]), + + "5c_02_west": PreRegion("5c_02_west", "5c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_02_west"]), + "5c_02_goal": PreRegion("5c_02_goal", "5c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_02_goal"]), + + "6a_00_west": PreRegion("6a_00_west", "6a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_00_west"]), + "6a_00_east": PreRegion("6a_00_east", "6a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_00_east"]), + + "6a_01_bottom": PreRegion("6a_01_bottom", "6a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_01_bottom"]), + "6a_01_top": PreRegion("6a_01_top", "6a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_01_top"]), + + "6a_02_bottom": PreRegion("6a_02_bottom", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_bottom"]), + "6a_02_bottom-west": PreRegion("6a_02_bottom-west", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_bottom-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_bottom-west"]), + "6a_02_top-west": PreRegion("6a_02_top-west", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_top-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_top-west"]), + "6a_02_top": PreRegion("6a_02_top", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_top"]), + + "6a_03_bottom": PreRegion("6a_03_bottom", "6a_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_03_bottom"]), + "6a_03_top": PreRegion("6a_03_top", "6a_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_03_top"]), + + "6a_02b_bottom": PreRegion("6a_02b_bottom", "6a_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02b_bottom"]), + "6a_02b_top": PreRegion("6a_02b_top", "6a_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02b_top"]), + + "6a_04_south": PreRegion("6a_04_south", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south"]), + "6a_04_south-west": PreRegion("6a_04_south-west", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south-west"]), + "6a_04_south-east": PreRegion("6a_04_south-east", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south-east"]), + "6a_04_east": PreRegion("6a_04_east", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_east"]), + "6a_04_north-west": PreRegion("6a_04_north-west", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_north-west"]), + + "6a_04b_west": PreRegion("6a_04b_west", "6a_04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04b_west"]), + "6a_04b_east": PreRegion("6a_04b_east", "6a_04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04b_east"]), + + "6a_04c_east": PreRegion("6a_04c_east", "6a_04c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04c_east"]), + + "6a_04d_west": PreRegion("6a_04d_west", "6a_04d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04d_west"]), + + "6a_04e_east": PreRegion("6a_04e_east", "6a_04e", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04e_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04e_east"]), + + "6a_05_west": PreRegion("6a_05_west", "6a_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_05_west"]), + "6a_05_east": PreRegion("6a_05_east", "6a_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_05_east"]), + + "6a_06_west": PreRegion("6a_06_west", "6a_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_06_west"]), + "6a_06_east": PreRegion("6a_06_east", "6a_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_06_east"]), + + "6a_07_west": PreRegion("6a_07_west", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_west"]), + "6a_07_east": PreRegion("6a_07_east", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_east"]), + "6a_07_north-east": PreRegion("6a_07_north-east", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_north-east"]), + + "6a_08a_west": PreRegion("6a_08a_west", "6a_08a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08a_west"]), + "6a_08a_east": PreRegion("6a_08a_east", "6a_08a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08a_east"]), + + "6a_08b_west": PreRegion("6a_08b_west", "6a_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08b_west"]), + "6a_08b_east": PreRegion("6a_08b_east", "6a_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08b_east"]), + + "6a_09_west": PreRegion("6a_09_west", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_west"]), + "6a_09_north-west": PreRegion("6a_09_north-west", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_north-west"]), + "6a_09_east": PreRegion("6a_09_east", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_east"]), + "6a_09_north-east": PreRegion("6a_09_north-east", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_north-east"]), + + "6a_10a_west": PreRegion("6a_10a_west", "6a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10a_west"]), + "6a_10a_east": PreRegion("6a_10a_east", "6a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10a_east"]), + + "6a_10b_west": PreRegion("6a_10b_west", "6a_10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10b_west"]), + "6a_10b_east": PreRegion("6a_10b_east", "6a_10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10b_east"]), + + "6a_11_west": PreRegion("6a_11_west", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_west"]), + "6a_11_north-west": PreRegion("6a_11_north-west", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_north-west"]), + "6a_11_east": PreRegion("6a_11_east", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_east"]), + "6a_11_north-east": PreRegion("6a_11_north-east", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_north-east"]), + + "6a_12a_west": PreRegion("6a_12a_west", "6a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12a_west"]), + "6a_12a_east": PreRegion("6a_12a_east", "6a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12a_east"]), + + "6a_12b_west": PreRegion("6a_12b_west", "6a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12b_west"]), + "6a_12b_east": PreRegion("6a_12b_east", "6a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12b_east"]), + + "6a_13_west": PreRegion("6a_13_west", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_west"]), + "6a_13_north-west": PreRegion("6a_13_north-west", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_north-west"]), + "6a_13_east": PreRegion("6a_13_east", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_east"]), + "6a_13_north-east": PreRegion("6a_13_north-east", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_north-east"]), + + "6a_14a_west": PreRegion("6a_14a_west", "6a_14a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14a_west"]), + "6a_14a_east": PreRegion("6a_14a_east", "6a_14a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14a_east"]), + + "6a_14b_west": PreRegion("6a_14b_west", "6a_14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14b_west"]), + "6a_14b_east": PreRegion("6a_14b_east", "6a_14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14b_east"]), + + "6a_15_west": PreRegion("6a_15_west", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_west"]), + "6a_15_north-west": PreRegion("6a_15_north-west", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_north-west"]), + "6a_15_east": PreRegion("6a_15_east", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_east"]), + "6a_15_north-east": PreRegion("6a_15_north-east", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_north-east"]), + + "6a_16a_west": PreRegion("6a_16a_west", "6a_16a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16a_west"]), + "6a_16a_east": PreRegion("6a_16a_east", "6a_16a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16a_east"]), + + "6a_16b_west": PreRegion("6a_16b_west", "6a_16b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16b_west"]), + "6a_16b_east": PreRegion("6a_16b_east", "6a_16b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16b_east"]), + + "6a_17_west": PreRegion("6a_17_west", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_west"]), + "6a_17_north-west": PreRegion("6a_17_north-west", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_north-west"]), + "6a_17_east": PreRegion("6a_17_east", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_east"]), + "6a_17_north-east": PreRegion("6a_17_north-east", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_north-east"]), + + "6a_18a_west": PreRegion("6a_18a_west", "6a_18a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18a_west"]), + "6a_18a_east": PreRegion("6a_18a_east", "6a_18a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18a_east"]), + + "6a_18b_west": PreRegion("6a_18b_west", "6a_18b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18b_west"]), + "6a_18b_east": PreRegion("6a_18b_east", "6a_18b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18b_east"]), + + "6a_19_west": PreRegion("6a_19_west", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_west"]), + "6a_19_north-west": PreRegion("6a_19_north-west", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_north-west"]), + "6a_19_east": PreRegion("6a_19_east", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_east"]), + + "6a_20_west": PreRegion("6a_20_west", "6a_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_20_west"]), + "6a_20_east": PreRegion("6a_20_east", "6a_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_20_east"]), + + "6a_b-00_west": PreRegion("6a_b-00_west", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_west"]), + "6a_b-00_east": PreRegion("6a_b-00_east", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_east"]), + "6a_b-00_top": PreRegion("6a_b-00_top", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_top"]), + + "6a_b-00b_bottom": PreRegion("6a_b-00b_bottom", "6a_b-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00b_bottom"]), + "6a_b-00b_top": PreRegion("6a_b-00b_top", "6a_b-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00b_top"]), + + "6a_b-00c_east": PreRegion("6a_b-00c_east", "6a_b-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00c_east"]), + + "6a_b-01_west": PreRegion("6a_b-01_west", "6a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-01_west"]), + "6a_b-01_east": PreRegion("6a_b-01_east", "6a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-01_east"]), + + "6a_b-02_top": PreRegion("6a_b-02_top", "6a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02_top"]), + "6a_b-02_bottom": PreRegion("6a_b-02_bottom", "6a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02_bottom"]), + + "6a_b-02b_top": PreRegion("6a_b-02b_top", "6a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02b_top"]), + "6a_b-02b_bottom": PreRegion("6a_b-02b_bottom", "6a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02b_bottom"]), + + "6a_b-03_west": PreRegion("6a_b-03_west", "6a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-03_west"]), + "6a_b-03_east": PreRegion("6a_b-03_east", "6a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-03_east"]), + + "6a_boss-00_west": PreRegion("6a_boss-00_west", "6a_boss-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-00_west"]), + "6a_boss-00_east": PreRegion("6a_boss-00_east", "6a_boss-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-00_east"]), + + "6a_boss-01_west": PreRegion("6a_boss-01_west", "6a_boss-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-01_west"]), + "6a_boss-01_east": PreRegion("6a_boss-01_east", "6a_boss-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-01_east"]), + + "6a_boss-02_west": PreRegion("6a_boss-02_west", "6a_boss-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-02_west"]), + "6a_boss-02_east": PreRegion("6a_boss-02_east", "6a_boss-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-02_east"]), + + "6a_boss-03_west": PreRegion("6a_boss-03_west", "6a_boss-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-03_west"]), + "6a_boss-03_east": PreRegion("6a_boss-03_east", "6a_boss-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-03_east"]), + + "6a_boss-04_west": PreRegion("6a_boss-04_west", "6a_boss-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-04_west"]), + "6a_boss-04_east": PreRegion("6a_boss-04_east", "6a_boss-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-04_east"]), + + "6a_boss-05_west": PreRegion("6a_boss-05_west", "6a_boss-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-05_west"]), + "6a_boss-05_east": PreRegion("6a_boss-05_east", "6a_boss-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-05_east"]), + + "6a_boss-06_west": PreRegion("6a_boss-06_west", "6a_boss-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-06_west"]), + "6a_boss-06_east": PreRegion("6a_boss-06_east", "6a_boss-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-06_east"]), + + "6a_boss-07_west": PreRegion("6a_boss-07_west", "6a_boss-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-07_west"]), + "6a_boss-07_east": PreRegion("6a_boss-07_east", "6a_boss-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-07_east"]), + + "6a_boss-08_west": PreRegion("6a_boss-08_west", "6a_boss-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-08_west"]), + "6a_boss-08_east": PreRegion("6a_boss-08_east", "6a_boss-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-08_east"]), + + "6a_boss-09_west": PreRegion("6a_boss-09_west", "6a_boss-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-09_west"]), + "6a_boss-09_east": PreRegion("6a_boss-09_east", "6a_boss-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-09_east"]), + + "6a_boss-10_west": PreRegion("6a_boss-10_west", "6a_boss-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-10_west"]), + "6a_boss-10_east": PreRegion("6a_boss-10_east", "6a_boss-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-10_east"]), + + "6a_boss-11_west": PreRegion("6a_boss-11_west", "6a_boss-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-11_west"]), + "6a_boss-11_east": PreRegion("6a_boss-11_east", "6a_boss-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-11_east"]), + + "6a_boss-12_west": PreRegion("6a_boss-12_west", "6a_boss-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-12_west"]), + "6a_boss-12_east": PreRegion("6a_boss-12_east", "6a_boss-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-12_east"]), + + "6a_boss-13_west": PreRegion("6a_boss-13_west", "6a_boss-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-13_west"]), + "6a_boss-13_east": PreRegion("6a_boss-13_east", "6a_boss-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-13_east"]), + + "6a_boss-14_west": PreRegion("6a_boss-14_west", "6a_boss-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-14_west"]), + "6a_boss-14_east": PreRegion("6a_boss-14_east", "6a_boss-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-14_east"]), + + "6a_boss-15_west": PreRegion("6a_boss-15_west", "6a_boss-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-15_west"]), + "6a_boss-15_east": PreRegion("6a_boss-15_east", "6a_boss-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-15_east"]), + + "6a_boss-16_west": PreRegion("6a_boss-16_west", "6a_boss-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-16_west"]), + "6a_boss-16_east": PreRegion("6a_boss-16_east", "6a_boss-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-16_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-16_east"]), + + "6a_boss-17_west": PreRegion("6a_boss-17_west", "6a_boss-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-17_west"]), + "6a_boss-17_east": PreRegion("6a_boss-17_east", "6a_boss-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-17_east"]), + + "6a_boss-18_west": PreRegion("6a_boss-18_west", "6a_boss-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-18_west"]), + "6a_boss-18_east": PreRegion("6a_boss-18_east", "6a_boss-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-18_east"]), + + "6a_boss-19_west": PreRegion("6a_boss-19_west", "6a_boss-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-19_west"]), + "6a_boss-19_east": PreRegion("6a_boss-19_east", "6a_boss-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-19_east"]), + + "6a_boss-20_west": PreRegion("6a_boss-20_west", "6a_boss-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-20_west"]), + "6a_boss-20_east": PreRegion("6a_boss-20_east", "6a_boss-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-20_east"]), + + "6a_after-00_bottom": PreRegion("6a_after-00_bottom", "6a_after-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-00_bottom"]), + "6a_after-00_top": PreRegion("6a_after-00_top", "6a_after-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-00_top"]), + + "6a_after-01_bottom": PreRegion("6a_after-01_bottom", "6a_after-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-01_bottom"]), + "6a_after-01_goal": PreRegion("6a_after-01_goal", "6a_after-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-01_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-01_goal"]), + + "6b_a-00_bottom": PreRegion("6b_a-00_bottom", "6b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-00_bottom"]), + "6b_a-00_top": PreRegion("6b_a-00_top", "6b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-00_top"]), + + "6b_a-01_bottom": PreRegion("6b_a-01_bottom", "6b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-01_bottom"]), + "6b_a-01_top": PreRegion("6b_a-01_top", "6b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-01_top"]), + + "6b_a-02_bottom": PreRegion("6b_a-02_bottom", "6b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-02_bottom"]), + "6b_a-02_top": PreRegion("6b_a-02_top", "6b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-02_top"]), + + "6b_a-03_west": PreRegion("6b_a-03_west", "6b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-03_west"]), + "6b_a-03_east": PreRegion("6b_a-03_east", "6b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-03_east"]), + + "6b_a-04_west": PreRegion("6b_a-04_west", "6b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-04_west"]), + "6b_a-04_east": PreRegion("6b_a-04_east", "6b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-04_east"]), + + "6b_a-05_west": PreRegion("6b_a-05_west", "6b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-05_west"]), + "6b_a-05_east": PreRegion("6b_a-05_east", "6b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-05_east"]), + + "6b_a-06_west": PreRegion("6b_a-06_west", "6b_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-06_west"]), + "6b_a-06_east": PreRegion("6b_a-06_east", "6b_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-06_east"]), + + "6b_b-00_west": PreRegion("6b_b-00_west", "6b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-00_west"]), + "6b_b-00_east": PreRegion("6b_b-00_east", "6b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-00_east"]), + + "6b_b-01_top": PreRegion("6b_b-01_top", "6b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-01_top"]), + "6b_b-01_bottom": PreRegion("6b_b-01_bottom", "6b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-01_bottom"]), + + "6b_b-02_top": PreRegion("6b_b-02_top", "6b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-02_top"]), + "6b_b-02_bottom": PreRegion("6b_b-02_bottom", "6b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-02_bottom"]), + + "6b_b-03_top": PreRegion("6b_b-03_top", "6b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-03_top"]), + "6b_b-03_bottom": PreRegion("6b_b-03_bottom", "6b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-03_bottom"]), + + "6b_b-04_top": PreRegion("6b_b-04_top", "6b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-04_top"]), + "6b_b-04_bottom": PreRegion("6b_b-04_bottom", "6b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-04_bottom"]), + + "6b_b-05_top": PreRegion("6b_b-05_top", "6b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-05_top"]), + "6b_b-05_bottom": PreRegion("6b_b-05_bottom", "6b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-05_bottom"]), + + "6b_b-06_top": PreRegion("6b_b-06_top", "6b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-06_top"]), + "6b_b-06_bottom": PreRegion("6b_b-06_bottom", "6b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-06_bottom"]), + + "6b_b-07_top": PreRegion("6b_b-07_top", "6b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-07_top"]), + "6b_b-07_bottom": PreRegion("6b_b-07_bottom", "6b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-07_bottom"]), + + "6b_b-08_top": PreRegion("6b_b-08_top", "6b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-08_top"]), + "6b_b-08_bottom": PreRegion("6b_b-08_bottom", "6b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-08_bottom"]), + + "6b_b-10_west": PreRegion("6b_b-10_west", "6b_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-10_west"]), + "6b_b-10_east": PreRegion("6b_b-10_east", "6b_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-10_east"]), + + "6b_c-00_west": PreRegion("6b_c-00_west", "6b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-00_west"]), + "6b_c-00_east": PreRegion("6b_c-00_east", "6b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-00_east"]), + + "6b_c-01_west": PreRegion("6b_c-01_west", "6b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-01_west"]), + "6b_c-01_east": PreRegion("6b_c-01_east", "6b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-01_east"]), + + "6b_c-02_west": PreRegion("6b_c-02_west", "6b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-02_west"]), + "6b_c-02_east": PreRegion("6b_c-02_east", "6b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-02_east"]), + + "6b_c-03_west": PreRegion("6b_c-03_west", "6b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-03_west"]), + "6b_c-03_east": PreRegion("6b_c-03_east", "6b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-03_east"]), + + "6b_c-04_west": PreRegion("6b_c-04_west", "6b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-04_west"]), + "6b_c-04_east": PreRegion("6b_c-04_east", "6b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-04_east"]), + + "6b_d-00_west": PreRegion("6b_d-00_west", "6b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-00_west"]), + "6b_d-00_east": PreRegion("6b_d-00_east", "6b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-00_east"]), + + "6b_d-01_west": PreRegion("6b_d-01_west", "6b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-01_west"]), + "6b_d-01_east": PreRegion("6b_d-01_east", "6b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-01_east"]), + + "6b_d-02_west": PreRegion("6b_d-02_west", "6b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-02_west"]), + "6b_d-02_east": PreRegion("6b_d-02_east", "6b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-02_east"]), + + "6b_d-03_west": PreRegion("6b_d-03_west", "6b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-03_west"]), + "6b_d-03_east": PreRegion("6b_d-03_east", "6b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-03_east"]), + + "6b_d-04_west": PreRegion("6b_d-04_west", "6b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-04_west"]), + "6b_d-04_east": PreRegion("6b_d-04_east", "6b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-04_east"]), + + "6b_d-05_west": PreRegion("6b_d-05_west", "6b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-05_west"]), + "6b_d-05_goal": PreRegion("6b_d-05_goal", "6b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-05_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-05_goal"]), + + "6c_00_west": PreRegion("6c_00_west", "6c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_00_west"]), + "6c_00_east": PreRegion("6c_00_east", "6c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_00_east"]), + + "6c_01_west": PreRegion("6c_01_west", "6c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_01_west"]), + "6c_01_east": PreRegion("6c_01_east", "6c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_01_east"]), + + "6c_02_west": PreRegion("6c_02_west", "6c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_02_west"]), + "6c_02_goal": PreRegion("6c_02_goal", "6c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_02_goal"]), + + "7a_a-00_west": PreRegion("7a_a-00_west", "7a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-00_west"]), + "7a_a-00_east": PreRegion("7a_a-00_east", "7a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-00_east"]), + + "7a_a-01_west": PreRegion("7a_a-01_west", "7a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-01_west"]), + "7a_a-01_east": PreRegion("7a_a-01_east", "7a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-01_east"]), + + "7a_a-02_west": PreRegion("7a_a-02_west", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_west"]), + "7a_a-02_east": PreRegion("7a_a-02_east", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_east"]), + "7a_a-02_north": PreRegion("7a_a-02_north", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_north"]), + "7a_a-02_north-west": PreRegion("7a_a-02_north-west", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_north-west"]), + + "7a_a-02b_east": PreRegion("7a_a-02b_east", "7a_a-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02b_east"]), + "7a_a-02b_west": PreRegion("7a_a-02b_west", "7a_a-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02b_west"]), + + "7a_a-03_west": PreRegion("7a_a-03_west", "7a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-03_west"]), + "7a_a-03_east": PreRegion("7a_a-03_east", "7a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-03_east"]), + + "7a_a-04_west": PreRegion("7a_a-04_west", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_west"]), + "7a_a-04_north": PreRegion("7a_a-04_north", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_north"]), + "7a_a-04_east": PreRegion("7a_a-04_east", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_east"]), + + "7a_a-04b_east": PreRegion("7a_a-04b_east", "7a_a-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04b_east"]), + + "7a_a-05_west": PreRegion("7a_a-05_west", "7a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-05_west"]), + "7a_a-05_east": PreRegion("7a_a-05_east", "7a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-05_east"]), + + "7a_a-06_bottom": PreRegion("7a_a-06_bottom", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_bottom"]), + "7a_a-06_top": PreRegion("7a_a-06_top", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_top"]), + "7a_a-06_top-side": PreRegion("7a_a-06_top-side", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_top-side"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_top-side"]), + + "7a_b-00_bottom": PreRegion("7a_b-00_bottom", "7a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-00_bottom"]), + "7a_b-00_top": PreRegion("7a_b-00_top", "7a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-00_top"]), + + "7a_b-01_west": PreRegion("7a_b-01_west", "7a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-01_west"]), + "7a_b-01_east": PreRegion("7a_b-01_east", "7a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-01_east"]), + + "7a_b-02_south": PreRegion("7a_b-02_south", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_south"]), + "7a_b-02_north-west": PreRegion("7a_b-02_north-west", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north-west"]), + "7a_b-02_north": PreRegion("7a_b-02_north", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north"]), + "7a_b-02_north-east": PreRegion("7a_b-02_north-east", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north-east"]), + + "7a_b-02b_south": PreRegion("7a_b-02b_south", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_south"]), + "7a_b-02b_north-west": PreRegion("7a_b-02b_north-west", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_north-west"]), + "7a_b-02b_north-east": PreRegion("7a_b-02b_north-east", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_north-east"]), + + "7a_b-02e_east": PreRegion("7a_b-02e_east", "7a_b-02e", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02e_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02e_east"]), + + "7a_b-02c_west": PreRegion("7a_b-02c_west", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_west"]), + "7a_b-02c_east": PreRegion("7a_b-02c_east", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_east"]), + "7a_b-02c_south-east": PreRegion("7a_b-02c_south-east", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_south-east"]), + + "7a_b-02d_north": PreRegion("7a_b-02d_north", "7a_b-02d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02d_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02d_north"]), + "7a_b-02d_south": PreRegion("7a_b-02d_south", "7a_b-02d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02d_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02d_south"]), + + "7a_b-03_west": PreRegion("7a_b-03_west", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_west"]), + "7a_b-03_east": PreRegion("7a_b-03_east", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_east"]), + "7a_b-03_north": PreRegion("7a_b-03_north", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_north"]), + + "7a_b-04_west": PreRegion("7a_b-04_west", "7a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-04_west"]), + + "7a_b-05_west": PreRegion("7a_b-05_west", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_west"]), + "7a_b-05_east": PreRegion("7a_b-05_east", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_east"]), + "7a_b-05_north-west": PreRegion("7a_b-05_north-west", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_north-west"]), + + "7a_b-06_west": PreRegion("7a_b-06_west", "7a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-06_west"]), + "7a_b-06_east": PreRegion("7a_b-06_east", "7a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-06_east"]), + + "7a_b-07_west": PreRegion("7a_b-07_west", "7a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-07_west"]), + "7a_b-07_east": PreRegion("7a_b-07_east", "7a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-07_east"]), + + "7a_b-08_west": PreRegion("7a_b-08_west", "7a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-08_west"]), + "7a_b-08_east": PreRegion("7a_b-08_east", "7a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-08_east"]), + + "7a_b-09_bottom": PreRegion("7a_b-09_bottom", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_bottom"]), + "7a_b-09_top": PreRegion("7a_b-09_top", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_top"]), + "7a_b-09_top-side": PreRegion("7a_b-09_top-side", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_top-side"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_top-side"]), + + "7a_c-00_west": PreRegion("7a_c-00_west", "7a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-00_west"]), + "7a_c-00_east": PreRegion("7a_c-00_east", "7a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-00_east"]), + + "7a_c-01_bottom": PreRegion("7a_c-01_bottom", "7a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-01_bottom"]), + "7a_c-01_top": PreRegion("7a_c-01_top", "7a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-01_top"]), + + "7a_c-02_bottom": PreRegion("7a_c-02_bottom", "7a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-02_bottom"]), + "7a_c-02_top": PreRegion("7a_c-02_top", "7a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-02_top"]), + + "7a_c-03_south": PreRegion("7a_c-03_south", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_south"]), + "7a_c-03_west": PreRegion("7a_c-03_west", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_west"]), + "7a_c-03_east": PreRegion("7a_c-03_east", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_east"]), + + "7a_c-03b_east": PreRegion("7a_c-03b_east", "7a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03b_east"]), + + "7a_c-04_west": PreRegion("7a_c-04_west", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_west"]), + "7a_c-04_north-west": PreRegion("7a_c-04_north-west", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_north-west"]), + "7a_c-04_north-east": PreRegion("7a_c-04_north-east", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_north-east"]), + "7a_c-04_east": PreRegion("7a_c-04_east", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_east"]), + + "7a_c-05_west": PreRegion("7a_c-05_west", "7a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-05_west"]), + + "7a_c-06_south": PreRegion("7a_c-06_south", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_south"]), + "7a_c-06_north": PreRegion("7a_c-06_north", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_north"]), + "7a_c-06_east": PreRegion("7a_c-06_east", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_east"]), + + "7a_c-06b_south": PreRegion("7a_c-06b_south", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_south"]), + "7a_c-06b_north": PreRegion("7a_c-06b_north", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_north"]), + "7a_c-06b_west": PreRegion("7a_c-06b_west", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_west"]), + "7a_c-06b_east": PreRegion("7a_c-06b_east", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_east"]), + + "7a_c-06c_west": PreRegion("7a_c-06c_west", "7a_c-06c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06c_west"]), + + "7a_c-07_west": PreRegion("7a_c-07_west", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_west"]), + "7a_c-07_south-west": PreRegion("7a_c-07_south-west", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_south-west"]), + "7a_c-07_south-east": PreRegion("7a_c-07_south-east", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_south-east"]), + "7a_c-07_east": PreRegion("7a_c-07_east", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_east"]), + + "7a_c-07b_east": PreRegion("7a_c-07b_east", "7a_c-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07b_east"]), + + "7a_c-08_west": PreRegion("7a_c-08_west", "7a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-08_west"]), + "7a_c-08_east": PreRegion("7a_c-08_east", "7a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-08_east"]), + + "7a_c-09_bottom": PreRegion("7a_c-09_bottom", "7a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-09_bottom"]), + "7a_c-09_top": PreRegion("7a_c-09_top", "7a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-09_top"]), + + "7a_d-00_bottom": PreRegion("7a_d-00_bottom", "7a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-00_bottom"]), + "7a_d-00_top": PreRegion("7a_d-00_top", "7a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-00_top"]), + + "7a_d-01_west": PreRegion("7a_d-01_west", "7a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01_west"]), + "7a_d-01_east": PreRegion("7a_d-01_east", "7a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01_east"]), + + "7a_d-01b_west": PreRegion("7a_d-01b_west", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_west"]), + "7a_d-01b_south-west": PreRegion("7a_d-01b_south-west", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_south-west"]), + "7a_d-01b_east": PreRegion("7a_d-01b_east", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_east"]), + "7a_d-01b_south-east": PreRegion("7a_d-01b_south-east", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_south-east"]), + + "7a_d-01c_west": PreRegion("7a_d-01c_west", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_west"]), + "7a_d-01c_south": PreRegion("7a_d-01c_south", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_south"]), + "7a_d-01c_east": PreRegion("7a_d-01c_east", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_east"]), + "7a_d-01c_south-east": PreRegion("7a_d-01c_south-east", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_south-east"]), + + "7a_d-01d_west": PreRegion("7a_d-01d_west", "7a_d-01d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01d_west"]), + "7a_d-01d_east": PreRegion("7a_d-01d_east", "7a_d-01d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01d_east"]), + + "7a_d-02_west": PreRegion("7a_d-02_west", "7a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-02_west"]), + "7a_d-02_east": PreRegion("7a_d-02_east", "7a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-02_east"]), + + "7a_d-03_west": PreRegion("7a_d-03_west", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_west"]), + "7a_d-03_north-west": PreRegion("7a_d-03_north-west", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_north-west"]), + "7a_d-03_east": PreRegion("7a_d-03_east", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_east"]), + "7a_d-03_north-east": PreRegion("7a_d-03_north-east", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_north-east"]), + + "7a_d-03b_west": PreRegion("7a_d-03b_west", "7a_d-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03b_west"]), + "7a_d-03b_east": PreRegion("7a_d-03b_east", "7a_d-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03b_east"]), + + "7a_d-04_west": PreRegion("7a_d-04_west", "7a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-04_west"]), + "7a_d-04_east": PreRegion("7a_d-04_east", "7a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-04_east"]), + + "7a_d-05_west": PreRegion("7a_d-05_west", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_west"]), + "7a_d-05_north-east": PreRegion("7a_d-05_north-east", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_north-east"]), + "7a_d-05_east": PreRegion("7a_d-05_east", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_east"]), + + "7a_d-05b_west": PreRegion("7a_d-05b_west", "7a_d-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05b_west"]), + + "7a_d-06_west": PreRegion("7a_d-06_west", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_west"]), + "7a_d-06_south-west": PreRegion("7a_d-06_south-west", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_south-west"]), + "7a_d-06_south-east": PreRegion("7a_d-06_south-east", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_south-east"]), + "7a_d-06_east": PreRegion("7a_d-06_east", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_east"]), + + "7a_d-07_east": PreRegion("7a_d-07_east", "7a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-07_east"]), + + "7a_d-08_west": PreRegion("7a_d-08_west", "7a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-08_west"]), + "7a_d-08_east": PreRegion("7a_d-08_east", "7a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-08_east"]), + + "7a_d-09_west": PreRegion("7a_d-09_west", "7a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-09_west"]), + "7a_d-09_east": PreRegion("7a_d-09_east", "7a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-09_east"]), + + "7a_d-10_west": PreRegion("7a_d-10_west", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_west"]), + "7a_d-10_north-west": PreRegion("7a_d-10_north-west", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north-west"]), + "7a_d-10_north": PreRegion("7a_d-10_north", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north"]), + "7a_d-10_north-east": PreRegion("7a_d-10_north-east", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north-east"]), + "7a_d-10_east": PreRegion("7a_d-10_east", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_east"]), + + "7a_d-10b_west": PreRegion("7a_d-10b_west", "7a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10b_west"]), + "7a_d-10b_east": PreRegion("7a_d-10b_east", "7a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10b_east"]), + + "7a_d-11_bottom": PreRegion("7a_d-11_bottom", "7a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-11_bottom"]), + "7a_d-11_top": PreRegion("7a_d-11_top", "7a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-11_top"]), + + "7a_e-00b_bottom": PreRegion("7a_e-00b_bottom", "7a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00b_bottom"]), + "7a_e-00b_top": PreRegion("7a_e-00b_top", "7a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00b_top"]), + + "7a_e-00_west": PreRegion("7a_e-00_west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_west"]), + "7a_e-00_south-west": PreRegion("7a_e-00_south-west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_south-west"]), + "7a_e-00_north-west": PreRegion("7a_e-00_north-west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_north-west"]), + "7a_e-00_east": PreRegion("7a_e-00_east", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_east"]), + + "7a_e-01_west": PreRegion("7a_e-01_west", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_west"]), + "7a_e-01_north": PreRegion("7a_e-01_north", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_north"]), + "7a_e-01_east": PreRegion("7a_e-01_east", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_east"]), + + "7a_e-01b_west": PreRegion("7a_e-01b_west", "7a_e-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01b_west"]), + "7a_e-01b_east": PreRegion("7a_e-01b_east", "7a_e-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01b_east"]), + + "7a_e-01c_west": PreRegion("7a_e-01c_west", "7a_e-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01c_west"]), + "7a_e-01c_east": PreRegion("7a_e-01c_east", "7a_e-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01c_east"]), + + "7a_e-02_west": PreRegion("7a_e-02_west", "7a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-02_west"]), + "7a_e-02_east": PreRegion("7a_e-02_east", "7a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-02_east"]), + + "7a_e-03_south-west": PreRegion("7a_e-03_south-west", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_south-west"]), + "7a_e-03_west": PreRegion("7a_e-03_west", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_west"]), + "7a_e-03_east": PreRegion("7a_e-03_east", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_east"]), + + "7a_e-04_west": PreRegion("7a_e-04_west", "7a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-04_west"]), + "7a_e-04_east": PreRegion("7a_e-04_east", "7a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-04_east"]), + + "7a_e-05_west": PreRegion("7a_e-05_west", "7a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-05_west"]), + "7a_e-05_east": PreRegion("7a_e-05_east", "7a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-05_east"]), + + "7a_e-06_west": PreRegion("7a_e-06_west", "7a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-06_west"]), + "7a_e-06_east": PreRegion("7a_e-06_east", "7a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-06_east"]), + + "7a_e-07_bottom": PreRegion("7a_e-07_bottom", "7a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-07_bottom"]), + "7a_e-07_top": PreRegion("7a_e-07_top", "7a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-07_top"]), + + "7a_e-08_south": PreRegion("7a_e-08_south", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_south"]), + "7a_e-08_west": PreRegion("7a_e-08_west", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_west"]), + "7a_e-08_east": PreRegion("7a_e-08_east", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_east"]), + + "7a_e-09_north": PreRegion("7a_e-09_north", "7a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-09_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-09_north"]), + "7a_e-09_east": PreRegion("7a_e-09_east", "7a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-09_east"]), + + "7a_e-11_south": PreRegion("7a_e-11_south", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_south"]), + "7a_e-11_north": PreRegion("7a_e-11_north", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_north"]), + "7a_e-11_east": PreRegion("7a_e-11_east", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_east"]), + + "7a_e-12_west": PreRegion("7a_e-12_west", "7a_e-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-12_west"]), + + "7a_e-10_south": PreRegion("7a_e-10_south", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_south"]), + "7a_e-10_north": PreRegion("7a_e-10_north", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_north"]), + "7a_e-10_east": PreRegion("7a_e-10_east", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_east"]), + + "7a_e-10b_west": PreRegion("7a_e-10b_west", "7a_e-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10b_west"]), + "7a_e-10b_east": PreRegion("7a_e-10b_east", "7a_e-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10b_east"]), + + "7a_e-13_bottom": PreRegion("7a_e-13_bottom", "7a_e-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-13_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-13_bottom"]), + "7a_e-13_top": PreRegion("7a_e-13_top", "7a_e-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-13_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-13_top"]), + + "7a_f-00_south": PreRegion("7a_f-00_south", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_south"]), + "7a_f-00_west": PreRegion("7a_f-00_west", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_west"]), + "7a_f-00_north-west": PreRegion("7a_f-00_north-west", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_north-west"]), + "7a_f-00_north-east": PreRegion("7a_f-00_north-east", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_north-east"]), + "7a_f-00_east": PreRegion("7a_f-00_east", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_east"]), + + "7a_f-01_south": PreRegion("7a_f-01_south", "7a_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-01_south"]), + "7a_f-01_north": PreRegion("7a_f-01_north", "7a_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-01_north"]), + + "7a_f-02_west": PreRegion("7a_f-02_west", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_west"]), + "7a_f-02_north-west": PreRegion("7a_f-02_north-west", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_north-west"]), + "7a_f-02_north-east": PreRegion("7a_f-02_north-east", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_north-east"]), + "7a_f-02_east": PreRegion("7a_f-02_east", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_east"]), + + "7a_f-02b_west": PreRegion("7a_f-02b_west", "7a_f-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02b_west"]), + "7a_f-02b_east": PreRegion("7a_f-02b_east", "7a_f-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02b_east"]), + + "7a_f-04_west": PreRegion("7a_f-04_west", "7a_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-04_west"]), + "7a_f-04_east": PreRegion("7a_f-04_east", "7a_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-04_east"]), + + "7a_f-03_west": PreRegion("7a_f-03_west", "7a_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-03_west"]), + "7a_f-03_east": PreRegion("7a_f-03_east", "7a_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-03_east"]), + + "7a_f-05_west": PreRegion("7a_f-05_west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_west"]), + "7a_f-05_south-west": PreRegion("7a_f-05_south-west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south-west"]), + "7a_f-05_north-west": PreRegion("7a_f-05_north-west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north-west"]), + "7a_f-05_south": PreRegion("7a_f-05_south", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south"]), + "7a_f-05_north": PreRegion("7a_f-05_north", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north"]), + "7a_f-05_north-east": PreRegion("7a_f-05_north-east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north-east"]), + "7a_f-05_south-east": PreRegion("7a_f-05_south-east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south-east"]), + "7a_f-05_east": PreRegion("7a_f-05_east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_east"]), + + "7a_f-06_north-west": PreRegion("7a_f-06_north-west", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north-west"]), + "7a_f-06_north": PreRegion("7a_f-06_north", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north"]), + "7a_f-06_north-east": PreRegion("7a_f-06_north-east", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north-east"]), + + "7a_f-07_west": PreRegion("7a_f-07_west", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_west"]), + "7a_f-07_south-west": PreRegion("7a_f-07_south-west", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south-west"]), + "7a_f-07_south": PreRegion("7a_f-07_south", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south"]), + "7a_f-07_south-east": PreRegion("7a_f-07_south-east", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south-east"]), + + "7a_f-08_west": PreRegion("7a_f-08_west", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_west"]), + "7a_f-08_north-west": PreRegion("7a_f-08_north-west", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_north-west"]), + "7a_f-08_east": PreRegion("7a_f-08_east", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_east"]), + + "7a_f-08b_west": PreRegion("7a_f-08b_west", "7a_f-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08b_west"]), + "7a_f-08b_east": PreRegion("7a_f-08b_east", "7a_f-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08b_east"]), + + "7a_f-08d_west": PreRegion("7a_f-08d_west", "7a_f-08d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08d_west"]), + "7a_f-08d_east": PreRegion("7a_f-08d_east", "7a_f-08d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08d_east"]), + + "7a_f-08c_west": PreRegion("7a_f-08c_west", "7a_f-08c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08c_west"]), + "7a_f-08c_east": PreRegion("7a_f-08c_east", "7a_f-08c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08c_east"]), + + "7a_f-09_west": PreRegion("7a_f-09_west", "7a_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-09_west"]), + "7a_f-09_east": PreRegion("7a_f-09_east", "7a_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-09_east"]), + + "7a_f-10_west": PreRegion("7a_f-10_west", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_west"]), + "7a_f-10_north-east": PreRegion("7a_f-10_north-east", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_north-east"]), + "7a_f-10_east": PreRegion("7a_f-10_east", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_east"]), + + "7a_f-10b_west": PreRegion("7a_f-10b_west", "7a_f-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10b_west"]), + "7a_f-10b_east": PreRegion("7a_f-10b_east", "7a_f-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10b_east"]), + + "7a_f-11_bottom": PreRegion("7a_f-11_bottom", "7a_f-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-11_bottom"]), + "7a_f-11_top": PreRegion("7a_f-11_top", "7a_f-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-11_top"]), + + "7a_g-00_bottom": PreRegion("7a_g-00_bottom", "7a_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00_bottom"]), + "7a_g-00_top": PreRegion("7a_g-00_top", "7a_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00_top"]), + + "7a_g-00b_bottom": PreRegion("7a_g-00b_bottom", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_bottom"]), + "7a_g-00b_c26": PreRegion("7a_g-00b_c26", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c26"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c26"]), + "7a_g-00b_c24": PreRegion("7a_g-00b_c24", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c24"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c24"]), + "7a_g-00b_c21": PreRegion("7a_g-00b_c21", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c21"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c21"]), + "7a_g-00b_top": PreRegion("7a_g-00b_top", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_top"]), + + "7a_g-01_bottom": PreRegion("7a_g-01_bottom", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_bottom"]), + "7a_g-01_c18": PreRegion("7a_g-01_c18", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_c18"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_c18"]), + "7a_g-01_c16": PreRegion("7a_g-01_c16", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_c16"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_c16"]), + "7a_g-01_top": PreRegion("7a_g-01_top", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_top"]), + + "7a_g-02_bottom": PreRegion("7a_g-02_bottom", "7a_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-02_bottom"]), + "7a_g-02_top": PreRegion("7a_g-02_top", "7a_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-02_top"]), + + "7a_g-03_bottom": PreRegion("7a_g-03_bottom", "7a_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-03_bottom"]), + "7a_g-03_goal": PreRegion("7a_g-03_goal", "7a_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-03_goal"]), + + "7b_a-00_west": PreRegion("7b_a-00_west", "7b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-00_west"]), + "7b_a-00_east": PreRegion("7b_a-00_east", "7b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-00_east"]), + + "7b_a-01_west": PreRegion("7b_a-01_west", "7b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-01_west"]), + "7b_a-01_east": PreRegion("7b_a-01_east", "7b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-01_east"]), + + "7b_a-02_west": PreRegion("7b_a-02_west", "7b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-02_west"]), + "7b_a-02_east": PreRegion("7b_a-02_east", "7b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-02_east"]), + + "7b_a-03_bottom": PreRegion("7b_a-03_bottom", "7b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-03_bottom"]), + "7b_a-03_top": PreRegion("7b_a-03_top", "7b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-03_top"]), + + "7b_b-00_bottom": PreRegion("7b_b-00_bottom", "7b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-00_bottom"]), + "7b_b-00_top": PreRegion("7b_b-00_top", "7b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-00_top"]), + + "7b_b-01_bottom": PreRegion("7b_b-01_bottom", "7b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-01_bottom"]), + "7b_b-01_top": PreRegion("7b_b-01_top", "7b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-01_top"]), + + "7b_b-02_west": PreRegion("7b_b-02_west", "7b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-02_west"]), + "7b_b-02_east": PreRegion("7b_b-02_east", "7b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-02_east"]), + + "7b_b-03_bottom": PreRegion("7b_b-03_bottom", "7b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-03_bottom"]), + "7b_b-03_top": PreRegion("7b_b-03_top", "7b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-03_top"]), + + "7b_c-01_west": PreRegion("7b_c-01_west", "7b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-01_west"]), + "7b_c-01_east": PreRegion("7b_c-01_east", "7b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-01_east"]), + + "7b_c-00_west": PreRegion("7b_c-00_west", "7b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-00_west"]), + "7b_c-00_east": PreRegion("7b_c-00_east", "7b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-00_east"]), + + "7b_c-02_west": PreRegion("7b_c-02_west", "7b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-02_west"]), + "7b_c-02_east": PreRegion("7b_c-02_east", "7b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-02_east"]), + + "7b_c-03_bottom": PreRegion("7b_c-03_bottom", "7b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-03_bottom"]), + "7b_c-03_top": PreRegion("7b_c-03_top", "7b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-03_top"]), + + "7b_d-00_west": PreRegion("7b_d-00_west", "7b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-00_west"]), + "7b_d-00_east": PreRegion("7b_d-00_east", "7b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-00_east"]), + + "7b_d-01_west": PreRegion("7b_d-01_west", "7b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-01_west"]), + "7b_d-01_east": PreRegion("7b_d-01_east", "7b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-01_east"]), + + "7b_d-02_west": PreRegion("7b_d-02_west", "7b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-02_west"]), + "7b_d-02_east": PreRegion("7b_d-02_east", "7b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-02_east"]), + + "7b_d-03_bottom": PreRegion("7b_d-03_bottom", "7b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-03_bottom"]), + "7b_d-03_top": PreRegion("7b_d-03_top", "7b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-03_top"]), + + "7b_e-00_west": PreRegion("7b_e-00_west", "7b_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-00_west"]), + "7b_e-00_east": PreRegion("7b_e-00_east", "7b_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-00_east"]), + + "7b_e-01_west": PreRegion("7b_e-01_west", "7b_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-01_west"]), + "7b_e-01_east": PreRegion("7b_e-01_east", "7b_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-01_east"]), + + "7b_e-02_west": PreRegion("7b_e-02_west", "7b_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-02_west"]), + "7b_e-02_east": PreRegion("7b_e-02_east", "7b_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-02_east"]), + + "7b_e-03_bottom": PreRegion("7b_e-03_bottom", "7b_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-03_bottom"]), + "7b_e-03_top": PreRegion("7b_e-03_top", "7b_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-03_top"]), + + "7b_f-00_west": PreRegion("7b_f-00_west", "7b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-00_west"]), + "7b_f-00_east": PreRegion("7b_f-00_east", "7b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-00_east"]), + + "7b_f-01_west": PreRegion("7b_f-01_west", "7b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-01_west"]), + "7b_f-01_east": PreRegion("7b_f-01_east", "7b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-01_east"]), + + "7b_f-02_west": PreRegion("7b_f-02_west", "7b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-02_west"]), + "7b_f-02_east": PreRegion("7b_f-02_east", "7b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-02_east"]), + + "7b_f-03_bottom": PreRegion("7b_f-03_bottom", "7b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-03_bottom"]), + "7b_f-03_top": PreRegion("7b_f-03_top", "7b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-03_top"]), + + "7b_g-00_bottom": PreRegion("7b_g-00_bottom", "7b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-00_bottom"]), + "7b_g-00_top": PreRegion("7b_g-00_top", "7b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-00_top"]), + + "7b_g-01_bottom": PreRegion("7b_g-01_bottom", "7b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-01_bottom"]), + "7b_g-01_top": PreRegion("7b_g-01_top", "7b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-01_top"]), + + "7b_g-02_bottom": PreRegion("7b_g-02_bottom", "7b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-02_bottom"]), + "7b_g-02_top": PreRegion("7b_g-02_top", "7b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-02_top"]), + + "7b_g-03_bottom": PreRegion("7b_g-03_bottom", "7b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-03_bottom"]), + "7b_g-03_goal": PreRegion("7b_g-03_goal", "7b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-03_goal"]), + + "7c_01_west": PreRegion("7c_01_west", "7c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_01_west"]), + "7c_01_east": PreRegion("7c_01_east", "7c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_01_east"]), + + "7c_02_west": PreRegion("7c_02_west", "7c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_02_west"]), + "7c_02_east": PreRegion("7c_02_east", "7c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_02_east"]), + + "7c_03_west": PreRegion("7c_03_west", "7c_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_03_west"]), + "7c_03_goal": PreRegion("7c_03_goal", "7c_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_03_goal"]), + + "8a_outside_east": PreRegion("8a_outside_east", "8a_outside", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_outside_east"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_outside_east"]), + + "8a_bridge_west": PreRegion("8a_bridge_west", "8a_bridge", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_bridge_west"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_bridge_west"]), + "8a_bridge_east": PreRegion("8a_bridge_east", "8a_bridge", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_bridge_east"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_bridge_east"]), + + "8a_secret_west": PreRegion("8a_secret_west", "8a_secret", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_secret_west"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_secret_west"]), + + "9a_00_west": PreRegion("9a_00_west", "9a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_00_west"]), + "9a_00_east": PreRegion("9a_00_east", "9a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_00_east"]), + + "9a_0x_east": PreRegion("9a_0x_east", "9a_0x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_0x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_0x_east"]), + + "9a_01_west": PreRegion("9a_01_west", "9a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_01_west"]), + "9a_01_east": PreRegion("9a_01_east", "9a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_01_east"]), + + "9a_02_west": PreRegion("9a_02_west", "9a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_02_west"]), + "9a_02_east": PreRegion("9a_02_east", "9a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_02_east"]), + + "9a_a-00_west": PreRegion("9a_a-00_west", "9a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-00_west"]), + "9a_a-00_east": PreRegion("9a_a-00_east", "9a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-00_east"]), + + "9a_a-01_west": PreRegion("9a_a-01_west", "9a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-01_west"]), + "9a_a-01_east": PreRegion("9a_a-01_east", "9a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-01_east"]), + + "9a_a-02_west": PreRegion("9a_a-02_west", "9a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-02_west"]), + "9a_a-02_east": PreRegion("9a_a-02_east", "9a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-02_east"]), + + "9a_a-03_bottom": PreRegion("9a_a-03_bottom", "9a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-03_bottom"]), + "9a_a-03_top": PreRegion("9a_a-03_top", "9a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-03_top"]), + + "9a_b-00_west": PreRegion("9a_b-00_west", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_west"]), + "9a_b-00_south": PreRegion("9a_b-00_south", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_south"]), + "9a_b-00_north": PreRegion("9a_b-00_north", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_north"]), + "9a_b-00_east": PreRegion("9a_b-00_east", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_east"]), + + "9a_b-01_west": PreRegion("9a_b-01_west", "9a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-01_west"]), + "9a_b-01_east": PreRegion("9a_b-01_east", "9a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-01_east"]), + + "9a_b-02_west": PreRegion("9a_b-02_west", "9a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-02_west"]), + "9a_b-02_east": PreRegion("9a_b-02_east", "9a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-02_east"]), + + "9a_b-03_west": PreRegion("9a_b-03_west", "9a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-03_west"]), + "9a_b-03_east": PreRegion("9a_b-03_east", "9a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-03_east"]), + + "9a_b-04_north-west": PreRegion("9a_b-04_north-west", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_north-west"]), + "9a_b-04_west": PreRegion("9a_b-04_west", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_west"]), + "9a_b-04_east": PreRegion("9a_b-04_east", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_east"]), + + "9a_b-05_west": PreRegion("9a_b-05_west", "9a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-05_west"]), + "9a_b-05_east": PreRegion("9a_b-05_east", "9a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-05_east"]), + + "9a_b-06_east": PreRegion("9a_b-06_east", "9a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-06_east"]), + + "9a_b-07b_bottom": PreRegion("9a_b-07b_bottom", "9a_b-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07b_bottom"]), + "9a_b-07b_top": PreRegion("9a_b-07b_top", "9a_b-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07b_top"]), + + "9a_b-07_bottom": PreRegion("9a_b-07_bottom", "9a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07_bottom"]), + "9a_b-07_top": PreRegion("9a_b-07_top", "9a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07_top"]), + + "9a_c-00_west": PreRegion("9a_c-00_west", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_west"]), + "9a_c-00_north-east": PreRegion("9a_c-00_north-east", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_north-east"]), + "9a_c-00_east": PreRegion("9a_c-00_east", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_east"]), + + "9a_c-00b_west": PreRegion("9a_c-00b_west", "9a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00b_west"]), + + "9a_c-01_west": PreRegion("9a_c-01_west", "9a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-01_west"]), + "9a_c-01_east": PreRegion("9a_c-01_east", "9a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-01_east"]), + + "9a_c-02_west": PreRegion("9a_c-02_west", "9a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-02_west"]), + "9a_c-02_east": PreRegion("9a_c-02_east", "9a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-02_east"]), + + "9a_c-03_west": PreRegion("9a_c-03_west", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_west"]), + "9a_c-03_north-west": PreRegion("9a_c-03_north-west", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north-west"]), + "9a_c-03_north": PreRegion("9a_c-03_north", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north"]), + "9a_c-03_north-east": PreRegion("9a_c-03_north-east", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north-east"]), + "9a_c-03_east": PreRegion("9a_c-03_east", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_east"]), + + "9a_c-03b_west": PreRegion("9a_c-03b_west", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_west"]), + "9a_c-03b_south": PreRegion("9a_c-03b_south", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_south"]), + "9a_c-03b_east": PreRegion("9a_c-03b_east", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_east"]), + + "9a_c-04_west": PreRegion("9a_c-04_west", "9a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-04_west"]), + "9a_c-04_east": PreRegion("9a_c-04_east", "9a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-04_east"]), + + "9a_d-00_bottom": PreRegion("9a_d-00_bottom", "9a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-00_bottom"]), + "9a_d-00_top": PreRegion("9a_d-00_top", "9a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-00_top"]), + + "9a_d-01_bottom": PreRegion("9a_d-01_bottom", "9a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-01_bottom"]), + "9a_d-01_top": PreRegion("9a_d-01_top", "9a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-01_top"]), + + "9a_d-02_bottom": PreRegion("9a_d-02_bottom", "9a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-02_bottom"]), + "9a_d-02_top": PreRegion("9a_d-02_top", "9a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-02_top"]), + + "9a_d-03_bottom": PreRegion("9a_d-03_bottom", "9a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-03_bottom"]), + "9a_d-03_top": PreRegion("9a_d-03_top", "9a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-03_top"]), + + "9a_d-04_bottom": PreRegion("9a_d-04_bottom", "9a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-04_bottom"]), + "9a_d-04_top": PreRegion("9a_d-04_top", "9a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-04_top"]), + + "9a_d-05_bottom": PreRegion("9a_d-05_bottom", "9a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-05_bottom"]), + "9a_d-05_top": PreRegion("9a_d-05_top", "9a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-05_top"]), + + "9a_d-06_bottom": PreRegion("9a_d-06_bottom", "9a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-06_bottom"]), + "9a_d-06_top": PreRegion("9a_d-06_top", "9a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-06_top"]), + + "9a_d-07_bottom": PreRegion("9a_d-07_bottom", "9a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-07_bottom"]), + "9a_d-07_top": PreRegion("9a_d-07_top", "9a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-07_top"]), + + "9a_d-08_west": PreRegion("9a_d-08_west", "9a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-08_west"]), + "9a_d-08_east": PreRegion("9a_d-08_east", "9a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-08_east"]), + + "9a_d-09_west": PreRegion("9a_d-09_west", "9a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-09_west"]), + "9a_d-09_east": PreRegion("9a_d-09_east", "9a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-09_east"]), + + "9a_d-10_west": PreRegion("9a_d-10_west", "9a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10_west"]), + "9a_d-10_east": PreRegion("9a_d-10_east", "9a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10_east"]), + + "9a_d-10b_west": PreRegion("9a_d-10b_west", "9a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10b_west"]), + "9a_d-10b_east": PreRegion("9a_d-10b_east", "9a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10b_east"]), + + "9a_d-10c_west": PreRegion("9a_d-10c_west", "9a_d-10c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10c_west"]), + "9a_d-10c_east": PreRegion("9a_d-10c_east", "9a_d-10c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10c_east"]), + + "9a_d-11_west": PreRegion("9a_d-11_west", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_west"]), + "9a_d-11_center": PreRegion("9a_d-11_center", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_center"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_center"]), + "9a_d-11_east": PreRegion("9a_d-11_east", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_east"]), + + "9a_space_west": PreRegion("9a_space_west", "9a_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_space_west"]), + "9a_space_goal": PreRegion("9a_space_goal", "9a_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_space_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_space_goal"]), + + "9b_00_east": PreRegion("9b_00_east", "9b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_00_east"]), + + "9b_01_west": PreRegion("9b_01_west", "9b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_01_west"]), + "9b_01_east": PreRegion("9b_01_east", "9b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_01_east"]), + + "9b_a-00_west": PreRegion("9b_a-00_west", "9b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-00_west"]), + "9b_a-00_east": PreRegion("9b_a-00_east", "9b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-00_east"]), + + "9b_a-01_west": PreRegion("9b_a-01_west", "9b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-01_west"]), + "9b_a-01_east": PreRegion("9b_a-01_east", "9b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-01_east"]), + + "9b_a-02_west": PreRegion("9b_a-02_west", "9b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-02_west"]), + "9b_a-02_east": PreRegion("9b_a-02_east", "9b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-02_east"]), + + "9b_a-03_west": PreRegion("9b_a-03_west", "9b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-03_west"]), + "9b_a-03_east": PreRegion("9b_a-03_east", "9b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-03_east"]), + + "9b_a-04_west": PreRegion("9b_a-04_west", "9b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-04_west"]), + "9b_a-04_east": PreRegion("9b_a-04_east", "9b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-04_east"]), + + "9b_a-05_west": PreRegion("9b_a-05_west", "9b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-05_west"]), + "9b_a-05_east": PreRegion("9b_a-05_east", "9b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-05_east"]), + + "9b_b-00_west": PreRegion("9b_b-00_west", "9b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-00_west"]), + "9b_b-00_east": PreRegion("9b_b-00_east", "9b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-00_east"]), + + "9b_b-01_west": PreRegion("9b_b-01_west", "9b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-01_west"]), + "9b_b-01_east": PreRegion("9b_b-01_east", "9b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-01_east"]), + + "9b_b-02_west": PreRegion("9b_b-02_west", "9b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-02_west"]), + "9b_b-02_east": PreRegion("9b_b-02_east", "9b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-02_east"]), + + "9b_b-03_west": PreRegion("9b_b-03_west", "9b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-03_west"]), + "9b_b-03_east": PreRegion("9b_b-03_east", "9b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-03_east"]), + + "9b_b-04_west": PreRegion("9b_b-04_west", "9b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-04_west"]), + "9b_b-04_east": PreRegion("9b_b-04_east", "9b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-04_east"]), + + "9b_b-05_west": PreRegion("9b_b-05_west", "9b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-05_west"]), + "9b_b-05_east": PreRegion("9b_b-05_east", "9b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-05_east"]), + + "9b_c-01_bottom": PreRegion("9b_c-01_bottom", "9b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-01_bottom"]), + "9b_c-01_top": PreRegion("9b_c-01_top", "9b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-01_top"]), + + "9b_c-02_bottom": PreRegion("9b_c-02_bottom", "9b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-02_bottom"]), + "9b_c-02_top": PreRegion("9b_c-02_top", "9b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-02_top"]), + + "9b_c-03_bottom": PreRegion("9b_c-03_bottom", "9b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-03_bottom"]), + "9b_c-03_top": PreRegion("9b_c-03_top", "9b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-03_top"]), + + "9b_c-04_bottom": PreRegion("9b_c-04_bottom", "9b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-04_bottom"]), + "9b_c-04_top": PreRegion("9b_c-04_top", "9b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-04_top"]), + + "9b_c-05_west": PreRegion("9b_c-05_west", "9b_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-05_west"]), + "9b_c-05_east": PreRegion("9b_c-05_east", "9b_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-05_east"]), + + "9b_c-06_west": PreRegion("9b_c-06_west", "9b_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-06_west"]), + "9b_c-06_east": PreRegion("9b_c-06_east", "9b_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-06_east"]), + + "9b_c-08_west": PreRegion("9b_c-08_west", "9b_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-08_west"]), + "9b_c-08_east": PreRegion("9b_c-08_east", "9b_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-08_east"]), + + "9b_c-07_west": PreRegion("9b_c-07_west", "9b_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-07_west"]), + "9b_c-07_east": PreRegion("9b_c-07_east", "9b_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-07_east"]), + + "9b_space_west": PreRegion("9b_space_west", "9b_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_space_west"]), + "9b_space_goal": PreRegion("9b_space_goal", "9b_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_space_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_space_goal"]), + + "9c_intro_west": PreRegion("9c_intro_west", "9c_intro", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_intro_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_intro_west"]), + "9c_intro_east": PreRegion("9c_intro_east", "9c_intro", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_intro_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_intro_east"]), + + "9c_00_west": PreRegion("9c_00_west", "9c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_00_west"]), + "9c_00_east": PreRegion("9c_00_east", "9c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_00_east"]), + + "9c_01_west": PreRegion("9c_01_west", "9c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_01_west"]), + "9c_01_east": PreRegion("9c_01_east", "9c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_01_east"]), + + "9c_02_west": PreRegion("9c_02_west", "9c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_02_west"]), + "9c_02_goal": PreRegion("9c_02_goal", "9c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_02_goal"]), + + "10a_intro-00-past_west": PreRegion("10a_intro-00-past_west", "10a_intro-00-past", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-00-past_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-00-past_west"]), + "10a_intro-00-past_east": PreRegion("10a_intro-00-past_east", "10a_intro-00-past", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-00-past_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-00-past_east"]), + + "10a_intro-01-future_west": PreRegion("10a_intro-01-future_west", "10a_intro-01-future", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-01-future_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-01-future_west"]), + "10a_intro-01-future_east": PreRegion("10a_intro-01-future_east", "10a_intro-01-future", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-01-future_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-01-future_east"]), + + "10a_intro-02-launch_bottom": PreRegion("10a_intro-02-launch_bottom", "10a_intro-02-launch", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-02-launch_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-02-launch_bottom"]), + "10a_intro-02-launch_top": PreRegion("10a_intro-02-launch_top", "10a_intro-02-launch", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-02-launch_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-02-launch_top"]), + + "10a_intro-03-space_west": PreRegion("10a_intro-03-space_west", "10a_intro-03-space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-03-space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-03-space_west"]), + "10a_intro-03-space_east": PreRegion("10a_intro-03-space_east", "10a_intro-03-space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-03-space_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-03-space_east"]), + + "10a_a-00_west": PreRegion("10a_a-00_west", "10a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-00_west"]), + "10a_a-00_east": PreRegion("10a_a-00_east", "10a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-00_east"]), + + "10a_a-01_west": PreRegion("10a_a-01_west", "10a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-01_west"]), + "10a_a-01_east": PreRegion("10a_a-01_east", "10a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-01_east"]), + + "10a_a-02_west": PreRegion("10a_a-02_west", "10a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-02_west"]), + "10a_a-02_east": PreRegion("10a_a-02_east", "10a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-02_east"]), + + "10a_a-03_west": PreRegion("10a_a-03_west", "10a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-03_west"]), + "10a_a-03_east": PreRegion("10a_a-03_east", "10a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-03_east"]), + + "10a_a-04_west": PreRegion("10a_a-04_west", "10a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-04_west"]), + "10a_a-04_east": PreRegion("10a_a-04_east", "10a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-04_east"]), + + "10a_a-05_west": PreRegion("10a_a-05_west", "10a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-05_west"]), + "10a_a-05_east": PreRegion("10a_a-05_east", "10a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-05_east"]), + + "10a_b-00_west": PreRegion("10a_b-00_west", "10a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-00_west"]), + "10a_b-00_east": PreRegion("10a_b-00_east", "10a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-00_east"]), + + "10a_b-01_west": PreRegion("10a_b-01_west", "10a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-01_west"]), + "10a_b-01_east": PreRegion("10a_b-01_east", "10a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-01_east"]), + + "10a_b-02_west": PreRegion("10a_b-02_west", "10a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-02_west"]), + "10a_b-02_east": PreRegion("10a_b-02_east", "10a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-02_east"]), + + "10a_b-03_west": PreRegion("10a_b-03_west", "10a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-03_west"]), + "10a_b-03_east": PreRegion("10a_b-03_east", "10a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-03_east"]), + + "10a_b-04_west": PreRegion("10a_b-04_west", "10a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-04_west"]), + "10a_b-04_east": PreRegion("10a_b-04_east", "10a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-04_east"]), + + "10a_b-05_west": PreRegion("10a_b-05_west", "10a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-05_west"]), + "10a_b-05_east": PreRegion("10a_b-05_east", "10a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-05_east"]), + + "10a_b-06_west": PreRegion("10a_b-06_west", "10a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-06_west"]), + "10a_b-06_east": PreRegion("10a_b-06_east", "10a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-06_east"]), + + "10a_b-07_west": PreRegion("10a_b-07_west", "10a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-07_west"]), + "10a_b-07_east": PreRegion("10a_b-07_east", "10a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-07_east"]), + + "10a_c-00_west": PreRegion("10a_c-00_west", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_west"]), + "10a_c-00_east": PreRegion("10a_c-00_east", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_east"]), + "10a_c-00_north-east": PreRegion("10a_c-00_north-east", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_north-east"]), + + "10a_c-00b_west": PreRegion("10a_c-00b_west", "10a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00b_west"]), + "10a_c-00b_east": PreRegion("10a_c-00b_east", "10a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00b_east"]), + + "10a_c-01_west": PreRegion("10a_c-01_west", "10a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-01_west"]), + "10a_c-01_east": PreRegion("10a_c-01_east", "10a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-01_east"]), + + "10a_c-02_west": PreRegion("10a_c-02_west", "10a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-02_west"]), + "10a_c-02_east": PreRegion("10a_c-02_east", "10a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-02_east"]), + + "10a_c-alt-00_west": PreRegion("10a_c-alt-00_west", "10a_c-alt-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-00_west"]), + "10a_c-alt-00_east": PreRegion("10a_c-alt-00_east", "10a_c-alt-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-00_east"]), + + "10a_c-alt-01_west": PreRegion("10a_c-alt-01_west", "10a_c-alt-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-01_west"]), + "10a_c-alt-01_east": PreRegion("10a_c-alt-01_east", "10a_c-alt-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-01_east"]), + + "10a_c-03_south-west": PreRegion("10a_c-03_south-west", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_south-west"]), + "10a_c-03_south": PreRegion("10a_c-03_south", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_south"]), + "10a_c-03_north": PreRegion("10a_c-03_north", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_north"]), + + "10a_d-00_south": PreRegion("10a_d-00_south", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south"]), + "10a_d-00_north": PreRegion("10a_d-00_north", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north"]), + "10a_d-00_south-east": PreRegion("10a_d-00_south-east", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-east"]), + "10a_d-00_north-west": PreRegion("10a_d-00_north-west", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-west"]), + "10a_d-00_breaker": PreRegion("10a_d-00_breaker", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_breaker"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_breaker"]), + "10a_d-00_north-east-door": PreRegion("10a_d-00_north-east-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-east-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-east-door"]), + "10a_d-00_south-east-door": PreRegion("10a_d-00_south-east-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-east-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-east-door"]), + "10a_d-00_south-west-door": PreRegion("10a_d-00_south-west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-west-door"]), + "10a_d-00_west-door": PreRegion("10a_d-00_west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_west-door"]), + "10a_d-00_north-west-door": PreRegion("10a_d-00_north-west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-west-door"]), + + "10a_d-04_west": PreRegion("10a_d-04_west", "10a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-04_west"]), + + "10a_d-03_west": PreRegion("10a_d-03_west", "10a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-03_west"]), + + "10a_d-01_east": PreRegion("10a_d-01_east", "10a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-01_east"]), + + "10a_d-02_bottom": PreRegion("10a_d-02_bottom", "10a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-02_bottom"]), + + "10a_d-05_west": PreRegion("10a_d-05_west", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_west"]), + "10a_d-05_south": PreRegion("10a_d-05_south", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_south"]), + "10a_d-05_north": PreRegion("10a_d-05_north", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_north"]), + + "10a_e-00y_south": PreRegion("10a_e-00y_south", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_south"]), + "10a_e-00y_south-east": PreRegion("10a_e-00y_south-east", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_south-east"]), + "10a_e-00y_north-east": PreRegion("10a_e-00y_north-east", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_north-east"]), + "10a_e-00y_north": PreRegion("10a_e-00y_north", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_north"]), + + "10a_e-00yb_south": PreRegion("10a_e-00yb_south", "10a_e-00yb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00yb_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00yb_south"]), + "10a_e-00yb_north": PreRegion("10a_e-00yb_north", "10a_e-00yb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00yb_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00yb_north"]), + + "10a_e-00z_south": PreRegion("10a_e-00z_south", "10a_e-00z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00z_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00z_south"]), + "10a_e-00z_north": PreRegion("10a_e-00z_north", "10a_e-00z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00z_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00z_north"]), + + "10a_e-00_south": PreRegion("10a_e-00_south", "10a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00_south"]), + "10a_e-00_north": PreRegion("10a_e-00_north", "10a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00_north"]), + + "10a_e-00b_south": PreRegion("10a_e-00b_south", "10a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00b_south"]), + "10a_e-00b_north": PreRegion("10a_e-00b_north", "10a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00b_north"]), + + "10a_e-01_south": PreRegion("10a_e-01_south", "10a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-01_south"]), + "10a_e-01_north": PreRegion("10a_e-01_north", "10a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-01_north"]), + + "10a_e-02_west": PreRegion("10a_e-02_west", "10a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-02_west"]), + "10a_e-02_east": PreRegion("10a_e-02_east", "10a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-02_east"]), + + "10a_e-03_west": PreRegion("10a_e-03_west", "10a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-03_west"]), + "10a_e-03_east": PreRegion("10a_e-03_east", "10a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-03_east"]), + + "10a_e-04_west": PreRegion("10a_e-04_west", "10a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-04_west"]), + "10a_e-04_east": PreRegion("10a_e-04_east", "10a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-04_east"]), + + "10a_e-05_west": PreRegion("10a_e-05_west", "10a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05_west"]), + "10a_e-05_east": PreRegion("10a_e-05_east", "10a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05_east"]), + + "10a_e-05b_west": PreRegion("10a_e-05b_west", "10a_e-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05b_west"]), + "10a_e-05b_east": PreRegion("10a_e-05b_east", "10a_e-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05b_east"]), + + "10a_e-05c_west": PreRegion("10a_e-05c_west", "10a_e-05c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05c_west"]), + "10a_e-05c_east": PreRegion("10a_e-05c_east", "10a_e-05c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05c_east"]), + + "10a_e-06_west": PreRegion("10a_e-06_west", "10a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-06_west"]), + "10a_e-06_east": PreRegion("10a_e-06_east", "10a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-06_east"]), + + "10a_e-07_west": PreRegion("10a_e-07_west", "10a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-07_west"]), + "10a_e-07_east": PreRegion("10a_e-07_east", "10a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-07_east"]), + + "10a_e-08_west": PreRegion("10a_e-08_west", "10a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-08_west"]), + "10a_e-08_east": PreRegion("10a_e-08_east", "10a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-08_east"]), + + "10b_f-door_west": PreRegion("10b_f-door_west", "10b_f-door", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-door_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-door_west"]), + "10b_f-door_east": PreRegion("10b_f-door_east", "10b_f-door", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-door_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-door_east"]), + + "10b_f-00_west": PreRegion("10b_f-00_west", "10b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-00_west"]), + "10b_f-00_east": PreRegion("10b_f-00_east", "10b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-00_east"]), + + "10b_f-01_west": PreRegion("10b_f-01_west", "10b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-01_west"]), + "10b_f-01_east": PreRegion("10b_f-01_east", "10b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-01_east"]), + + "10b_f-02_west": PreRegion("10b_f-02_west", "10b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-02_west"]), + "10b_f-02_east": PreRegion("10b_f-02_east", "10b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-02_east"]), + + "10b_f-03_west": PreRegion("10b_f-03_west", "10b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-03_west"]), + "10b_f-03_east": PreRegion("10b_f-03_east", "10b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-03_east"]), + + "10b_f-04_west": PreRegion("10b_f-04_west", "10b_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-04_west"]), + "10b_f-04_east": PreRegion("10b_f-04_east", "10b_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-04_east"]), + + "10b_f-05_west": PreRegion("10b_f-05_west", "10b_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-05_west"]), + "10b_f-05_east": PreRegion("10b_f-05_east", "10b_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-05_east"]), + + "10b_f-06_west": PreRegion("10b_f-06_west", "10b_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-06_west"]), + "10b_f-06_east": PreRegion("10b_f-06_east", "10b_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-06_east"]), + + "10b_f-07_west": PreRegion("10b_f-07_west", "10b_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-07_west"]), + "10b_f-07_east": PreRegion("10b_f-07_east", "10b_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-07_east"]), + + "10b_f-08_west": PreRegion("10b_f-08_west", "10b_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-08_west"]), + "10b_f-08_east": PreRegion("10b_f-08_east", "10b_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-08_east"]), + + "10b_f-09_west": PreRegion("10b_f-09_west", "10b_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-09_west"]), + "10b_f-09_east": PreRegion("10b_f-09_east", "10b_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-09_east"]), + + "10b_g-00_bottom": PreRegion("10b_g-00_bottom", "10b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-00_bottom"]), + "10b_g-00_top": PreRegion("10b_g-00_top", "10b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-00_top"]), + + "10b_g-01_bottom": PreRegion("10b_g-01_bottom", "10b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-01_bottom"]), + "10b_g-01_top": PreRegion("10b_g-01_top", "10b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-01_top"]), + + "10b_g-03_bottom": PreRegion("10b_g-03_bottom", "10b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-03_bottom"]), + "10b_g-03_top": PreRegion("10b_g-03_top", "10b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-03_top"]), + + "10b_g-02_west": PreRegion("10b_g-02_west", "10b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-02_west"]), + "10b_g-02_east": PreRegion("10b_g-02_east", "10b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-02_east"]), + + "10b_g-04_west": PreRegion("10b_g-04_west", "10b_g-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-04_west"]), + "10b_g-04_east": PreRegion("10b_g-04_east", "10b_g-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-04_east"]), + + "10b_g-05_west": PreRegion("10b_g-05_west", "10b_g-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-05_west"]), + "10b_g-05_east": PreRegion("10b_g-05_east", "10b_g-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-05_east"]), + + "10b_g-06_west": PreRegion("10b_g-06_west", "10b_g-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-06_west"]), + "10b_g-06_east": PreRegion("10b_g-06_east", "10b_g-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-06_east"]), + + "10b_h-00b_west": PreRegion("10b_h-00b_west", "10b_h-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00b_west"]), + "10b_h-00b_east": PreRegion("10b_h-00b_east", "10b_h-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00b_east"]), + + "10b_h-00_west": PreRegion("10b_h-00_west", "10b_h-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00_west"]), + "10b_h-00_east": PreRegion("10b_h-00_east", "10b_h-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00_east"]), + + "10b_h-01_west": PreRegion("10b_h-01_west", "10b_h-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-01_west"]), + "10b_h-01_east": PreRegion("10b_h-01_east", "10b_h-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-01_east"]), + + "10b_h-02_west": PreRegion("10b_h-02_west", "10b_h-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-02_west"]), + "10b_h-02_east": PreRegion("10b_h-02_east", "10b_h-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-02_east"]), + + "10b_h-03_west": PreRegion("10b_h-03_west", "10b_h-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03_west"]), + "10b_h-03_east": PreRegion("10b_h-03_east", "10b_h-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03_east"]), + + "10b_h-03b_west": PreRegion("10b_h-03b_west", "10b_h-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03b_west"]), + "10b_h-03b_east": PreRegion("10b_h-03b_east", "10b_h-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03b_east"]), + + "10b_h-04_top": PreRegion("10b_h-04_top", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_top"]), + "10b_h-04_east": PreRegion("10b_h-04_east", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_east"]), + "10b_h-04_bottom": PreRegion("10b_h-04_bottom", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_bottom"]), + + "10b_h-04b_west": PreRegion("10b_h-04b_west", "10b_h-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04b_west"]), + "10b_h-04b_east": PreRegion("10b_h-04b_east", "10b_h-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04b_east"]), + + "10b_h-05_west": PreRegion("10b_h-05_west", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_west"]), + "10b_h-05_top": PreRegion("10b_h-05_top", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_top"]), + "10b_h-05_east": PreRegion("10b_h-05_east", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_east"]), + + "10b_h-06_west": PreRegion("10b_h-06_west", "10b_h-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06_west"]), + "10b_h-06_east": PreRegion("10b_h-06_east", "10b_h-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06_east"]), + + "10b_h-06b_bottom": PreRegion("10b_h-06b_bottom", "10b_h-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06b_bottom"]), + "10b_h-06b_top": PreRegion("10b_h-06b_top", "10b_h-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06b_top"]), + + "10b_h-07_west": PreRegion("10b_h-07_west", "10b_h-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-07_west"]), + "10b_h-07_east": PreRegion("10b_h-07_east", "10b_h-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-07_east"]), + + "10b_h-08_west": PreRegion("10b_h-08_west", "10b_h-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-08_west"]), + "10b_h-08_east": PreRegion("10b_h-08_east", "10b_h-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-08_east"]), + + "10b_h-09_west": PreRegion("10b_h-09_west", "10b_h-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-09_west"]), + "10b_h-09_east": PreRegion("10b_h-09_east", "10b_h-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-09_east"]), + + "10b_h-10_west": PreRegion("10b_h-10_west", "10b_h-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-10_west"]), + "10b_h-10_east": PreRegion("10b_h-10_east", "10b_h-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-10_east"]), + + "10b_i-00_west": PreRegion("10b_i-00_west", "10b_i-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00_west"]), + "10b_i-00_east": PreRegion("10b_i-00_east", "10b_i-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00_east"]), + + "10b_i-00b_west": PreRegion("10b_i-00b_west", "10b_i-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00b_west"]), + "10b_i-00b_east": PreRegion("10b_i-00b_east", "10b_i-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00b_east"]), + + "10b_i-01_west": PreRegion("10b_i-01_west", "10b_i-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-01_west"]), + "10b_i-01_east": PreRegion("10b_i-01_east", "10b_i-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-01_east"]), + + "10b_i-02_west": PreRegion("10b_i-02_west", "10b_i-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-02_west"]), + "10b_i-02_east": PreRegion("10b_i-02_east", "10b_i-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-02_east"]), + + "10b_i-03_west": PreRegion("10b_i-03_west", "10b_i-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-03_west"]), + "10b_i-03_east": PreRegion("10b_i-03_east", "10b_i-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-03_east"]), + + "10b_i-04_west": PreRegion("10b_i-04_west", "10b_i-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-04_west"]), + "10b_i-04_east": PreRegion("10b_i-04_east", "10b_i-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-04_east"]), + + "10b_i-05_west": PreRegion("10b_i-05_west", "10b_i-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-05_west"]), + "10b_i-05_east": PreRegion("10b_i-05_east", "10b_i-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-05_east"]), + + "10b_j-00_west": PreRegion("10b_j-00_west", "10b_j-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00_west"]), + "10b_j-00_east": PreRegion("10b_j-00_east", "10b_j-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00_east"]), + + "10b_j-00b_west": PreRegion("10b_j-00b_west", "10b_j-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00b_west"]), + "10b_j-00b_east": PreRegion("10b_j-00b_east", "10b_j-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00b_east"]), + + "10b_j-01_west": PreRegion("10b_j-01_west", "10b_j-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-01_west"]), + "10b_j-01_east": PreRegion("10b_j-01_east", "10b_j-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-01_east"]), + + "10b_j-02_west": PreRegion("10b_j-02_west", "10b_j-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-02_west"]), + "10b_j-02_east": PreRegion("10b_j-02_east", "10b_j-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-02_east"]), + + "10b_j-03_west": PreRegion("10b_j-03_west", "10b_j-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-03_west"]), + "10b_j-03_east": PreRegion("10b_j-03_east", "10b_j-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-03_east"]), + + "10b_j-04_west": PreRegion("10b_j-04_west", "10b_j-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-04_west"]), + "10b_j-04_east": PreRegion("10b_j-04_east", "10b_j-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-04_east"]), + + "10b_j-05_west": PreRegion("10b_j-05_west", "10b_j-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-05_west"]), + "10b_j-05_east": PreRegion("10b_j-05_east", "10b_j-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-05_east"]), + + "10b_j-06_west": PreRegion("10b_j-06_west", "10b_j-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-06_west"]), + "10b_j-06_east": PreRegion("10b_j-06_east", "10b_j-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-06_east"]), + + "10b_j-07_west": PreRegion("10b_j-07_west", "10b_j-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-07_west"]), + "10b_j-07_east": PreRegion("10b_j-07_east", "10b_j-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-07_east"]), + + "10b_j-08_west": PreRegion("10b_j-08_west", "10b_j-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-08_west"]), + "10b_j-08_east": PreRegion("10b_j-08_east", "10b_j-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-08_east"]), + + "10b_j-09_west": PreRegion("10b_j-09_west", "10b_j-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-09_west"]), + "10b_j-09_east": PreRegion("10b_j-09_east", "10b_j-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-09_east"]), + + "10b_j-10_west": PreRegion("10b_j-10_west", "10b_j-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-10_west"]), + "10b_j-10_east": PreRegion("10b_j-10_east", "10b_j-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-10_east"]), + + "10b_j-11_west": PreRegion("10b_j-11_west", "10b_j-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-11_west"]), + "10b_j-11_east": PreRegion("10b_j-11_east", "10b_j-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-11_east"]), + + "10b_j-12_west": PreRegion("10b_j-12_west", "10b_j-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-12_west"]), + "10b_j-12_east": PreRegion("10b_j-12_east", "10b_j-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-12_east"]), + + "10b_j-13_west": PreRegion("10b_j-13_west", "10b_j-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-13_west"]), + "10b_j-13_east": PreRegion("10b_j-13_east", "10b_j-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-13_east"]), + + "10b_j-14_west": PreRegion("10b_j-14_west", "10b_j-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14_west"]), + "10b_j-14_east": PreRegion("10b_j-14_east", "10b_j-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14_east"]), + + "10b_j-14b_west": PreRegion("10b_j-14b_west", "10b_j-14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14b_west"]), + "10b_j-14b_east": PreRegion("10b_j-14b_east", "10b_j-14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14b_east"]), + + "10b_j-15_west": PreRegion("10b_j-15_west", "10b_j-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-15_west"]), + "10b_j-15_east": PreRegion("10b_j-15_east", "10b_j-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-15_east"]), + + "10b_j-16_west": PreRegion("10b_j-16_west", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_west"]), + "10b_j-16_top": PreRegion("10b_j-16_top", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_top"]), + "10b_j-16_east": PreRegion("10b_j-16_east", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_east"]), + + "10b_j-17_south": PreRegion("10b_j-17_south", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_south"]), + "10b_j-17_west": PreRegion("10b_j-17_west", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_west"]), + "10b_j-17_north": PreRegion("10b_j-17_north", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_north"]), + "10b_j-17_east": PreRegion("10b_j-17_east", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_east"]), + + "10b_j-18_west": PreRegion("10b_j-18_west", "10b_j-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-18_west"]), + "10b_j-18_east": PreRegion("10b_j-18_east", "10b_j-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-18_east"]), + + "10b_j-19_bottom": PreRegion("10b_j-19_bottom", "10b_j-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-19_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-19_bottom"]), + "10b_j-19_top": PreRegion("10b_j-19_top", "10b_j-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-19_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-19_top"]), + + "10b_GOAL_main": PreRegion("10b_GOAL_main", "10b_GOAL", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_GOAL_main"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_GOAL_main"]), + "10b_GOAL_moon": PreRegion("10b_GOAL_moon", "10b_GOAL", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_GOAL_moon"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_GOAL_moon"]), + + "10c_end-golden_bottom": PreRegion("10c_end-golden_bottom", "10c_end-golden", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10c_end-golden_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10c_end-golden_bottom"]), + "10c_end-golden_top": PreRegion("10c_end-golden_top", "10c_end-golden", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10c_end-golden_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10c_end-golden_top"]), + +} + +all_room_connections: dict[str, RoomConnection] = { + "0a_-1_east---0a_0_west": RoomConnection("0a", all_doors["0a_-1_east"], all_doors["0a_0_west"]), + "0a_0_north---0a_0b_south": RoomConnection("0a", all_doors["0a_0_north"], all_doors["0a_0b_south"]), + "0a_0_east---0a_1_west": RoomConnection("0a", all_doors["0a_0_east"], all_doors["0a_1_west"]), + "0a_1_east---0a_2_west": RoomConnection("0a", all_doors["0a_1_east"], all_doors["0a_2_west"]), + "0a_2_east---0a_3_west": RoomConnection("0a", all_doors["0a_2_east"], all_doors["0a_3_west"]), + + "1a_1_east---1a_2_west": RoomConnection("1a", all_doors["1a_1_east"], all_doors["1a_2_west"]), + "1a_2_east---1a_3_west": RoomConnection("1a", all_doors["1a_2_east"], all_doors["1a_3_west"]), + "1a_3_east---1a_4_west": RoomConnection("1a", all_doors["1a_3_east"], all_doors["1a_4_west"]), + "1a_4_east---1a_3b_west": RoomConnection("1a", all_doors["1a_4_east"], all_doors["1a_3b_west"]), + "1a_3b_top---1a_5_bottom": RoomConnection("1a", all_doors["1a_3b_top"], all_doors["1a_5_bottom"]), + "1a_5_west---1a_5z_east": RoomConnection("1a", all_doors["1a_5_west"], all_doors["1a_5z_east"]), + "1a_5_south-east---1a_5a_west": RoomConnection("1a", all_doors["1a_5_south-east"], all_doors["1a_5a_west"]), + "1a_5_top---1a_6_south-west": RoomConnection("1a", all_doors["1a_5_top"], all_doors["1a_6_south-west"]), + "1a_6_west---1a_6z_east": RoomConnection("1a", all_doors["1a_6_west"], all_doors["1a_6z_east"]), + "1a_6_east---1a_6a_west": RoomConnection("1a", all_doors["1a_6_east"], all_doors["1a_6a_west"]), + "1a_6z_north-west---1a_7zb_east": RoomConnection("1a", all_doors["1a_6z_north-west"], all_doors["1a_7zb_east"]), + "1a_6z_west---1a_6zb_east": RoomConnection("1a", all_doors["1a_6z_west"], all_doors["1a_6zb_east"]), + "1a_7zb_west---1a_6zb_north-west": RoomConnection("1a", all_doors["1a_7zb_west"], all_doors["1a_6zb_north-west"]), + "1a_6a_east---1a_6b_south-west": RoomConnection("1a", all_doors["1a_6a_east"], all_doors["1a_6b_south-west"]), + "1a_6b_north-west---1a_s0_east": RoomConnection("1a", all_doors["1a_6b_north-west"], all_doors["1a_s0_east"]), + "1a_6b_north-east---1a_6c_south-west": RoomConnection("1a", all_doors["1a_6b_north-east"], all_doors["1a_6c_south-west"]), + "1a_s0_west---1a_s1_east": RoomConnection("1a", all_doors["1a_s0_west"], all_doors["1a_s1_east"]), + "1a_6c_north-west---1a_7z_bottom": RoomConnection("1a", all_doors["1a_6c_north-west"], all_doors["1a_7z_bottom"]), + "1a_6c_north-east---1a_7_west": RoomConnection("1a", all_doors["1a_6c_north-east"], all_doors["1a_7_west"]), + "1a_7_east---1a_8_south-west": RoomConnection("1a", all_doors["1a_7_east"], all_doors["1a_8_south-west"]), + "1a_7z_top---1a_8z_bottom": RoomConnection("1a", all_doors["1a_7z_top"], all_doors["1a_8z_bottom"]), + "1a_8z_top---1a_8zb_west": RoomConnection("1a", all_doors["1a_8z_top"], all_doors["1a_8zb_west"]), + "1a_8zb_east---1a_8_west": RoomConnection("1a", all_doors["1a_8zb_east"], all_doors["1a_8_west"]), + "1a_8_south---1a_7a_west": RoomConnection("1a", all_doors["1a_8_south"], all_doors["1a_7a_west"]), + "1a_8_north---1a_9z_east": RoomConnection("1a", all_doors["1a_8_north"], all_doors["1a_9z_east"]), + "1a_8_north-east---1a_8b_west": RoomConnection("1a", all_doors["1a_8_north-east"], all_doors["1a_8b_west"]), + "1a_7a_east---1a_8_south-east": RoomConnection("1a", all_doors["1a_7a_east"], all_doors["1a_8_south-east"]), + "1a_8b_east---1a_9_west": RoomConnection("1a", all_doors["1a_8b_east"], all_doors["1a_9_west"]), + "1a_9_east---1a_9b_west": RoomConnection("1a", all_doors["1a_9_east"], all_doors["1a_9b_west"]), + "1a_9b_north-west---1a_10_south-east": RoomConnection("1a", all_doors["1a_9b_north-west"], all_doors["1a_10_south-east"]), + "1a_9b_north-east---1a_10a_bottom": RoomConnection("1a", all_doors["1a_9b_north-east"], all_doors["1a_10a_bottom"]), + "1a_9b_east---1a_9c_west": RoomConnection("1a", all_doors["1a_9b_east"], all_doors["1a_9c_west"]), + "1a_10_south-west---1a_10z_east": RoomConnection("1a", all_doors["1a_10_south-west"], all_doors["1a_10z_east"]), + "1a_10_north-west---1a_11_south-west": RoomConnection("1a", all_doors["1a_10_north-west"], all_doors["1a_11_south-west"]), + "1a_10z_west---1a_10zb_east": RoomConnection("1a", all_doors["1a_10z_west"], all_doors["1a_10zb_east"]), + "1a_11_south---1a_10_north-east": RoomConnection("1a", all_doors["1a_11_south"], all_doors["1a_10_north-east"]), + "1a_11_west---1a_11z_east": RoomConnection("1a", all_doors["1a_11_west"], all_doors["1a_11z_east"]), + "1a_10a_top---1a_11_south-east": RoomConnection("1a", all_doors["1a_10a_top"], all_doors["1a_11_south-east"]), + "1a_11_north---1a_12_south-west": RoomConnection("1a", all_doors["1a_11_north"], all_doors["1a_12_south-west"]), + "1a_12_north-west---1a_12z_east": RoomConnection("1a", all_doors["1a_12_north-west"], all_doors["1a_12z_east"]), + "1a_12_east---1a_12a_bottom": RoomConnection("1a", all_doors["1a_12_east"], all_doors["1a_12a_bottom"]), + "1a_12a_top---1a_end_south": RoomConnection("1a", all_doors["1a_12a_top"], all_doors["1a_end_south"]), + + "1b_00_east---1b_01_west": RoomConnection("1b", all_doors["1b_00_east"], all_doors["1b_01_west"]), + "1b_01_east---1b_02_west": RoomConnection("1b", all_doors["1b_01_east"], all_doors["1b_02_west"]), + "1b_02_east---1b_02b_west": RoomConnection("1b", all_doors["1b_02_east"], all_doors["1b_02b_west"]), + "1b_02b_east---1b_03_west": RoomConnection("1b", all_doors["1b_02b_east"], all_doors["1b_03_west"]), + "1b_03_east---1b_04_west": RoomConnection("1b", all_doors["1b_03_east"], all_doors["1b_04_west"]), + "1b_04_east---1b_05_west": RoomConnection("1b", all_doors["1b_04_east"], all_doors["1b_05_west"]), + "1b_05_east---1b_05b_west": RoomConnection("1b", all_doors["1b_05_east"], all_doors["1b_05b_west"]), + "1b_05b_east---1b_06_west": RoomConnection("1b", all_doors["1b_05b_east"], all_doors["1b_06_west"]), + "1b_06_east---1b_07_bottom": RoomConnection("1b", all_doors["1b_06_east"], all_doors["1b_07_bottom"]), + "1b_07_top---1b_08_west": RoomConnection("1b", all_doors["1b_07_top"], all_doors["1b_08_west"]), + "1b_08_east---1b_08b_west": RoomConnection("1b", all_doors["1b_08_east"], all_doors["1b_08b_west"]), + "1b_08b_east---1b_09_west": RoomConnection("1b", all_doors["1b_08b_east"], all_doors["1b_09_west"]), + "1b_09_east---1b_10_west": RoomConnection("1b", all_doors["1b_09_east"], all_doors["1b_10_west"]), + "1b_10_east---1b_11_bottom": RoomConnection("1b", all_doors["1b_10_east"], all_doors["1b_11_bottom"]), + "1b_11_top---1b_end_west": RoomConnection("1b", all_doors["1b_11_top"], all_doors["1b_end_west"]), + + "1c_00_east---1c_01_west": RoomConnection("1c", all_doors["1c_00_east"], all_doors["1c_01_west"]), + "1c_01_east---1c_02_west": RoomConnection("1c", all_doors["1c_01_east"], all_doors["1c_02_west"]), + + "2a_start_top---2a_s0_bottom": RoomConnection("2a", all_doors["2a_start_top"], all_doors["2a_s0_bottom"]), + "2a_start_east---2a_0_south-west": RoomConnection("2a", all_doors["2a_start_east"], all_doors["2a_0_south-west"]), + "2a_s0_top---2a_s1_bottom": RoomConnection("2a", all_doors["2a_s0_top"], all_doors["2a_s1_bottom"]), + "2a_s1_top---2a_s2_bottom": RoomConnection("2a", all_doors["2a_s1_top"], all_doors["2a_s2_bottom"]), + "2a_0_north-west---2a_3x_bottom": RoomConnection("2a", all_doors["2a_0_north-west"], all_doors["2a_3x_bottom"]), + "2a_0_north-east---2a_1_north-west": RoomConnection("2a", all_doors["2a_0_north-east"], all_doors["2a_1_north-west"]), + "2a_0_south-east---2a_1_south-west": RoomConnection("2a", all_doors["2a_0_south-east"], all_doors["2a_1_south-west"]), + "2a_1_south---2a_d0_north": RoomConnection("2a", all_doors["2a_1_south"], all_doors["2a_d0_north"]), + "2a_1_south-east---2a_2_south-west": RoomConnection("2a", all_doors["2a_1_south-east"], all_doors["2a_2_south-west"]), + "2a_d0_north-west---2a_d1_north-east": RoomConnection("2a", all_doors["2a_d0_north-west"], all_doors["2a_d1_north-east"]), + "2a_d0_west---2a_d1_south-east": RoomConnection("2a", all_doors["2a_d0_west"], all_doors["2a_d1_south-east"]), + "2a_d0_south-west---2a_d6_east": RoomConnection("2a", all_doors["2a_d0_south-west"], all_doors["2a_d6_east"]), + "2a_d0_south---2a_d9_north-west": RoomConnection("2a", all_doors["2a_d0_south"], all_doors["2a_d9_north-west"]), + "2a_d0_south-east---2a_d7_west": RoomConnection("2a", all_doors["2a_d0_south-east"], all_doors["2a_d7_west"]), + "2a_d0_east---2a_d2_west": RoomConnection("2a", all_doors["2a_d0_east"], all_doors["2a_d2_west"]), + "2a_d0_north-east---2a_d4_west": RoomConnection("2a", all_doors["2a_d0_north-east"], all_doors["2a_d4_west"]), + "2a_d1_south-west---2a_d6_west": RoomConnection("2a", all_doors["2a_d1_south-west"], all_doors["2a_d6_west"]), + "2a_d7_east---2a_d8_west": RoomConnection("2a", all_doors["2a_d7_east"], all_doors["2a_d8_west"]), + "2a_d2_east---2a_d3_north": RoomConnection("2a", all_doors["2a_d2_east"], all_doors["2a_d3_north"]), + "2a_d4_east---2a_d5_west": RoomConnection("2a", all_doors["2a_d4_east"], all_doors["2a_d5_west"]), + "2a_d4_south---2a_d2_north-west": RoomConnection("2a", all_doors["2a_d4_south"], all_doors["2a_d2_north-west"]), + "2a_d8_north-east---2a_d3_west": RoomConnection("2a", all_doors["2a_d8_north-east"], all_doors["2a_d3_west"]), + "2a_d8_south-east---2a_d3_south": RoomConnection("2a", all_doors["2a_d8_south-east"], all_doors["2a_d3_south"]), + "2a_3x_top---2a_3_bottom": RoomConnection("2a", all_doors["2a_3x_top"], all_doors["2a_3_bottom"]), + "2a_3_top---2a_4_bottom": RoomConnection("2a", all_doors["2a_3_top"], all_doors["2a_4_bottom"]), + "2a_4_top---2a_5_bottom": RoomConnection("2a", all_doors["2a_4_top"], all_doors["2a_5_bottom"]), + "2a_5_top---2a_6_bottom": RoomConnection("2a", all_doors["2a_5_top"], all_doors["2a_6_bottom"]), + "2a_6_top---2a_7_bottom": RoomConnection("2a", all_doors["2a_6_top"], all_doors["2a_7_bottom"]), + "2a_7_top---2a_8_bottom": RoomConnection("2a", all_doors["2a_7_top"], all_doors["2a_8_bottom"]), + "2a_8_top---2a_9_west": RoomConnection("2a", all_doors["2a_8_top"], all_doors["2a_9_west"]), + "2a_9_north---2a_9b_east": RoomConnection("2a", all_doors["2a_9_north"], all_doors["2a_9b_east"]), + "2a_9_south-east---2a_10_top": RoomConnection("2a", all_doors["2a_9_south-east"], all_doors["2a_10_top"]), + "2a_9b_west---2a_9_north-west": RoomConnection("2a", all_doors["2a_9b_west"], all_doors["2a_9_north-west"]), + "2a_10_bottom---2a_2_north-west": RoomConnection("2a", all_doors["2a_10_bottom"], all_doors["2a_2_north-west"]), + "2a_2_south-east---2a_11_west": RoomConnection("2a", all_doors["2a_2_south-east"], all_doors["2a_11_west"]), + "2a_11_east---2a_12b_west": RoomConnection("2a", all_doors["2a_11_east"], all_doors["2a_12b_west"]), + "2a_12b_north---2a_12c_south": RoomConnection("2a", all_doors["2a_12b_north"], all_doors["2a_12c_south"]), + "2a_12b_south---2a_12d_north-west": RoomConnection("2a", all_doors["2a_12b_south"], all_doors["2a_12d_north-west"]), + "2a_12b_east---2a_12_west": RoomConnection("2a", all_doors["2a_12b_east"], all_doors["2a_12_west"]), + "2a_12d_north---2a_12b_south-east": RoomConnection("2a", all_doors["2a_12d_north"], all_doors["2a_12b_south-east"]), + "2a_12_east---2a_13_west": RoomConnection("2a", all_doors["2a_12_east"], all_doors["2a_13_west"]), + "2a_13_phone---2a_end_0_main": RoomConnection("2a", all_doors["2a_13_phone"], all_doors["2a_end_0_main"]), + "2a_end_0_top---2a_end_s0_bottom": RoomConnection("2a", all_doors["2a_end_0_top"], all_doors["2a_end_s0_bottom"]), + "2a_end_0_east---2a_end_1_west": RoomConnection("2a", all_doors["2a_end_0_east"], all_doors["2a_end_1_west"]), + "2a_end_s0_top---2a_end_s1_bottom": RoomConnection("2a", all_doors["2a_end_s0_top"], all_doors["2a_end_s1_bottom"]), + "2a_end_1_east---2a_end_2_west": RoomConnection("2a", all_doors["2a_end_1_east"], all_doors["2a_end_2_west"]), + "2a_end_1_north-east---2a_end_2_north-west": RoomConnection("2a", all_doors["2a_end_1_north-east"], all_doors["2a_end_2_north-west"]), + "2a_end_2_east---2a_end_3_west": RoomConnection("2a", all_doors["2a_end_2_east"], all_doors["2a_end_3_west"]), + "2a_end_2_north-east---2a_end_3_north-west": RoomConnection("2a", all_doors["2a_end_2_north-east"], all_doors["2a_end_3_north-west"]), + "2a_end_3_east---2a_end_4_west": RoomConnection("2a", all_doors["2a_end_3_east"], all_doors["2a_end_4_west"]), + "2a_end_4_east---2a_end_3b_west": RoomConnection("2a", all_doors["2a_end_4_east"], all_doors["2a_end_3b_west"]), + "2a_end_3b_north---2a_end_3cb_bottom": RoomConnection("2a", all_doors["2a_end_3b_north"], all_doors["2a_end_3cb_bottom"]), + "2a_end_3b_east---2a_end_5_west": RoomConnection("2a", all_doors["2a_end_3b_east"], all_doors["2a_end_5_west"]), + "2a_end_3cb_top---2a_end_3c_bottom": RoomConnection("2a", all_doors["2a_end_3cb_top"], all_doors["2a_end_3c_bottom"]), + "2a_end_5_east---2a_end_6_west": RoomConnection("2a", all_doors["2a_end_5_east"], all_doors["2a_end_6_west"]), + + "2b_start_east---2b_00_west": RoomConnection("2b", all_doors["2b_start_east"], all_doors["2b_00_west"]), + "2b_00_east---2b_01_west": RoomConnection("2b", all_doors["2b_00_east"], all_doors["2b_01_west"]), + "2b_01_east---2b_01b_west": RoomConnection("2b", all_doors["2b_01_east"], all_doors["2b_01b_west"]), + "2b_01b_east---2b_02b_west": RoomConnection("2b", all_doors["2b_01b_east"], all_doors["2b_02b_west"]), + "2b_02b_east---2b_02_west": RoomConnection("2b", all_doors["2b_02b_east"], all_doors["2b_02_west"]), + "2b_02_east---2b_03_west": RoomConnection("2b", all_doors["2b_02_east"], all_doors["2b_03_west"]), + "2b_03_east---2b_04_bottom": RoomConnection("2b", all_doors["2b_03_east"], all_doors["2b_04_bottom"]), + "2b_04_top---2b_05_bottom": RoomConnection("2b", all_doors["2b_04_top"], all_doors["2b_05_bottom"]), + "2b_05_top---2b_06_west": RoomConnection("2b", all_doors["2b_05_top"], all_doors["2b_06_west"]), + "2b_06_east---2b_07_bottom": RoomConnection("2b", all_doors["2b_06_east"], all_doors["2b_07_bottom"]), + "2b_07_top---2b_08b_west": RoomConnection("2b", all_doors["2b_07_top"], all_doors["2b_08b_west"]), + "2b_08b_east---2b_08_west": RoomConnection("2b", all_doors["2b_08b_east"], all_doors["2b_08_west"]), + "2b_08_east---2b_09_west": RoomConnection("2b", all_doors["2b_08_east"], all_doors["2b_09_west"]), + "2b_09_east---2b_10_west": RoomConnection("2b", all_doors["2b_09_east"], all_doors["2b_10_west"]), + "2b_10_east---2b_11_bottom": RoomConnection("2b", all_doors["2b_10_east"], all_doors["2b_11_bottom"]), + "2b_11_top---2b_end_west": RoomConnection("2b", all_doors["2b_11_top"], all_doors["2b_end_west"]), + + "2c_00_east---2c_01_west": RoomConnection("2c", all_doors["2c_00_east"], all_doors["2c_01_west"]), + "2c_01_east---2c_02_west": RoomConnection("2c", all_doors["2c_01_east"], all_doors["2c_02_west"]), + + "3a_s0_east---3a_s1_west": RoomConnection("3a", all_doors["3a_s0_east"], all_doors["3a_s1_west"]), + "3a_s1_east---3a_s2_west": RoomConnection("3a", all_doors["3a_s1_east"], all_doors["3a_s2_west"]), + "3a_s1_north-east---3a_s2_north-west": RoomConnection("3a", all_doors["3a_s1_north-east"], all_doors["3a_s2_north-west"]), + "3a_s2_east---3a_s3_west": RoomConnection("3a", all_doors["3a_s2_east"], all_doors["3a_s3_west"]), + "3a_s3_east---3a_0x-a_west": RoomConnection("3a", all_doors["3a_s3_east"], all_doors["3a_0x-a_west"]), + "3a_0x-a_east---3a_00-a_west": RoomConnection("3a", all_doors["3a_0x-a_east"], all_doors["3a_00-a_west"]), + "3a_00-a_east---3a_02-a_west": RoomConnection("3a", all_doors["3a_00-a_east"], all_doors["3a_02-a_west"]), + "3a_02-a_east---3a_03-a_west": RoomConnection("3a", all_doors["3a_02-a_east"], all_doors["3a_03-a_west"]), + "3a_02-a_top---3a_02-b_east": RoomConnection("3a", all_doors["3a_02-a_top"], all_doors["3a_02-b_east"]), + "3a_02-b_west---3a_01-b_east": RoomConnection("3a", all_doors["3a_02-b_west"], all_doors["3a_01-b_east"]), + "3a_01-b_north-west---3a_00-b_east": RoomConnection("3a", all_doors["3a_01-b_north-west"], all_doors["3a_00-b_east"]), + "3a_01-b_west---3a_00-b_south-east": RoomConnection("3a", all_doors["3a_01-b_west"], all_doors["3a_00-b_south-east"]), + "3a_00-b_south-west---3a_0x-b_south-east": RoomConnection("3a", all_doors["3a_00-b_south-west"], all_doors["3a_0x-b_south-east"]), + "3a_00-b_north---3a_00-c_south-east": RoomConnection("3a", all_doors["3a_00-b_north"], all_doors["3a_00-c_south-east"]), + "3a_00-b_west---3a_0x-b_north-east": RoomConnection("3a", all_doors["3a_00-b_west"], all_doors["3a_0x-b_north-east"]), + "3a_00-c_south-west---3a_00-b_north-west": RoomConnection("3a", all_doors["3a_00-c_south-west"], all_doors["3a_00-b_north-west"]), + "3a_00-c_north-east---3a_01-c_west": RoomConnection("3a", all_doors["3a_00-c_north-east"], all_doors["3a_01-c_west"]), + "3a_0x-b_west---3a_s3_north": RoomConnection("3a", all_doors["3a_0x-b_west"], all_doors["3a_s3_north"]), + "3a_03-a_top---3a_04-b_east": RoomConnection("3a", all_doors["3a_03-a_top"], all_doors["3a_04-b_east"]), + "3a_03-a_east---3a_05-a_west": RoomConnection("3a", all_doors["3a_03-a_east"], all_doors["3a_05-a_west"]), + "3a_05-a_east---3a_06-a_west": RoomConnection("3a", all_doors["3a_05-a_east"], all_doors["3a_06-a_west"]), + "3a_06-a_east---3a_07-a_west": RoomConnection("3a", all_doors["3a_06-a_east"], all_doors["3a_07-a_west"]), + "3a_07-a_top---3a_07-b_bottom": RoomConnection("3a", all_doors["3a_07-a_top"], all_doors["3a_07-b_bottom"]), + "3a_07-a_east---3a_08-a_west": RoomConnection("3a", all_doors["3a_07-a_east"], all_doors["3a_08-a_west"]), + "3a_07-b_west---3a_06-b_east": RoomConnection("3a", all_doors["3a_07-b_west"], all_doors["3a_06-b_east"]), + "3a_06-b_west---3a_06-c_south-west": RoomConnection("3a", all_doors["3a_06-b_west"], all_doors["3a_06-c_south-west"]), + "3a_06-c_north-west---3a_05-c_east": RoomConnection("3a", all_doors["3a_06-c_north-west"], all_doors["3a_05-c_east"]), + "3a_06-c_east---3a_08-c_west": RoomConnection("3a", all_doors["3a_06-c_east"], all_doors["3a_08-c_west"]), + "3a_06-c_south-east---3a_07-b_top": RoomConnection("3a", all_doors["3a_06-c_south-east"], all_doors["3a_07-b_top"]), + "3a_08-c_east---3a_08-b_east": RoomConnection("3a", all_doors["3a_08-c_east"], all_doors["3a_08-b_east"]), + "3a_08-b_west---3a_07-b_east": RoomConnection("3a", all_doors["3a_08-b_west"], all_doors["3a_07-b_east"]), + "3a_08-a_bottom---3a_08-x_west": RoomConnection("3a", all_doors["3a_08-a_bottom"], all_doors["3a_08-x_west"]), + "3a_08-a_east---3a_09-b_west": RoomConnection("3a", all_doors["3a_08-a_east"], all_doors["3a_09-b_west"]), + "3a_09-b_south-east---3a_10-x_north-east-top": RoomConnection("3a", all_doors["3a_09-b_south-east"], all_doors["3a_10-x_north-east-top"]), + "3a_09-b_north-west---3a_09-d_bottom": RoomConnection("3a", all_doors["3a_09-b_north-west"], all_doors["3a_09-d_bottom"]), + "3a_09-b_north-east-top---3a_10-c_south-east": RoomConnection("3a", all_doors["3a_09-b_north-east-top"], all_doors["3a_10-c_south-east"]), + "3a_09-b_east---3a_11-a_west": RoomConnection("3a", all_doors["3a_09-b_east"], all_doors["3a_11-a_west"]), + "3a_09-b_north-east-right---3a_11-b_west": RoomConnection("3a", all_doors["3a_09-b_north-east-right"], all_doors["3a_11-b_west"]), + "3a_10-x_north-east-right---3a_11-x_west": RoomConnection("3a", all_doors["3a_10-x_north-east-right"], all_doors["3a_11-x_west"]), + "3a_11-x_south---3a_11-y_west": RoomConnection("3a", all_doors["3a_11-x_south"], all_doors["3a_11-y_west"]), + "3a_11-y_east---3a_12-y_west": RoomConnection("3a", all_doors["3a_11-y_east"], all_doors["3a_12-y_west"]), + "3a_11-y_south---3a_11-z_east": RoomConnection("3a", all_doors["3a_11-y_south"], all_doors["3a_11-z_east"]), + "3a_11-z_west---3a_10-z_bottom": RoomConnection("3a", all_doors["3a_11-z_west"], all_doors["3a_10-z_bottom"]), + "3a_10-z_top---3a_10-y_bottom": RoomConnection("3a", all_doors["3a_10-z_top"], all_doors["3a_10-y_bottom"]), + "3a_10-y_top---3a_10-x_south-east": RoomConnection("3a", all_doors["3a_10-y_top"], all_doors["3a_10-x_south-east"]), + "3a_10-x_west---3a_09-b_south": RoomConnection("3a", all_doors["3a_10-x_west"], all_doors["3a_09-b_south"]), + "3a_10-c_north-east---3a_11-c_west": RoomConnection("3a", all_doors["3a_10-c_north-east"], all_doors["3a_11-c_west"]), + "3a_10-c_south-west---3a_09-b_north": RoomConnection("3a", all_doors["3a_10-c_south-west"], all_doors["3a_09-b_north"]), + "3a_11-c_east---3a_12-c_west": RoomConnection("3a", all_doors["3a_11-c_east"], all_doors["3a_12-c_west"]), + "3a_11-c_south-west---3a_11-b_north-west": RoomConnection("3a", all_doors["3a_11-c_south-west"], all_doors["3a_11-b_north-west"]), + "3a_12-c_top---3a_12-d_bottom": RoomConnection("3a", all_doors["3a_12-c_top"], all_doors["3a_12-d_bottom"]), + "3a_12-d_top---3a_11-d_east": RoomConnection("3a", all_doors["3a_12-d_top"], all_doors["3a_11-d_east"]), + "3a_11-d_west---3a_10-d_east": RoomConnection("3a", all_doors["3a_11-d_west"], all_doors["3a_10-d_east"]), + "3a_10-d_west---3a_10-c_north-west": RoomConnection("3a", all_doors["3a_10-d_west"], all_doors["3a_10-c_north-west"]), + "3a_11-b_north-east---3a_11-c_south-east": RoomConnection("3a", all_doors["3a_11-b_north-east"], all_doors["3a_11-c_south-east"]), + "3a_11-b_east---3a_12-b_west": RoomConnection("3a", all_doors["3a_11-b_east"], all_doors["3a_12-b_west"]), + "3a_12-b_east---3a_13-b_top": RoomConnection("3a", all_doors["3a_12-b_east"], all_doors["3a_13-b_top"]), + "3a_13-b_bottom---3a_13-a_west": RoomConnection("3a", all_doors["3a_13-b_bottom"], all_doors["3a_13-a_west"]), + "3a_13-a_east---3a_13-x_east": RoomConnection("3a", all_doors["3a_13-a_east"], all_doors["3a_13-x_east"]), + "3a_13-x_west---3a_12-x_east": RoomConnection("3a", all_doors["3a_13-x_west"], all_doors["3a_12-x_east"]), + "3a_12-x_north-east---3a_11-a_south-east-bottom": RoomConnection("3a", all_doors["3a_12-x_north-east"], all_doors["3a_11-a_south-east-bottom"]), + "3a_12-x_west---3a_11-a_south": RoomConnection("3a", all_doors["3a_12-x_west"], all_doors["3a_11-a_south"]), + "3a_11-a_south-east-right---3a_13-a_south-west": RoomConnection("3a", all_doors["3a_11-a_south-east-right"], all_doors["3a_13-a_south-west"]), + "3a_08-x_east---3a_09-b_south-west": RoomConnection("3a", all_doors["3a_08-x_east"], all_doors["3a_09-b_south-west"]), + "3a_09-d_top---3a_08-d_east": RoomConnection("3a", all_doors["3a_09-d_top"], all_doors["3a_08-d_east"]), + "3a_08-d_west---3a_06-d_east": RoomConnection("3a", all_doors["3a_08-d_west"], all_doors["3a_06-d_east"]), + "3a_06-d_west---3a_04-d_east": RoomConnection("3a", all_doors["3a_06-d_west"], all_doors["3a_04-d_east"]), + "3a_04-d_west---3a_02-d_east": RoomConnection("3a", all_doors["3a_04-d_west"], all_doors["3a_02-d_east"]), + "3a_04-d_south---3a_04-c_east": RoomConnection("3a", all_doors["3a_04-d_south"], all_doors["3a_04-c_east"]), + "3a_04-c_west---3a_02-c_east": RoomConnection("3a", all_doors["3a_04-c_west"], all_doors["3a_02-c_east"]), + "3a_04-c_north-west---3a_04-d_south-west": RoomConnection("3a", all_doors["3a_04-c_north-west"], all_doors["3a_04-d_south-west"]), + "3a_02-c_west---3a_01-c_east": RoomConnection("3a", all_doors["3a_02-c_west"], all_doors["3a_01-c_east"]), + "3a_02-c_south-east---3a_03-b_north": RoomConnection("3a", all_doors["3a_02-c_south-east"], all_doors["3a_03-b_north"]), + "3a_03-b_east---3a_04-b_west": RoomConnection("3a", all_doors["3a_03-b_east"], all_doors["3a_04-b_west"]), + "3a_03-b_west---3a_02-b_far-east": RoomConnection("3a", all_doors["3a_03-b_west"], all_doors["3a_02-b_far-east"]), + "3a_02-d_west---3a_00-d_east": RoomConnection("3a", all_doors["3a_02-d_west"], all_doors["3a_00-d_east"]), + "3a_00-d_west---3a_roof00_west": RoomConnection("3a", all_doors["3a_00-d_west"], all_doors["3a_roof00_west"]), + "3a_roof00_east---3a_roof01_west": RoomConnection("3a", all_doors["3a_roof00_east"], all_doors["3a_roof01_west"]), + "3a_roof01_east---3a_roof02_west": RoomConnection("3a", all_doors["3a_roof01_east"], all_doors["3a_roof02_west"]), + "3a_roof02_east---3a_roof03_west": RoomConnection("3a", all_doors["3a_roof02_east"], all_doors["3a_roof03_west"]), + "3a_roof03_east---3a_roof04_west": RoomConnection("3a", all_doors["3a_roof03_east"], all_doors["3a_roof04_west"]), + "3a_roof04_east---3a_roof05_west": RoomConnection("3a", all_doors["3a_roof04_east"], all_doors["3a_roof05_west"]), + "3a_roof05_east---3a_roof06b_west": RoomConnection("3a", all_doors["3a_roof05_east"], all_doors["3a_roof06b_west"]), + "3a_roof06b_east---3a_roof06_west": RoomConnection("3a", all_doors["3a_roof06b_east"], all_doors["3a_roof06_west"]), + "3a_roof06_east---3a_roof07_west": RoomConnection("3a", all_doors["3a_roof06_east"], all_doors["3a_roof07_west"]), + + "3b_00_east---3b_01_west": RoomConnection("3b", all_doors["3b_00_east"], all_doors["3b_01_west"]), + "3b_00_west---3b_back_east": RoomConnection("3b", all_doors["3b_00_west"], all_doors["3b_back_east"]), + "3b_01_east---3b_02_west": RoomConnection("3b", all_doors["3b_01_east"], all_doors["3b_02_west"]), + "3b_02_east---3b_03_west": RoomConnection("3b", all_doors["3b_02_east"], all_doors["3b_03_west"]), + "3b_03_east---3b_04_west": RoomConnection("3b", all_doors["3b_03_east"], all_doors["3b_04_west"]), + "3b_04_east---3b_05_west": RoomConnection("3b", all_doors["3b_04_east"], all_doors["3b_05_west"]), + "3b_05_east---3b_06_west": RoomConnection("3b", all_doors["3b_05_east"], all_doors["3b_06_west"]), + "3b_06_east---3b_07_west": RoomConnection("3b", all_doors["3b_06_east"], all_doors["3b_07_west"]), + "3b_07_east---3b_08_bottom": RoomConnection("3b", all_doors["3b_07_east"], all_doors["3b_08_bottom"]), + "3b_08_top---3b_09_west": RoomConnection("3b", all_doors["3b_08_top"], all_doors["3b_09_west"]), + "3b_09_east---3b_10_west": RoomConnection("3b", all_doors["3b_09_east"], all_doors["3b_10_west"]), + "3b_10_east---3b_11_west": RoomConnection("3b", all_doors["3b_10_east"], all_doors["3b_11_west"]), + "3b_11_east---3b_13_west": RoomConnection("3b", all_doors["3b_11_east"], all_doors["3b_13_west"]), + "3b_13_east---3b_14_west": RoomConnection("3b", all_doors["3b_13_east"], all_doors["3b_14_west"]), + "3b_14_east---3b_15_west": RoomConnection("3b", all_doors["3b_14_east"], all_doors["3b_15_west"]), + "3b_15_east---3b_12_west": RoomConnection("3b", all_doors["3b_15_east"], all_doors["3b_12_west"]), + "3b_12_east---3b_16_west": RoomConnection("3b", all_doors["3b_12_east"], all_doors["3b_16_west"]), + "3b_16_top---3b_17_west": RoomConnection("3b", all_doors["3b_16_top"], all_doors["3b_17_west"]), + "3b_17_east---3b_18_west": RoomConnection("3b", all_doors["3b_17_east"], all_doors["3b_18_west"]), + "3b_18_east---3b_19_west": RoomConnection("3b", all_doors["3b_18_east"], all_doors["3b_19_west"]), + "3b_19_east---3b_21_west": RoomConnection("3b", all_doors["3b_19_east"], all_doors["3b_21_west"]), + "3b_21_east---3b_20_west": RoomConnection("3b", all_doors["3b_21_east"], all_doors["3b_20_west"]), + "3b_20_east---3b_end_west": RoomConnection("3b", all_doors["3b_20_east"], all_doors["3b_end_west"]), + + "3c_00_east---3c_01_west": RoomConnection("3c", all_doors["3c_00_east"], all_doors["3c_01_west"]), + "3c_01_east---3c_02_west": RoomConnection("3c", all_doors["3c_01_east"], all_doors["3c_02_west"]), + + "4a_a-00_east---4a_a-01_west": RoomConnection("4a", all_doors["4a_a-00_east"], all_doors["4a_a-01_west"]), + "4a_a-01_east---4a_a-01x_west": RoomConnection("4a", all_doors["4a_a-01_east"], all_doors["4a_a-01x_west"]), + "4a_a-01x_east---4a_a-02_west": RoomConnection("4a", all_doors["4a_a-01x_east"], all_doors["4a_a-02_west"]), + "4a_a-02_east---4a_a-03_west": RoomConnection("4a", all_doors["4a_a-02_east"], all_doors["4a_a-03_west"]), + "4a_a-03_east---4a_a-04_west": RoomConnection("4a", all_doors["4a_a-03_east"], all_doors["4a_a-04_west"]), + "4a_a-04_east---4a_a-05_west": RoomConnection("4a", all_doors["4a_a-04_east"], all_doors["4a_a-05_west"]), + "4a_a-05_east---4a_a-06_west": RoomConnection("4a", all_doors["4a_a-05_east"], all_doors["4a_a-06_west"]), + "4a_a-06_east---4a_a-07_west": RoomConnection("4a", all_doors["4a_a-06_east"], all_doors["4a_a-07_west"]), + "4a_a-07_east---4a_a-08_west": RoomConnection("4a", all_doors["4a_a-07_east"], all_doors["4a_a-08_west"]), + "4a_a-08_north-west---4a_a-10_east": RoomConnection("4a", all_doors["4a_a-08_north-west"], all_doors["4a_a-10_east"]), + "4a_a-08_east---4a_a-09_bottom": RoomConnection("4a", all_doors["4a_a-08_east"], all_doors["4a_a-09_bottom"]), + "4a_a-10_west---4a_a-11_east": RoomConnection("4a", all_doors["4a_a-10_west"], all_doors["4a_a-11_east"]), + "4a_a-09_top---4a_b-00_south": RoomConnection("4a", all_doors["4a_a-09_top"], all_doors["4a_b-00_south"]), + "4a_b-00_south-east---4a_b-01_west": RoomConnection("4a", all_doors["4a_b-00_south-east"], all_doors["4a_b-01_west"]), + "4a_b-00_north-west---4a_b-04_east": RoomConnection("4a", all_doors["4a_b-00_north-west"], all_doors["4a_b-04_east"]), + "4a_b-04_west---4a_b-06_east": RoomConnection("4a", all_doors["4a_b-04_west"], all_doors["4a_b-06_east"]), + "4a_b-06_west---4a_b-07_west": RoomConnection("4a", all_doors["4a_b-06_west"], all_doors["4a_b-07_west"]), + "4a_b-07_east---4a_b-03_west": RoomConnection("4a", all_doors["4a_b-07_east"], all_doors["4a_b-03_west"]), + "4a_b-03_east---4a_b-00_west": RoomConnection("4a", all_doors["4a_b-03_east"], all_doors["4a_b-00_west"]), + "4a_b-00_east---4a_b-02_south-west": RoomConnection("4a", all_doors["4a_b-00_east"], all_doors["4a_b-02_south-west"]), + "4a_b-00_north-east---4a_b-02_north-west": RoomConnection("4a", all_doors["4a_b-00_north-east"], all_doors["4a_b-02_north-west"]), + "4a_b-02_north-east---4a_b-sec_west": RoomConnection("4a", all_doors["4a_b-02_north-east"], all_doors["4a_b-sec_west"]), + "4a_b-sec_east---4a_b-secb_west": RoomConnection("4a", all_doors["4a_b-sec_east"], all_doors["4a_b-secb_west"]), + "4a_b-00_north---4a_b-05_center": RoomConnection("4a", all_doors["4a_b-00_north"], all_doors["4a_b-05_center"]), + "4a_b-05_west---4a_b-04_north-west": RoomConnection("4a", all_doors["4a_b-05_west"], all_doors["4a_b-04_north-west"]), + "4a_b-02_north---4a_b-05_east": RoomConnection("4a", all_doors["4a_b-02_north"], all_doors["4a_b-05_east"]), + "4a_b-05_north-east---4a_b-08b_west": RoomConnection("4a", all_doors["4a_b-05_north-east"], all_doors["4a_b-08b_west"]), + "4a_b-08b_east---4a_b-08_west": RoomConnection("4a", all_doors["4a_b-08b_east"], all_doors["4a_b-08_west"]), + "4a_b-08_east---4a_c-00_west": RoomConnection("4a", all_doors["4a_b-08_east"], all_doors["4a_c-00_west"]), + "4a_c-00_north-west---4a_c-01_east": RoomConnection("4a", all_doors["4a_c-00_north-west"], all_doors["4a_c-01_east"]), + "4a_c-00_east---4a_c-02_west": RoomConnection("4a", all_doors["4a_c-00_east"], all_doors["4a_c-02_west"]), + "4a_c-02_east---4a_c-04_west": RoomConnection("4a", all_doors["4a_c-02_east"], all_doors["4a_c-04_west"]), + "4a_c-04_east---4a_c-05_west": RoomConnection("4a", all_doors["4a_c-04_east"], all_doors["4a_c-05_west"]), + "4a_c-05_east---4a_c-06_bottom": RoomConnection("4a", all_doors["4a_c-05_east"], all_doors["4a_c-06_bottom"]), + "4a_c-06_west---4a_c-06b_east": RoomConnection("4a", all_doors["4a_c-06_west"], all_doors["4a_c-06b_east"]), + "4a_c-06_top---4a_c-09_west": RoomConnection("4a", all_doors["4a_c-06_top"], all_doors["4a_c-09_west"]), + "4a_c-09_east---4a_c-07_west": RoomConnection("4a", all_doors["4a_c-09_east"], all_doors["4a_c-07_west"]), + "4a_c-07_east---4a_c-08_bottom": RoomConnection("4a", all_doors["4a_c-07_east"], all_doors["4a_c-08_bottom"]), + "4a_c-08_east---4a_c-10_bottom": RoomConnection("4a", all_doors["4a_c-08_east"], all_doors["4a_c-10_bottom"]), + "4a_c-08_top---4a_d-00_west": RoomConnection("4a", all_doors["4a_c-08_top"], all_doors["4a_d-00_west"]), + "4a_c-10_top---4a_d-00_south": RoomConnection("4a", all_doors["4a_c-10_top"], all_doors["4a_d-00_south"]), + "4a_d-00_north-west---4a_d-00b_east": RoomConnection("4a", all_doors["4a_d-00_north-west"], all_doors["4a_d-00b_east"]), + "4a_d-00_east---4a_d-01_west": RoomConnection("4a", all_doors["4a_d-00_east"], all_doors["4a_d-01_west"]), + "4a_d-01_east---4a_d-02_west": RoomConnection("4a", all_doors["4a_d-01_east"], all_doors["4a_d-02_west"]), + "4a_d-02_east---4a_d-03_west": RoomConnection("4a", all_doors["4a_d-02_east"], all_doors["4a_d-03_west"]), + "4a_d-03_east---4a_d-04_west": RoomConnection("4a", all_doors["4a_d-03_east"], all_doors["4a_d-04_west"]), + "4a_d-04_east---4a_d-05_west": RoomConnection("4a", all_doors["4a_d-04_east"], all_doors["4a_d-05_west"]), + "4a_d-05_east---4a_d-06_west": RoomConnection("4a", all_doors["4a_d-05_east"], all_doors["4a_d-06_west"]), + "4a_d-06_east---4a_d-07_west": RoomConnection("4a", all_doors["4a_d-06_east"], all_doors["4a_d-07_west"]), + "4a_d-07_east---4a_d-08_west": RoomConnection("4a", all_doors["4a_d-07_east"], all_doors["4a_d-08_west"]), + "4a_d-08_east---4a_d-09_west": RoomConnection("4a", all_doors["4a_d-08_east"], all_doors["4a_d-09_west"]), + "4a_d-09_east---4a_d-10_west": RoomConnection("4a", all_doors["4a_d-09_east"], all_doors["4a_d-10_west"]), + + "4b_a-00_east---4b_a-01_west": RoomConnection("4b", all_doors["4b_a-00_east"], all_doors["4b_a-01_west"]), + "4b_a-01_east---4b_a-02_west": RoomConnection("4b", all_doors["4b_a-01_east"], all_doors["4b_a-02_west"]), + "4b_a-02_east---4b_a-03_west": RoomConnection("4b", all_doors["4b_a-02_east"], all_doors["4b_a-03_west"]), + "4b_a-03_east---4b_a-04_west": RoomConnection("4b", all_doors["4b_a-03_east"], all_doors["4b_a-04_west"]), + "4b_a-04_east---4b_b-00_west": RoomConnection("4b", all_doors["4b_a-04_east"], all_doors["4b_b-00_west"]), + "4b_b-00_east---4b_b-01_west": RoomConnection("4b", all_doors["4b_b-00_east"], all_doors["4b_b-01_west"]), + "4b_b-01_east---4b_b-02_bottom": RoomConnection("4b", all_doors["4b_b-01_east"], all_doors["4b_b-02_bottom"]), + "4b_b-02_top---4b_b-03_west": RoomConnection("4b", all_doors["4b_b-02_top"], all_doors["4b_b-03_west"]), + "4b_b-03_east---4b_b-04_west": RoomConnection("4b", all_doors["4b_b-03_east"], all_doors["4b_b-04_west"]), + "4b_b-04_east---4b_c-00_west": RoomConnection("4b", all_doors["4b_b-04_east"], all_doors["4b_c-00_west"]), + "4b_c-00_east---4b_c-01_west": RoomConnection("4b", all_doors["4b_c-00_east"], all_doors["4b_c-01_west"]), + "4b_c-01_east---4b_c-02_west": RoomConnection("4b", all_doors["4b_c-01_east"], all_doors["4b_c-02_west"]), + "4b_c-02_east---4b_c-03_bottom": RoomConnection("4b", all_doors["4b_c-02_east"], all_doors["4b_c-03_bottom"]), + "4b_c-03_top---4b_c-04_west": RoomConnection("4b", all_doors["4b_c-03_top"], all_doors["4b_c-04_west"]), + "4b_c-04_east---4b_d-00_west": RoomConnection("4b", all_doors["4b_c-04_east"], all_doors["4b_d-00_west"]), + "4b_d-00_east---4b_d-01_west": RoomConnection("4b", all_doors["4b_d-00_east"], all_doors["4b_d-01_west"]), + "4b_d-01_east---4b_d-02_west": RoomConnection("4b", all_doors["4b_d-01_east"], all_doors["4b_d-02_west"]), + "4b_d-02_east---4b_d-03_west": RoomConnection("4b", all_doors["4b_d-02_east"], all_doors["4b_d-03_west"]), + "4b_d-03_east---4b_end_west": RoomConnection("4b", all_doors["4b_d-03_east"], all_doors["4b_end_west"]), + + "4c_00_east---4c_01_west": RoomConnection("4c", all_doors["4c_00_east"], all_doors["4c_01_west"]), + "4c_01_east---4c_02_west": RoomConnection("4c", all_doors["4c_01_east"], all_doors["4c_02_west"]), + + "5a_a-00b_west---5a_a-00x_east": RoomConnection("5a", all_doors["5a_a-00b_west"], all_doors["5a_a-00x_east"]), + "5a_a-00b_east---5a_a-00d_west": RoomConnection("5a", all_doors["5a_a-00b_east"], all_doors["5a_a-00d_west"]), + "5a_a-00d_east---5a_a-00c_west": RoomConnection("5a", all_doors["5a_a-00d_east"], all_doors["5a_a-00c_west"]), + "5a_a-00c_east---5a_a-00_west": RoomConnection("5a", all_doors["5a_a-00c_east"], all_doors["5a_a-00_west"]), + "5a_a-00_east---5a_a-01_west": RoomConnection("5a", all_doors["5a_a-00_east"], all_doors["5a_a-01_west"]), + "5a_a-01_east---5a_a-13_west": RoomConnection("5a", all_doors["5a_a-01_east"], all_doors["5a_a-13_west"]), + "5a_a-01_south-west---5a_a-04_north": RoomConnection("5a", all_doors["5a_a-01_south-west"], all_doors["5a_a-04_north"]), + "5a_a-01_south-east---5a_a-02_north": RoomConnection("5a", all_doors["5a_a-01_south-east"], all_doors["5a_a-02_north"]), + "5a_a-01_north---5a_a-08_south": RoomConnection("5a", all_doors["5a_a-01_north"], all_doors["5a_a-08_south"]), + "5a_a-02_west---5a_a-03_east": RoomConnection("5a", all_doors["5a_a-02_west"], all_doors["5a_a-03_east"]), + "5a_a-02_south---5a_a-05_north-east": RoomConnection("5a", all_doors["5a_a-02_south"], all_doors["5a_a-05_north-east"]), + "5a_a-04_east---5a_a-03_west": RoomConnection("5a", all_doors["5a_a-04_east"], all_doors["5a_a-03_west"]), + "5a_a-04_south---5a_a-05_north-west": RoomConnection("5a", all_doors["5a_a-04_south"], all_doors["5a_a-05_north-west"]), + "5a_a-05_south-west---5a_a-07_east": RoomConnection("5a", all_doors["5a_a-05_south-west"], all_doors["5a_a-07_east"]), + "5a_a-05_south-east---5a_a-06_west": RoomConnection("5a", all_doors["5a_a-05_south-east"], all_doors["5a_a-06_west"]), + "5a_a-08_west---5a_a-10_east": RoomConnection("5a", all_doors["5a_a-08_west"], all_doors["5a_a-10_east"]), + "5a_a-08_north---5a_a-14_south": RoomConnection("5a", all_doors["5a_a-08_north"], all_doors["5a_a-14_south"]), + "5a_a-08_north-east---5a_a-12_north-west": RoomConnection("5a", all_doors["5a_a-08_north-east"], all_doors["5a_a-12_north-west"]), + "5a_a-08_south-east---5a_a-12_south-west": RoomConnection("5a", all_doors["5a_a-08_south-east"], all_doors["5a_a-12_south-west"]), + "5a_a-10_west---5a_a-09_east": RoomConnection("5a", all_doors["5a_a-10_west"], all_doors["5a_a-09_east"]), + "5a_a-09_west---5a_a-11_east": RoomConnection("5a", all_doors["5a_a-09_west"], all_doors["5a_a-11_east"]), + "5a_a-12_west---5a_a-08_east": RoomConnection("5a", all_doors["5a_a-12_west"], all_doors["5a_a-08_east"]), + "5a_a-12_east---5a_a-15_south": RoomConnection("5a", all_doors["5a_a-12_east"], all_doors["5a_a-15_south"]), + "5a_a-13_east---5a_b-00_west": RoomConnection("5a", all_doors["5a_a-13_east"], all_doors["5a_b-00_west"]), + "5a_b-00_north-west---5a_b-18_south": RoomConnection("5a", all_doors["5a_b-00_north-west"], all_doors["5a_b-18_south"]), + "5a_b-00_east---5a_b-01_south-west": RoomConnection("5a", all_doors["5a_b-00_east"], all_doors["5a_b-01_south-west"]), + "5a_b-01_west---5a_b-20_west": RoomConnection("5a", all_doors["5a_b-01_west"], all_doors["5a_b-20_west"]), + "5a_b-01_north---5a_b-20_south": RoomConnection("5a", all_doors["5a_b-01_north"], all_doors["5a_b-20_south"]), + "5a_b-01_north-east---5a_b-20_east": RoomConnection("5a", all_doors["5a_b-01_north-east"], all_doors["5a_b-20_east"]), + "5a_b-01_east---5a_b-01b_west": RoomConnection("5a", all_doors["5a_b-01_east"], all_doors["5a_b-01b_west"]), + "5a_b-01_south---5a_b-01c_west": RoomConnection("5a", all_doors["5a_b-01_south"], all_doors["5a_b-01c_west"]), + "5a_b-01c_east---5a_b-01_south-east": RoomConnection("5a", all_doors["5a_b-01c_east"], all_doors["5a_b-01_south-east"]), + "5a_b-20_south-west---5a_b-01_north-west": RoomConnection("5a", all_doors["5a_b-20_south-west"], all_doors["5a_b-01_north-west"]), + "5a_b-20_north-west---5a_b-21_east": RoomConnection("5a", all_doors["5a_b-20_north-west"], all_doors["5a_b-21_east"]), + "5a_b-01b_east---5a_b-02_west": RoomConnection("5a", all_doors["5a_b-01b_east"], all_doors["5a_b-02_west"]), + "5a_b-02_north-west---5a_b-03_east": RoomConnection("5a", all_doors["5a_b-02_north-west"], all_doors["5a_b-03_east"]), + "5a_b-02_north---5a_b-04_south": RoomConnection("5a", all_doors["5a_b-02_north"], all_doors["5a_b-04_south"]), + "5a_b-02_north-east---5a_b-05_west": RoomConnection("5a", all_doors["5a_b-02_north-east"], all_doors["5a_b-05_west"]), + "5a_b-02_east-upper---5a_b-06_west": RoomConnection("5a", all_doors["5a_b-02_east-upper"], all_doors["5a_b-06_west"]), + "5a_b-02_east-lower---5a_b-11_north-west": RoomConnection("5a", all_doors["5a_b-02_east-lower"], all_doors["5a_b-11_north-west"]), + "5a_b-02_south-east---5a_b-11_west": RoomConnection("5a", all_doors["5a_b-02_south-east"], all_doors["5a_b-11_west"]), + "5a_b-02_south---5a_b-10_east": RoomConnection("5a", all_doors["5a_b-02_south"], all_doors["5a_b-10_east"]), + "5a_b-04_west---5a_b-07_south": RoomConnection("5a", all_doors["5a_b-04_west"], all_doors["5a_b-07_south"]), + "5a_b-07_north---5a_b-08_west": RoomConnection("5a", all_doors["5a_b-07_north"], all_doors["5a_b-08_west"]), + "5a_b-08_east---5a_b-09_north": RoomConnection("5a", all_doors["5a_b-08_east"], all_doors["5a_b-09_north"]), + "5a_b-09_south---5a_b-04_east": RoomConnection("5a", all_doors["5a_b-09_south"], all_doors["5a_b-04_east"]), + "5a_b-11_south-west---5a_b-12_west": RoomConnection("5a", all_doors["5a_b-11_south-west"], all_doors["5a_b-12_west"]), + "5a_b-11_south-east---5a_b-12_east": RoomConnection("5a", all_doors["5a_b-11_south-east"], all_doors["5a_b-12_east"]), + "5a_b-11_east---5a_b-13_west": RoomConnection("5a", all_doors["5a_b-11_east"], all_doors["5a_b-13_west"]), + "5a_b-13_east---5a_b-17_west": RoomConnection("5a", all_doors["5a_b-13_east"], all_doors["5a_b-17_west"]), + "5a_b-13_north-east---5a_b-17_north-west": RoomConnection("5a", all_doors["5a_b-13_north-east"], all_doors["5a_b-17_north-west"]), + "5a_b-17_east---5a_b-22_west": RoomConnection("5a", all_doors["5a_b-17_east"], all_doors["5a_b-22_west"]), + "5a_b-06_east---5a_b-19_west": RoomConnection("5a", all_doors["5a_b-06_east"], all_doors["5a_b-19_west"]), + "5a_b-06_north-east---5a_b-19_north-west": RoomConnection("5a", all_doors["5a_b-06_north-east"], all_doors["5a_b-19_north-west"]), + "5a_b-19_east---5a_b-14_west": RoomConnection("5a", all_doors["5a_b-19_east"], all_doors["5a_b-14_west"]), + "5a_b-14_south---5a_b-15_west": RoomConnection("5a", all_doors["5a_b-14_south"], all_doors["5a_b-15_west"]), + "5a_b-14_north---5a_b-16_bottom": RoomConnection("5a", all_doors["5a_b-14_north"], all_doors["5a_b-16_bottom"]), + "5a_b-16_mirror---5a_void_east": RoomConnection("5a", all_doors["5a_b-16_mirror"], all_doors["5a_void_east"]), + "5a_void_west---5a_c-00_top": RoomConnection("5a", all_doors["5a_void_west"], all_doors["5a_c-00_top"]), + "5a_c-00_bottom---5a_c-01_west": RoomConnection("5a", all_doors["5a_c-00_bottom"], all_doors["5a_c-01_west"]), + "5a_c-01_east---5a_c-01b_west": RoomConnection("5a", all_doors["5a_c-01_east"], all_doors["5a_c-01b_west"]), + "5a_c-01b_east---5a_c-01c_west": RoomConnection("5a", all_doors["5a_c-01b_east"], all_doors["5a_c-01c_west"]), + "5a_c-01c_east---5a_c-08b_west": RoomConnection("5a", all_doors["5a_c-01c_east"], all_doors["5a_c-08b_west"]), + "5a_c-08b_east---5a_c-08_west": RoomConnection("5a", all_doors["5a_c-08b_east"], all_doors["5a_c-08_west"]), + "5a_c-08_east---5a_c-10_west": RoomConnection("5a", all_doors["5a_c-08_east"], all_doors["5a_c-10_west"]), + "5a_c-10_east---5a_c-12_west": RoomConnection("5a", all_doors["5a_c-10_east"], all_doors["5a_c-12_west"]), + "5a_c-12_east---5a_c-07_west": RoomConnection("5a", all_doors["5a_c-12_east"], all_doors["5a_c-07_west"]), + "5a_c-07_east---5a_c-11_west": RoomConnection("5a", all_doors["5a_c-07_east"], all_doors["5a_c-11_west"]), + "5a_c-11_east---5a_c-09_west": RoomConnection("5a", all_doors["5a_c-11_east"], all_doors["5a_c-09_west"]), + "5a_c-09_east---5a_c-13_west": RoomConnection("5a", all_doors["5a_c-09_east"], all_doors["5a_c-13_west"]), + "5a_c-13_east---5a_d-00_south": RoomConnection("5a", all_doors["5a_c-13_east"], all_doors["5a_d-00_south"]), + "5a_d-00_north---5a_d-01_south": RoomConnection("5a", all_doors["5a_d-00_north"], all_doors["5a_d-01_south"]), + "5a_d-00_west---5a_d-05_east": RoomConnection("5a", all_doors["5a_d-00_west"], all_doors["5a_d-05_east"]), + "5a_d-05_south---5a_d-02_east": RoomConnection("5a", all_doors["5a_d-05_south"], all_doors["5a_d-02_east"]), + "5a_d-01_north-west---5a_d-09_east": RoomConnection("5a", all_doors["5a_d-01_north-west"], all_doors["5a_d-09_east"]), + "5a_d-01_west---5a_d-09_east": RoomConnection("5a", all_doors["5a_d-01_west"], all_doors["5a_d-09_east"]), + "5a_d-01_south-west-down---5a_d-05_north": RoomConnection("5a", all_doors["5a_d-01_south-west-down"], all_doors["5a_d-05_north"]), + "5a_d-01_south-east-down---5a_d-07_north": RoomConnection("5a", all_doors["5a_d-01_south-east-down"], all_doors["5a_d-07_north"]), + "5a_d-01_south-east-right---5a_d-15_south-west": RoomConnection("5a", all_doors["5a_d-01_south-east-right"], all_doors["5a_d-15_south-west"]), + "5a_d-01_east---5a_d-15_west": RoomConnection("5a", all_doors["5a_d-01_east"], all_doors["5a_d-15_west"]), + "5a_d-01_north-east---5a_d-15_north-west": RoomConnection("5a", all_doors["5a_d-01_north-east"], all_doors["5a_d-15_north-west"]), + "5a_d-09_west---5a_d-04_north": RoomConnection("5a", all_doors["5a_d-09_west"], all_doors["5a_d-04_north"]), + "5a_d-04_west---5a_d-19b_south-east-right": RoomConnection("5a", all_doors["5a_d-04_west"], all_doors["5a_d-19b_south-east-right"]), + "5a_d-04_south-east---5a_d-01_south-west-left": RoomConnection("5a", all_doors["5a_d-04_south-east"], all_doors["5a_d-01_south-west-left"]), + "5a_d-05_west---5a_d-06_south-east": RoomConnection("5a", all_doors["5a_d-05_west"], all_doors["5a_d-06_south-east"]), + "5a_d-05_south---5a_d-02_east": RoomConnection("5a", all_doors["5a_d-05_south"], all_doors["5a_d-02_east"]), + "5a_d-06_north-east---5a_d-04_south-west-right": RoomConnection("5a", all_doors["5a_d-06_north-east"], all_doors["5a_d-04_south-west-right"]), + "5a_d-06_north-west---5a_d-04_south-west-left": RoomConnection("5a", all_doors["5a_d-06_north-west"], all_doors["5a_d-04_south-west-left"]), + "5a_d-07_west---5a_d-00_east": RoomConnection("5a", all_doors["5a_d-07_west"], all_doors["5a_d-00_east"]), + "5a_d-02_west---5a_d-03_east": RoomConnection("5a", all_doors["5a_d-02_west"], all_doors["5a_d-03_east"]), + "5a_d-03_west---5a_d-06_south-west": RoomConnection("5a", all_doors["5a_d-03_west"], all_doors["5a_d-06_south-west"]), + "5a_d-15_south-east---5a_d-13_east": RoomConnection("5a", all_doors["5a_d-15_south-east"], all_doors["5a_d-13_east"]), + "5a_d-13_west---5a_d-15_south": RoomConnection("5a", all_doors["5a_d-13_west"], all_doors["5a_d-15_south"]), + "5a_d-19b_south-east-down---5a_d-19_east": RoomConnection("5a", all_doors["5a_d-19b_south-east-down"], all_doors["5a_d-19_east"]), + "5a_d-19b_north-east---5a_d-10_west": RoomConnection("5a", all_doors["5a_d-19b_north-east"], all_doors["5a_d-10_west"]), + "5a_d-19_west---5a_d-19b_south-west": RoomConnection("5a", all_doors["5a_d-19_west"], all_doors["5a_d-19b_south-west"]), + "5a_d-10_east---5a_d-20_west": RoomConnection("5a", all_doors["5a_d-10_east"], all_doors["5a_d-20_west"]), + "5a_d-20_east---5a_e-00_west": RoomConnection("5a", all_doors["5a_d-20_east"], all_doors["5a_e-00_west"]), + "5a_e-00_east---5a_e-01_west": RoomConnection("5a", all_doors["5a_e-00_east"], all_doors["5a_e-01_west"]), + "5a_e-01_east---5a_e-02_west": RoomConnection("5a", all_doors["5a_e-01_east"], all_doors["5a_e-02_west"]), + "5a_e-02_east---5a_e-03_west": RoomConnection("5a", all_doors["5a_e-02_east"], all_doors["5a_e-03_west"]), + "5a_e-03_east---5a_e-04_west": RoomConnection("5a", all_doors["5a_e-03_east"], all_doors["5a_e-04_west"]), + "5a_e-04_east---5a_e-06_west": RoomConnection("5a", all_doors["5a_e-04_east"], all_doors["5a_e-06_west"]), + "5a_e-06_east---5a_e-05_west": RoomConnection("5a", all_doors["5a_e-06_east"], all_doors["5a_e-05_west"]), + "5a_e-05_east---5a_e-07_west": RoomConnection("5a", all_doors["5a_e-05_east"], all_doors["5a_e-07_west"]), + "5a_e-07_east---5a_e-08_west": RoomConnection("5a", all_doors["5a_e-07_east"], all_doors["5a_e-08_west"]), + "5a_e-08_east---5a_e-09_west": RoomConnection("5a", all_doors["5a_e-08_east"], all_doors["5a_e-09_west"]), + "5a_e-09_east---5a_e-10_west": RoomConnection("5a", all_doors["5a_e-09_east"], all_doors["5a_e-10_west"]), + "5a_e-10_east---5a_e-11_west": RoomConnection("5a", all_doors["5a_e-10_east"], all_doors["5a_e-11_west"]), + + "5b_start_east---5b_a-00_west": RoomConnection("5b", all_doors["5b_start_east"], all_doors["5b_a-00_west"]), + "5b_a-00_east---5b_a-01_west": RoomConnection("5b", all_doors["5b_a-00_east"], all_doors["5b_a-01_west"]), + "5b_a-01_east---5b_a-02_west": RoomConnection("5b", all_doors["5b_a-01_east"], all_doors["5b_a-02_west"]), + "5b_a-02_east---5b_b-00_south": RoomConnection("5b", all_doors["5b_a-02_east"], all_doors["5b_b-00_south"]), + "5b_b-00_east---5b_b-01_west": RoomConnection("5b", all_doors["5b_b-00_east"], all_doors["5b_b-01_west"]), + "5b_b-00_north---5b_b-02_south": RoomConnection("5b", all_doors["5b_b-00_north"], all_doors["5b_b-02_south"]), + "5b_b-00_west---5b_b-06_east": RoomConnection("5b", all_doors["5b_b-00_west"], all_doors["5b_b-06_east"]), + "5b_b-01_north---5b_b-04_east": RoomConnection("5b", all_doors["5b_b-01_north"], all_doors["5b_b-04_east"]), + "5b_b-01_east---5b_b-07_south": RoomConnection("5b", all_doors["5b_b-01_east"], all_doors["5b_b-07_south"]), + "5b_b-04_west---5b_b-02_south-east": RoomConnection("5b", all_doors["5b_b-04_west"], all_doors["5b_b-02_south-east"]), + "5b_b-02_north-west---5b_b-05_north": RoomConnection("5b", all_doors["5b_b-02_north-west"], all_doors["5b_b-05_north"]), + "5b_b-02_north-east---5b_b-03_west": RoomConnection("5b", all_doors["5b_b-02_north-east"], all_doors["5b_b-03_west"]), + "5b_b-02_north---5b_b-08_south": RoomConnection("5b", all_doors["5b_b-02_north"], all_doors["5b_b-08_south"]), + "5b_b-05_south---5b_b-02_south-west": RoomConnection("5b", all_doors["5b_b-05_south"], all_doors["5b_b-02_south-west"]), + "5b_b-07_north---5b_b-03_east": RoomConnection("5b", all_doors["5b_b-07_north"], all_doors["5b_b-03_east"]), + "5b_b-03_north---5b_b-08_east": RoomConnection("5b", all_doors["5b_b-03_north"], all_doors["5b_b-08_east"]), + "5b_b-08_north---5b_b-09_bottom": RoomConnection("5b", all_doors["5b_b-08_north"], all_doors["5b_b-09_bottom"]), + "5b_b-09_mirror---5b_c-00_mirror": RoomConnection("5b", all_doors["5b_b-09_mirror"], all_doors["5b_c-00_mirror"]), + "5b_c-00_bottom---5b_c-01_west": RoomConnection("5b", all_doors["5b_c-00_bottom"], all_doors["5b_c-01_west"]), + "5b_c-01_east---5b_c-02_west": RoomConnection("5b", all_doors["5b_c-01_east"], all_doors["5b_c-02_west"]), + "5b_c-02_east---5b_c-03_west": RoomConnection("5b", all_doors["5b_c-02_east"], all_doors["5b_c-03_west"]), + "5b_c-03_east---5b_c-04_west": RoomConnection("5b", all_doors["5b_c-03_east"], all_doors["5b_c-04_west"]), + "5b_c-04_east---5b_d-00_west": RoomConnection("5b", all_doors["5b_c-04_east"], all_doors["5b_d-00_west"]), + "5b_d-00_east---5b_d-01_west": RoomConnection("5b", all_doors["5b_d-00_east"], all_doors["5b_d-01_west"]), + "5b_d-00_east---5b_d-01_west": RoomConnection("5b", all_doors["5b_d-00_east"], all_doors["5b_d-01_west"]), + "5b_d-01_east---5b_d-02_west": RoomConnection("5b", all_doors["5b_d-01_east"], all_doors["5b_d-02_west"]), + "5b_d-02_east---5b_d-03_west": RoomConnection("5b", all_doors["5b_d-02_east"], all_doors["5b_d-03_west"]), + "5b_d-03_east---5b_d-04_west": RoomConnection("5b", all_doors["5b_d-03_east"], all_doors["5b_d-04_west"]), + "5b_d-04_east---5b_d-05_west": RoomConnection("5b", all_doors["5b_d-04_east"], all_doors["5b_d-05_west"]), + + "5c_00_east---5c_01_west": RoomConnection("5c", all_doors["5c_00_east"], all_doors["5c_01_west"]), + "5c_01_east---5c_02_west": RoomConnection("5c", all_doors["5c_01_east"], all_doors["5c_02_west"]), + + "6a_00_west---6a_01_bottom": RoomConnection("6a", all_doors["6a_00_west"], all_doors["6a_01_bottom"]), + "6a_01_top---6a_02_bottom": RoomConnection("6a", all_doors["6a_01_top"], all_doors["6a_02_bottom"]), + "6a_02_bottom-west---6a_03_bottom": RoomConnection("6a", all_doors["6a_02_bottom-west"], all_doors["6a_03_bottom"]), + "6a_02_top---6a_02b_bottom": RoomConnection("6a", all_doors["6a_02_top"], all_doors["6a_02b_bottom"]), + "6a_03_top---6a_02_top-west": RoomConnection("6a", all_doors["6a_03_top"], all_doors["6a_02_top-west"]), + "6a_02b_top---6a_04_south": RoomConnection("6a", all_doors["6a_02b_top"], all_doors["6a_04_south"]), + "6a_04_north-west---6a_04b_east": RoomConnection("6a", all_doors["6a_04_north-west"], all_doors["6a_04b_east"]), + "6a_04_south-east---6a_04d_west": RoomConnection("6a", all_doors["6a_04_south-east"], all_doors["6a_04d_west"]), + "6a_04_east---6a_05_west": RoomConnection("6a", all_doors["6a_04_east"], all_doors["6a_05_west"]), + "6a_04_south-west---6a_04e_east": RoomConnection("6a", all_doors["6a_04_south-west"], all_doors["6a_04e_east"]), + "6a_04b_west---6a_04c_east": RoomConnection("6a", all_doors["6a_04b_west"], all_doors["6a_04c_east"]), + "6a_05_east---6a_06_west": RoomConnection("6a", all_doors["6a_05_east"], all_doors["6a_06_west"]), + "6a_06_east---6a_07_west": RoomConnection("6a", all_doors["6a_06_east"], all_doors["6a_07_west"]), + "6a_07_east---6a_08a_west": RoomConnection("6a", all_doors["6a_07_east"], all_doors["6a_08a_west"]), + "6a_07_north-east---6a_08b_west": RoomConnection("6a", all_doors["6a_07_north-east"], all_doors["6a_08b_west"]), + "6a_08a_east---6a_09_west": RoomConnection("6a", all_doors["6a_08a_east"], all_doors["6a_09_west"]), + "6a_08b_east---6a_09_north-west": RoomConnection("6a", all_doors["6a_08b_east"], all_doors["6a_09_north-west"]), + "6a_09_east---6a_10a_west": RoomConnection("6a", all_doors["6a_09_east"], all_doors["6a_10a_west"]), + "6a_09_north-east---6a_10b_west": RoomConnection("6a", all_doors["6a_09_north-east"], all_doors["6a_10b_west"]), + "6a_10a_east---6a_11_west": RoomConnection("6a", all_doors["6a_10a_east"], all_doors["6a_11_west"]), + "6a_10b_east---6a_11_north-west": RoomConnection("6a", all_doors["6a_10b_east"], all_doors["6a_11_north-west"]), + "6a_11_east---6a_12a_west": RoomConnection("6a", all_doors["6a_11_east"], all_doors["6a_12a_west"]), + "6a_11_north-east---6a_12b_west": RoomConnection("6a", all_doors["6a_11_north-east"], all_doors["6a_12b_west"]), + "6a_12a_east---6a_13_west": RoomConnection("6a", all_doors["6a_12a_east"], all_doors["6a_13_west"]), + "6a_12b_east---6a_13_north-west": RoomConnection("6a", all_doors["6a_12b_east"], all_doors["6a_13_north-west"]), + "6a_13_east---6a_14a_west": RoomConnection("6a", all_doors["6a_13_east"], all_doors["6a_14a_west"]), + "6a_13_north-east---6a_14b_west": RoomConnection("6a", all_doors["6a_13_north-east"], all_doors["6a_14b_west"]), + "6a_14a_east---6a_15_west": RoomConnection("6a", all_doors["6a_14a_east"], all_doors["6a_15_west"]), + "6a_14b_east---6a_15_north-west": RoomConnection("6a", all_doors["6a_14b_east"], all_doors["6a_15_north-west"]), + "6a_15_east---6a_16a_west": RoomConnection("6a", all_doors["6a_15_east"], all_doors["6a_16a_west"]), + "6a_15_north-east---6a_16b_west": RoomConnection("6a", all_doors["6a_15_north-east"], all_doors["6a_16b_west"]), + "6a_16a_east---6a_17_west": RoomConnection("6a", all_doors["6a_16a_east"], all_doors["6a_17_west"]), + "6a_16b_east---6a_17_north-west": RoomConnection("6a", all_doors["6a_16b_east"], all_doors["6a_17_north-west"]), + "6a_17_east---6a_18a_west": RoomConnection("6a", all_doors["6a_17_east"], all_doors["6a_18a_west"]), + "6a_17_north-east---6a_18b_west": RoomConnection("6a", all_doors["6a_17_north-east"], all_doors["6a_18b_west"]), + "6a_18a_east---6a_19_west": RoomConnection("6a", all_doors["6a_18a_east"], all_doors["6a_19_west"]), + "6a_18b_east---6a_19_north-west": RoomConnection("6a", all_doors["6a_18b_east"], all_doors["6a_19_north-west"]), + "6a_19_east---6a_20_west": RoomConnection("6a", all_doors["6a_19_east"], all_doors["6a_20_west"]), + "6a_20_east---6a_b-00_west": RoomConnection("6a", all_doors["6a_20_east"], all_doors["6a_b-00_west"]), + "6a_b-00_east---6a_b-01_west": RoomConnection("6a", all_doors["6a_b-00_east"], all_doors["6a_b-01_west"]), + "6a_b-00_top---6a_b-00b_bottom": RoomConnection("6a", all_doors["6a_b-00_top"], all_doors["6a_b-00b_bottom"]), + "6a_b-00b_top---6a_b-00c_east": RoomConnection("6a", all_doors["6a_b-00b_top"], all_doors["6a_b-00c_east"]), + "6a_b-01_east---6a_b-02_top": RoomConnection("6a", all_doors["6a_b-01_east"], all_doors["6a_b-02_top"]), + "6a_b-02_bottom---6a_b-02b_top": RoomConnection("6a", all_doors["6a_b-02_bottom"], all_doors["6a_b-02b_top"]), + "6a_b-02b_bottom---6a_b-03_west": RoomConnection("6a", all_doors["6a_b-02b_bottom"], all_doors["6a_b-03_west"]), + "6a_b-03_east---6a_boss-00_west": RoomConnection("6a", all_doors["6a_b-03_east"], all_doors["6a_boss-00_west"]), + "6a_boss-00_east---6a_boss-01_west": RoomConnection("6a", all_doors["6a_boss-00_east"], all_doors["6a_boss-01_west"]), + "6a_boss-01_east---6a_boss-02_west": RoomConnection("6a", all_doors["6a_boss-01_east"], all_doors["6a_boss-02_west"]), + "6a_boss-02_east---6a_boss-03_west": RoomConnection("6a", all_doors["6a_boss-02_east"], all_doors["6a_boss-03_west"]), + "6a_boss-03_east---6a_boss-04_west": RoomConnection("6a", all_doors["6a_boss-03_east"], all_doors["6a_boss-04_west"]), + "6a_boss-04_east---6a_boss-05_west": RoomConnection("6a", all_doors["6a_boss-04_east"], all_doors["6a_boss-05_west"]), + "6a_boss-05_east---6a_boss-06_west": RoomConnection("6a", all_doors["6a_boss-05_east"], all_doors["6a_boss-06_west"]), + "6a_boss-06_east---6a_boss-07_west": RoomConnection("6a", all_doors["6a_boss-06_east"], all_doors["6a_boss-07_west"]), + "6a_boss-07_east---6a_boss-08_west": RoomConnection("6a", all_doors["6a_boss-07_east"], all_doors["6a_boss-08_west"]), + "6a_boss-08_east---6a_boss-09_west": RoomConnection("6a", all_doors["6a_boss-08_east"], all_doors["6a_boss-09_west"]), + "6a_boss-09_east---6a_boss-10_west": RoomConnection("6a", all_doors["6a_boss-09_east"], all_doors["6a_boss-10_west"]), + "6a_boss-10_east---6a_boss-11_west": RoomConnection("6a", all_doors["6a_boss-10_east"], all_doors["6a_boss-11_west"]), + "6a_boss-11_east---6a_boss-12_west": RoomConnection("6a", all_doors["6a_boss-11_east"], all_doors["6a_boss-12_west"]), + "6a_boss-12_east---6a_boss-13_west": RoomConnection("6a", all_doors["6a_boss-12_east"], all_doors["6a_boss-13_west"]), + "6a_boss-13_east---6a_boss-14_west": RoomConnection("6a", all_doors["6a_boss-13_east"], all_doors["6a_boss-14_west"]), + "6a_boss-14_east---6a_boss-15_west": RoomConnection("6a", all_doors["6a_boss-14_east"], all_doors["6a_boss-15_west"]), + "6a_boss-15_east---6a_boss-16_west": RoomConnection("6a", all_doors["6a_boss-15_east"], all_doors["6a_boss-16_west"]), + "6a_boss-16_east---6a_boss-17_west": RoomConnection("6a", all_doors["6a_boss-16_east"], all_doors["6a_boss-17_west"]), + "6a_boss-17_east---6a_boss-18_west": RoomConnection("6a", all_doors["6a_boss-17_east"], all_doors["6a_boss-18_west"]), + "6a_boss-18_east---6a_boss-19_west": RoomConnection("6a", all_doors["6a_boss-18_east"], all_doors["6a_boss-19_west"]), + "6a_boss-19_east---6a_boss-20_west": RoomConnection("6a", all_doors["6a_boss-19_east"], all_doors["6a_boss-20_west"]), + "6a_boss-20_east---6a_after-00_bottom": RoomConnection("6a", all_doors["6a_boss-20_east"], all_doors["6a_after-00_bottom"]), + "6a_after-00_top---6a_after-01_bottom": RoomConnection("6a", all_doors["6a_after-00_top"], all_doors["6a_after-01_bottom"]), + + "6b_a-00_top---6b_a-01_bottom": RoomConnection("6b", all_doors["6b_a-00_top"], all_doors["6b_a-01_bottom"]), + "6b_a-01_top---6b_a-02_bottom": RoomConnection("6b", all_doors["6b_a-01_top"], all_doors["6b_a-02_bottom"]), + "6b_a-02_top---6b_a-03_west": RoomConnection("6b", all_doors["6b_a-02_top"], all_doors["6b_a-03_west"]), + "6b_a-03_east---6b_a-04_west": RoomConnection("6b", all_doors["6b_a-03_east"], all_doors["6b_a-04_west"]), + "6b_a-04_east---6b_a-05_west": RoomConnection("6b", all_doors["6b_a-04_east"], all_doors["6b_a-05_west"]), + "6b_a-05_east---6b_a-06_west": RoomConnection("6b", all_doors["6b_a-05_east"], all_doors["6b_a-06_west"]), + "6b_a-06_east---6b_b-00_west": RoomConnection("6b", all_doors["6b_a-06_east"], all_doors["6b_b-00_west"]), + "6b_b-00_east---6b_b-01_top": RoomConnection("6b", all_doors["6b_b-00_east"], all_doors["6b_b-01_top"]), + "6b_b-01_bottom---6b_b-02_top": RoomConnection("6b", all_doors["6b_b-01_bottom"], all_doors["6b_b-02_top"]), + "6b_b-02_bottom---6b_b-03_top": RoomConnection("6b", all_doors["6b_b-02_bottom"], all_doors["6b_b-03_top"]), + "6b_b-03_bottom---6b_b-04_top": RoomConnection("6b", all_doors["6b_b-03_bottom"], all_doors["6b_b-04_top"]), + "6b_b-04_bottom---6b_b-05_top": RoomConnection("6b", all_doors["6b_b-04_bottom"], all_doors["6b_b-05_top"]), + "6b_b-05_bottom---6b_b-06_top": RoomConnection("6b", all_doors["6b_b-05_bottom"], all_doors["6b_b-06_top"]), + "6b_b-06_bottom---6b_b-07_top": RoomConnection("6b", all_doors["6b_b-06_bottom"], all_doors["6b_b-07_top"]), + "6b_b-07_bottom---6b_b-08_top": RoomConnection("6b", all_doors["6b_b-07_bottom"], all_doors["6b_b-08_top"]), + "6b_b-08_bottom---6b_b-10_west": RoomConnection("6b", all_doors["6b_b-08_bottom"], all_doors["6b_b-10_west"]), + "6b_b-10_east---6b_c-00_west": RoomConnection("6b", all_doors["6b_b-10_east"], all_doors["6b_c-00_west"]), + "6b_c-00_east---6b_c-01_west": RoomConnection("6b", all_doors["6b_c-00_east"], all_doors["6b_c-01_west"]), + "6b_c-01_east---6b_c-02_west": RoomConnection("6b", all_doors["6b_c-01_east"], all_doors["6b_c-02_west"]), + "6b_c-02_east---6b_c-03_west": RoomConnection("6b", all_doors["6b_c-02_east"], all_doors["6b_c-03_west"]), + "6b_c-03_east---6b_c-04_west": RoomConnection("6b", all_doors["6b_c-03_east"], all_doors["6b_c-04_west"]), + "6b_c-04_east---6b_d-00_west": RoomConnection("6b", all_doors["6b_c-04_east"], all_doors["6b_d-00_west"]), + "6b_d-00_east---6b_d-01_west": RoomConnection("6b", all_doors["6b_d-00_east"], all_doors["6b_d-01_west"]), + "6b_d-01_east---6b_d-02_west": RoomConnection("6b", all_doors["6b_d-01_east"], all_doors["6b_d-02_west"]), + "6b_d-02_east---6b_d-03_west": RoomConnection("6b", all_doors["6b_d-02_east"], all_doors["6b_d-03_west"]), + "6b_d-03_east---6b_d-04_west": RoomConnection("6b", all_doors["6b_d-03_east"], all_doors["6b_d-04_west"]), + "6b_d-04_east---6b_d-05_west": RoomConnection("6b", all_doors["6b_d-04_east"], all_doors["6b_d-05_west"]), + + "6c_00_east---6c_01_west": RoomConnection("6c", all_doors["6c_00_east"], all_doors["6c_01_west"]), + "6c_01_east---6c_02_west": RoomConnection("6c", all_doors["6c_01_east"], all_doors["6c_02_west"]), + + "7a_a-00_east---7a_a-01_west": RoomConnection("7a", all_doors["7a_a-00_east"], all_doors["7a_a-01_west"]), + "7a_a-01_east---7a_a-02_west": RoomConnection("7a", all_doors["7a_a-01_east"], all_doors["7a_a-02_west"]), + "7a_a-02_north---7a_a-02b_east": RoomConnection("7a", all_doors["7a_a-02_north"], all_doors["7a_a-02b_east"]), + "7a_a-02b_west---7a_a-02_north-west": RoomConnection("7a", all_doors["7a_a-02b_west"], all_doors["7a_a-02_north-west"]), + "7a_a-02_east---7a_a-03_west": RoomConnection("7a", all_doors["7a_a-02_east"], all_doors["7a_a-03_west"]), + "7a_a-03_east---7a_a-04_west": RoomConnection("7a", all_doors["7a_a-03_east"], all_doors["7a_a-04_west"]), + "7a_a-04_north---7a_a-04b_east": RoomConnection("7a", all_doors["7a_a-04_north"], all_doors["7a_a-04b_east"]), + "7a_a-04_east---7a_a-05_west": RoomConnection("7a", all_doors["7a_a-04_east"], all_doors["7a_a-05_west"]), + "7a_a-05_east---7a_a-06_bottom": RoomConnection("7a", all_doors["7a_a-05_east"], all_doors["7a_a-06_bottom"]), + "7a_a-06_top---7a_b-00_bottom": RoomConnection("7a", all_doors["7a_a-06_top"], all_doors["7a_b-00_bottom"]), + "7a_b-00_top---7a_b-01_west": RoomConnection("7a", all_doors["7a_b-00_top"], all_doors["7a_b-01_west"]), + "7a_b-01_east---7a_b-02_south": RoomConnection("7a", all_doors["7a_b-01_east"], all_doors["7a_b-02_south"]), + "7a_b-02_north-west---7a_b-02b_south": RoomConnection("7a", all_doors["7a_b-02_north-west"], all_doors["7a_b-02b_south"]), + "7a_b-02_north---7a_b-02d_south": RoomConnection("7a", all_doors["7a_b-02_north"], all_doors["7a_b-02d_south"]), + "7a_b-02_north-east---7a_b-03_west": RoomConnection("7a", all_doors["7a_b-02_north-east"], all_doors["7a_b-03_west"]), + "7a_b-02b_north-west---7a_b-02e_east": RoomConnection("7a", all_doors["7a_b-02b_north-west"], all_doors["7a_b-02e_east"]), + "7a_b-02b_north-east---7a_b-02c_west": RoomConnection("7a", all_doors["7a_b-02b_north-east"], all_doors["7a_b-02c_west"]), + "7a_b-02c_east---7a_b-05_north-west": RoomConnection("7a", all_doors["7a_b-02c_east"], all_doors["7a_b-05_north-west"]), + "7a_b-02c_south-east---7a_b-02d_north": RoomConnection("7a", all_doors["7a_b-02c_south-east"], all_doors["7a_b-02d_north"]), + "7a_b-03_east---7a_b-04_west": RoomConnection("7a", all_doors["7a_b-03_east"], all_doors["7a_b-04_west"]), + "7a_b-03_north---7a_b-05_west": RoomConnection("7a", all_doors["7a_b-03_north"], all_doors["7a_b-05_west"]), + "7a_b-05_east---7a_b-06_west": RoomConnection("7a", all_doors["7a_b-05_east"], all_doors["7a_b-06_west"]), + "7a_b-06_east---7a_b-07_west": RoomConnection("7a", all_doors["7a_b-06_east"], all_doors["7a_b-07_west"]), + "7a_b-07_east---7a_b-08_west": RoomConnection("7a", all_doors["7a_b-07_east"], all_doors["7a_b-08_west"]), + "7a_b-08_east---7a_b-09_bottom": RoomConnection("7a", all_doors["7a_b-08_east"], all_doors["7a_b-09_bottom"]), + "7a_b-09_top---7a_c-00_west": RoomConnection("7a", all_doors["7a_b-09_top"], all_doors["7a_c-00_west"]), + "7a_c-00_east---7a_c-01_bottom": RoomConnection("7a", all_doors["7a_c-00_east"], all_doors["7a_c-01_bottom"]), + "7a_c-01_top---7a_c-02_bottom": RoomConnection("7a", all_doors["7a_c-01_top"], all_doors["7a_c-02_bottom"]), + "7a_c-02_top---7a_c-03_south": RoomConnection("7a", all_doors["7a_c-02_top"], all_doors["7a_c-03_south"]), + "7a_c-03_west---7a_c-03b_east": RoomConnection("7a", all_doors["7a_c-03_west"], all_doors["7a_c-03b_east"]), + "7a_c-03_east---7a_c-04_west": RoomConnection("7a", all_doors["7a_c-03_east"], all_doors["7a_c-04_west"]), + "7a_c-04_north-west---7a_c-06_south": RoomConnection("7a", all_doors["7a_c-04_north-west"], all_doors["7a_c-06_south"]), + "7a_c-04_north-east---7a_c-06b_south": RoomConnection("7a", all_doors["7a_c-04_north-east"], all_doors["7a_c-06b_south"]), + "7a_c-04_east---7a_c-05_west": RoomConnection("7a", all_doors["7a_c-04_east"], all_doors["7a_c-05_west"]), + "7a_c-06_east---7a_c-06b_west": RoomConnection("7a", all_doors["7a_c-06_east"], all_doors["7a_c-06b_west"]), + "7a_c-06_north---7a_c-07_south-west": RoomConnection("7a", all_doors["7a_c-06_north"], all_doors["7a_c-07_south-west"]), + "7a_c-06b_east---7a_c-06c_west": RoomConnection("7a", all_doors["7a_c-06b_east"], all_doors["7a_c-06c_west"]), + "7a_c-06b_north---7a_c-07_south-east": RoomConnection("7a", all_doors["7a_c-06b_north"], all_doors["7a_c-07_south-east"]), + "7a_c-07_west---7a_c-07b_east": RoomConnection("7a", all_doors["7a_c-07_west"], all_doors["7a_c-07b_east"]), + "7a_c-07_east---7a_c-08_west": RoomConnection("7a", all_doors["7a_c-07_east"], all_doors["7a_c-08_west"]), + "7a_c-08_east---7a_c-09_bottom": RoomConnection("7a", all_doors["7a_c-08_east"], all_doors["7a_c-09_bottom"]), + "7a_c-09_top---7a_d-00_bottom": RoomConnection("7a", all_doors["7a_c-09_top"], all_doors["7a_d-00_bottom"]), + "7a_d-00_top---7a_d-01_west": RoomConnection("7a", all_doors["7a_d-00_top"], all_doors["7a_d-01_west"]), + "7a_d-01_east---7a_d-01b_west": RoomConnection("7a", all_doors["7a_d-01_east"], all_doors["7a_d-01b_west"]), + "7a_d-01b_east---7a_d-02_west": RoomConnection("7a", all_doors["7a_d-01b_east"], all_doors["7a_d-02_west"]), + "7a_d-01b_south-west---7a_d-01c_west": RoomConnection("7a", all_doors["7a_d-01b_south-west"], all_doors["7a_d-01c_west"]), + "7a_d-01c_south---7a_d-01d_west": RoomConnection("7a", all_doors["7a_d-01c_south"], all_doors["7a_d-01d_west"]), + "7a_d-01c_east---7a_d-01b_south-east": RoomConnection("7a", all_doors["7a_d-01c_east"], all_doors["7a_d-01b_south-east"]), + "7a_d-01d_east---7a_d-01c_south-east": RoomConnection("7a", all_doors["7a_d-01d_east"], all_doors["7a_d-01c_south-east"]), + "7a_d-02_east---7a_d-03_west": RoomConnection("7a", all_doors["7a_d-02_east"], all_doors["7a_d-03_west"]), + "7a_d-03_east---7a_d-04_west": RoomConnection("7a", all_doors["7a_d-03_east"], all_doors["7a_d-04_west"]), + "7a_d-03_north-east---7a_d-03b_east": RoomConnection("7a", all_doors["7a_d-03_north-east"], all_doors["7a_d-03b_east"]), + "7a_d-03b_west---7a_d-03_north-west": RoomConnection("7a", all_doors["7a_d-03b_west"], all_doors["7a_d-03_north-west"]), + "7a_d-04_east---7a_d-05_west": RoomConnection("7a", all_doors["7a_d-04_east"], all_doors["7a_d-05_west"]), + "7a_d-05_east---7a_d-05b_west": RoomConnection("7a", all_doors["7a_d-05_east"], all_doors["7a_d-05b_west"]), + "7a_d-05_north-east---7a_d-06_south-west": RoomConnection("7a", all_doors["7a_d-05_north-east"], all_doors["7a_d-06_south-west"]), + "7a_d-06_west---7a_d-07_east": RoomConnection("7a", all_doors["7a_d-06_west"], all_doors["7a_d-07_east"]), + "7a_d-06_south-east---7a_d-08_west": RoomConnection("7a", all_doors["7a_d-06_south-east"], all_doors["7a_d-08_west"]), + "7a_d-06_east---7a_d-09_west": RoomConnection("7a", all_doors["7a_d-06_east"], all_doors["7a_d-09_west"]), + "7a_d-08_east---7a_d-10_west": RoomConnection("7a", all_doors["7a_d-08_east"], all_doors["7a_d-10_west"]), + "7a_d-09_east---7a_d-10_north-west": RoomConnection("7a", all_doors["7a_d-09_east"], all_doors["7a_d-10_north-west"]), + "7a_d-10_north-east---7a_d-10b_east": RoomConnection("7a", all_doors["7a_d-10_north-east"], all_doors["7a_d-10b_east"]), + "7a_d-10_east---7a_d-11_bottom": RoomConnection("7a", all_doors["7a_d-10_east"], all_doors["7a_d-11_bottom"]), + "7a_d-10b_west---7a_d-10_north": RoomConnection("7a", all_doors["7a_d-10b_west"], all_doors["7a_d-10_north"]), + "7a_d-11_top---7a_e-00b_bottom": RoomConnection("7a", all_doors["7a_d-11_top"], all_doors["7a_e-00b_bottom"]), + "7a_e-00b_top---7a_e-00_south-west": RoomConnection("7a", all_doors["7a_e-00b_top"], all_doors["7a_e-00_south-west"]), + "7a_e-00_west---7a_e-01_east": RoomConnection("7a", all_doors["7a_e-00_west"], all_doors["7a_e-01_east"]), + "7a_e-00_north-west---7a_e-02_west": RoomConnection("7a", all_doors["7a_e-00_north-west"], all_doors["7a_e-02_west"]), + "7a_e-00_east---7a_e-03_south-west": RoomConnection("7a", all_doors["7a_e-00_east"], all_doors["7a_e-03_south-west"]), + "7a_e-01_west---7a_e-01b_east": RoomConnection("7a", all_doors["7a_e-01_west"], all_doors["7a_e-01b_east"]), + "7a_e-01b_west---7a_e-01c_west": RoomConnection("7a", all_doors["7a_e-01b_west"], all_doors["7a_e-01c_west"]), + "7a_e-01c_east---7a_e-01_north": RoomConnection("7a", all_doors["7a_e-01c_east"], all_doors["7a_e-01_north"]), + "7a_e-02_east---7a_e-03_west": RoomConnection("7a", all_doors["7a_e-02_east"], all_doors["7a_e-03_west"]), + "7a_e-03_east---7a_e-04_west": RoomConnection("7a", all_doors["7a_e-03_east"], all_doors["7a_e-04_west"]), + "7a_e-04_east---7a_e-05_west": RoomConnection("7a", all_doors["7a_e-04_east"], all_doors["7a_e-05_west"]), + "7a_e-05_east---7a_e-06_west": RoomConnection("7a", all_doors["7a_e-05_east"], all_doors["7a_e-06_west"]), + "7a_e-06_east---7a_e-07_bottom": RoomConnection("7a", all_doors["7a_e-06_east"], all_doors["7a_e-07_bottom"]), + "7a_e-07_top---7a_e-08_south": RoomConnection("7a", all_doors["7a_e-07_top"], all_doors["7a_e-08_south"]), + "7a_e-08_west---7a_e-09_east": RoomConnection("7a", all_doors["7a_e-08_west"], all_doors["7a_e-09_east"]), + "7a_e-08_east---7a_e-10_south": RoomConnection("7a", all_doors["7a_e-08_east"], all_doors["7a_e-10_south"]), + "7a_e-09_north---7a_e-11_south": RoomConnection("7a", all_doors["7a_e-09_north"], all_doors["7a_e-11_south"]), + "7a_e-11_north---7a_e-12_west": RoomConnection("7a", all_doors["7a_e-11_north"], all_doors["7a_e-12_west"]), + "7a_e-11_east---7a_e-10_north": RoomConnection("7a", all_doors["7a_e-11_east"], all_doors["7a_e-10_north"]), + "7a_e-10_east---7a_e-10b_west": RoomConnection("7a", all_doors["7a_e-10_east"], all_doors["7a_e-10b_west"]), + "7a_e-10b_east---7a_e-13_bottom": RoomConnection("7a", all_doors["7a_e-10b_east"], all_doors["7a_e-13_bottom"]), + "7a_e-13_top---7a_f-00_south": RoomConnection("7a", all_doors["7a_e-13_top"], all_doors["7a_f-00_south"]), + "7a_f-00_west---7a_f-01_south": RoomConnection("7a", all_doors["7a_f-00_west"], all_doors["7a_f-01_south"]), + "7a_f-00_east---7a_f-02_west": RoomConnection("7a", all_doors["7a_f-00_east"], all_doors["7a_f-02_west"]), + "7a_f-00_north-east---7a_f-02_north-west": RoomConnection("7a", all_doors["7a_f-00_north-east"], all_doors["7a_f-02_north-west"]), + "7a_f-01_north---7a_f-00_north-west": RoomConnection("7a", all_doors["7a_f-01_north"], all_doors["7a_f-00_north-west"]), + "7a_f-02_north-east---7a_f-02b_west": RoomConnection("7a", all_doors["7a_f-02_north-east"], all_doors["7a_f-02b_west"]), + "7a_f-02_east---7a_f-04_west": RoomConnection("7a", all_doors["7a_f-02_east"], all_doors["7a_f-04_west"]), + "7a_f-02b_east---7a_f-07_west": RoomConnection("7a", all_doors["7a_f-02b_east"], all_doors["7a_f-07_west"]), + "7a_f-04_east---7a_f-03_west": RoomConnection("7a", all_doors["7a_f-04_east"], all_doors["7a_f-03_west"]), + "7a_f-03_east---7a_f-05_west": RoomConnection("7a", all_doors["7a_f-03_east"], all_doors["7a_f-05_west"]), + "7a_f-05_east---7a_f-08_west": RoomConnection("7a", all_doors["7a_f-05_east"], all_doors["7a_f-08_west"]), + "7a_f-05_south-west---7a_f-06_north-west": RoomConnection("7a", all_doors["7a_f-05_south-west"], all_doors["7a_f-06_north-west"]), + "7a_f-05_south---7a_f-06_north": RoomConnection("7a", all_doors["7a_f-05_south"], all_doors["7a_f-06_north"]), + "7a_f-05_south-east---7a_f-06_north-east": RoomConnection("7a", all_doors["7a_f-05_south-east"], all_doors["7a_f-06_north-east"]), + "7a_f-05_north-west---7a_f-07_south-west": RoomConnection("7a", all_doors["7a_f-05_north-west"], all_doors["7a_f-07_south-west"]), + "7a_f-05_north---7a_f-07_south": RoomConnection("7a", all_doors["7a_f-05_north"], all_doors["7a_f-07_south"]), + "7a_f-05_north-east---7a_f-07_south-east": RoomConnection("7a", all_doors["7a_f-05_north-east"], all_doors["7a_f-07_south-east"]), + "7a_f-08_north-west---7a_f-08b_west": RoomConnection("7a", all_doors["7a_f-08_north-west"], all_doors["7a_f-08b_west"]), + "7a_f-08_east---7a_f-09_west": RoomConnection("7a", all_doors["7a_f-08_east"], all_doors["7a_f-09_west"]), + "7a_f-09_east---7a_f-10_west": RoomConnection("7a", all_doors["7a_f-09_east"], all_doors["7a_f-10_west"]), + "7a_f-08b_east---7a_f-08d_west": RoomConnection("7a", all_doors["7a_f-08b_east"], all_doors["7a_f-08d_west"]), + "7a_f-08d_east---7a_f-08c_west": RoomConnection("7a", all_doors["7a_f-08d_east"], all_doors["7a_f-08c_west"]), + "7a_f-08c_east---7a_f-10_north-east": RoomConnection("7a", all_doors["7a_f-08c_east"], all_doors["7a_f-10_north-east"]), + "7a_f-10_east---7a_f-10b_west": RoomConnection("7a", all_doors["7a_f-10_east"], all_doors["7a_f-10b_west"]), + "7a_f-10b_east---7a_f-11_bottom": RoomConnection("7a", all_doors["7a_f-10b_east"], all_doors["7a_f-11_bottom"]), + "7a_f-11_top---7a_g-00_bottom": RoomConnection("7a", all_doors["7a_f-11_top"], all_doors["7a_g-00_bottom"]), + "7a_g-00_top---7a_g-00b_bottom": RoomConnection("7a", all_doors["7a_g-00_top"], all_doors["7a_g-00b_bottom"]), + "7a_g-00b_top---7a_g-01_bottom": RoomConnection("7a", all_doors["7a_g-00b_top"], all_doors["7a_g-01_bottom"]), + "7a_g-01_top---7a_g-02_bottom": RoomConnection("7a", all_doors["7a_g-01_top"], all_doors["7a_g-02_bottom"]), + "7a_g-02_top---7a_g-03_bottom": RoomConnection("7a", all_doors["7a_g-02_top"], all_doors["7a_g-03_bottom"]), + + "7b_a-00_east---7b_a-01_west": RoomConnection("7b", all_doors["7b_a-00_east"], all_doors["7b_a-01_west"]), + "7b_a-01_east---7b_a-02_west": RoomConnection("7b", all_doors["7b_a-01_east"], all_doors["7b_a-02_west"]), + "7b_a-02_east---7b_a-03_bottom": RoomConnection("7b", all_doors["7b_a-02_east"], all_doors["7b_a-03_bottom"]), + "7b_a-03_top---7b_b-00_bottom": RoomConnection("7b", all_doors["7b_a-03_top"], all_doors["7b_b-00_bottom"]), + "7b_b-00_top---7b_b-01_bottom": RoomConnection("7b", all_doors["7b_b-00_top"], all_doors["7b_b-01_bottom"]), + "7b_b-01_top---7b_b-02_west": RoomConnection("7b", all_doors["7b_b-01_top"], all_doors["7b_b-02_west"]), + "7b_b-02_east---7b_b-03_bottom": RoomConnection("7b", all_doors["7b_b-02_east"], all_doors["7b_b-03_bottom"]), + "7b_b-03_top---7b_c-01_west": RoomConnection("7b", all_doors["7b_b-03_top"], all_doors["7b_c-01_west"]), + "7b_c-01_east---7b_c-00_west": RoomConnection("7b", all_doors["7b_c-01_east"], all_doors["7b_c-00_west"]), + "7b_c-00_east---7b_c-02_west": RoomConnection("7b", all_doors["7b_c-00_east"], all_doors["7b_c-02_west"]), + "7b_c-02_east---7b_c-03_bottom": RoomConnection("7b", all_doors["7b_c-02_east"], all_doors["7b_c-03_bottom"]), + "7b_c-03_top---7b_d-00_west": RoomConnection("7b", all_doors["7b_c-03_top"], all_doors["7b_d-00_west"]), + "7b_d-00_east---7b_d-01_west": RoomConnection("7b", all_doors["7b_d-00_east"], all_doors["7b_d-01_west"]), + "7b_d-01_east---7b_d-02_west": RoomConnection("7b", all_doors["7b_d-01_east"], all_doors["7b_d-02_west"]), + "7b_d-02_east---7b_d-03_bottom": RoomConnection("7b", all_doors["7b_d-02_east"], all_doors["7b_d-03_bottom"]), + "7b_d-03_top---7b_e-00_west": RoomConnection("7b", all_doors["7b_d-03_top"], all_doors["7b_e-00_west"]), + "7b_e-00_east---7b_e-01_west": RoomConnection("7b", all_doors["7b_e-00_east"], all_doors["7b_e-01_west"]), + "7b_e-01_east---7b_e-02_west": RoomConnection("7b", all_doors["7b_e-01_east"], all_doors["7b_e-02_west"]), + "7b_e-02_east---7b_e-03_bottom": RoomConnection("7b", all_doors["7b_e-02_east"], all_doors["7b_e-03_bottom"]), + "7b_e-03_top---7b_f-00_west": RoomConnection("7b", all_doors["7b_e-03_top"], all_doors["7b_f-00_west"]), + "7b_f-00_east---7b_f-01_west": RoomConnection("7b", all_doors["7b_f-00_east"], all_doors["7b_f-01_west"]), + "7b_f-01_east---7b_f-02_west": RoomConnection("7b", all_doors["7b_f-01_east"], all_doors["7b_f-02_west"]), + "7b_f-02_east---7b_f-03_bottom": RoomConnection("7b", all_doors["7b_f-02_east"], all_doors["7b_f-03_bottom"]), + "7b_f-03_top---7b_g-00_bottom": RoomConnection("7b", all_doors["7b_f-03_top"], all_doors["7b_g-00_bottom"]), + "7b_g-00_top---7b_g-01_bottom": RoomConnection("7b", all_doors["7b_g-00_top"], all_doors["7b_g-01_bottom"]), + "7b_g-01_top---7b_g-02_bottom": RoomConnection("7b", all_doors["7b_g-01_top"], all_doors["7b_g-02_bottom"]), + "7b_g-02_top---7b_g-03_bottom": RoomConnection("7b", all_doors["7b_g-02_top"], all_doors["7b_g-03_bottom"]), + + "7c_01_east---7c_02_west": RoomConnection("7c", all_doors["7c_01_east"], all_doors["7c_02_west"]), + "7c_02_east---7c_03_west": RoomConnection("7c", all_doors["7c_02_east"], all_doors["7c_03_west"]), + + "8a_outside_east---8a_bridge_west": RoomConnection("8a", all_doors["8a_outside_east"], all_doors["8a_bridge_west"]), + "8a_bridge_east---8a_secret_west": RoomConnection("8a", all_doors["8a_bridge_east"], all_doors["8a_secret_west"]), + + "9a_00_east---9a_01_west": RoomConnection("9a", all_doors["9a_00_east"], all_doors["9a_01_west"]), + "9a_00_west---9a_0x_east": RoomConnection("9a", all_doors["9a_00_west"], all_doors["9a_0x_east"]), + "9a_01_east---9a_02_west": RoomConnection("9a", all_doors["9a_01_east"], all_doors["9a_02_west"]), + "9a_02_east---9a_a-00_west": RoomConnection("9a", all_doors["9a_02_east"], all_doors["9a_a-00_west"]), + "9a_a-00_east---9a_a-01_west": RoomConnection("9a", all_doors["9a_a-00_east"], all_doors["9a_a-01_west"]), + "9a_a-01_east---9a_a-02_west": RoomConnection("9a", all_doors["9a_a-01_east"], all_doors["9a_a-02_west"]), + "9a_a-02_east---9a_a-03_bottom": RoomConnection("9a", all_doors["9a_a-02_east"], all_doors["9a_a-03_bottom"]), + "9a_a-03_top---9a_b-00_south": RoomConnection("9a", all_doors["9a_a-03_top"], all_doors["9a_b-00_south"]), + "9a_b-00_west---9a_b-06_east": RoomConnection("9a", all_doors["9a_b-00_west"], all_doors["9a_b-06_east"]), + "9a_b-00_east---9a_b-01_west": RoomConnection("9a", all_doors["9a_b-00_east"], all_doors["9a_b-01_west"]), + "9a_b-00_north---9a_b-07b_bottom": RoomConnection("9a", all_doors["9a_b-00_north"], all_doors["9a_b-07b_bottom"]), + "9a_b-01_east---9a_b-02_west": RoomConnection("9a", all_doors["9a_b-01_east"], all_doors["9a_b-02_west"]), + "9a_b-02_east---9a_b-03_west": RoomConnection("9a", all_doors["9a_b-02_east"], all_doors["9a_b-03_west"]), + "9a_b-03_east---9a_b-04_west": RoomConnection("9a", all_doors["9a_b-03_east"], all_doors["9a_b-04_west"]), + "9a_b-04_east---9a_b-05_east": RoomConnection("9a", all_doors["9a_b-04_east"], all_doors["9a_b-05_east"]), + "9a_b-05_west---9a_b-04_north-west": RoomConnection("9a", all_doors["9a_b-05_west"], all_doors["9a_b-04_north-west"]), + "9a_b-07b_top---9a_b-07_bottom": RoomConnection("9a", all_doors["9a_b-07b_top"], all_doors["9a_b-07_bottom"]), + "9a_b-07_top---9a_c-00_west": RoomConnection("9a", all_doors["9a_b-07_top"], all_doors["9a_c-00_west"]), + "9a_c-00_north-east---9a_c-00b_west": RoomConnection("9a", all_doors["9a_c-00_north-east"], all_doors["9a_c-00b_west"]), + "9a_c-00_east---9a_c-01_west": RoomConnection("9a", all_doors["9a_c-00_east"], all_doors["9a_c-01_west"]), + "9a_c-01_east---9a_c-02_west": RoomConnection("9a", all_doors["9a_c-01_east"], all_doors["9a_c-02_west"]), + "9a_c-02_east---9a_c-03_west": RoomConnection("9a", all_doors["9a_c-02_east"], all_doors["9a_c-03_west"]), + "9a_c-03_east---9a_c-04_west": RoomConnection("9a", all_doors["9a_c-03_east"], all_doors["9a_c-04_west"]), + "9a_c-03_north---9a_c-03b_south": RoomConnection("9a", all_doors["9a_c-03_north"], all_doors["9a_c-03b_south"]), + "9a_c-03b_west---9a_c-03_north-west": RoomConnection("9a", all_doors["9a_c-03b_west"], all_doors["9a_c-03_north-west"]), + "9a_c-03b_east---9a_c-03_north-east": RoomConnection("9a", all_doors["9a_c-03b_east"], all_doors["9a_c-03_north-east"]), + "9a_c-04_east---9a_d-00_bottom": RoomConnection("9a", all_doors["9a_c-04_east"], all_doors["9a_d-00_bottom"]), + "9a_d-00_top---9a_d-01_bottom": RoomConnection("9a", all_doors["9a_d-00_top"], all_doors["9a_d-01_bottom"]), + "9a_d-01_top---9a_d-02_bottom": RoomConnection("9a", all_doors["9a_d-01_top"], all_doors["9a_d-02_bottom"]), + "9a_d-02_top---9a_d-03_bottom": RoomConnection("9a", all_doors["9a_d-02_top"], all_doors["9a_d-03_bottom"]), + "9a_d-03_top---9a_d-04_bottom": RoomConnection("9a", all_doors["9a_d-03_top"], all_doors["9a_d-04_bottom"]), + "9a_d-04_top---9a_d-05_bottom": RoomConnection("9a", all_doors["9a_d-04_top"], all_doors["9a_d-05_bottom"]), + "9a_d-05_top---9a_d-06_bottom": RoomConnection("9a", all_doors["9a_d-05_top"], all_doors["9a_d-06_bottom"]), + "9a_d-06_top---9a_d-07_bottom": RoomConnection("9a", all_doors["9a_d-06_top"], all_doors["9a_d-07_bottom"]), + "9a_d-07_top---9a_d-08_west": RoomConnection("9a", all_doors["9a_d-07_top"], all_doors["9a_d-08_west"]), + "9a_d-08_east---9a_d-09_west": RoomConnection("9a", all_doors["9a_d-08_east"], all_doors["9a_d-09_west"]), + "9a_d-09_east---9a_d-10_west": RoomConnection("9a", all_doors["9a_d-09_east"], all_doors["9a_d-10_west"]), + "9a_d-10_east---9a_d-10b_west": RoomConnection("9a", all_doors["9a_d-10_east"], all_doors["9a_d-10b_west"]), + "9a_d-10b_east---9a_d-10c_west": RoomConnection("9a", all_doors["9a_d-10b_east"], all_doors["9a_d-10c_west"]), + "9a_d-10c_east---9a_d-11_west": RoomConnection("9a", all_doors["9a_d-10c_east"], all_doors["9a_d-11_west"]), + "9a_d-11_east---9a_space_west": RoomConnection("9a", all_doors["9a_d-11_east"], all_doors["9a_space_west"]), + + "9b_00_east---9b_01_west": RoomConnection("9b", all_doors["9b_00_east"], all_doors["9b_01_west"]), + "9b_01_east---9b_a-00_west": RoomConnection("9b", all_doors["9b_01_east"], all_doors["9b_a-00_west"]), + "9b_a-00_east---9b_a-01_west": RoomConnection("9b", all_doors["9b_a-00_east"], all_doors["9b_a-01_west"]), + "9b_a-01_east---9b_a-02_west": RoomConnection("9b", all_doors["9b_a-01_east"], all_doors["9b_a-02_west"]), + "9b_a-02_east---9b_a-03_west": RoomConnection("9b", all_doors["9b_a-02_east"], all_doors["9b_a-03_west"]), + "9b_a-03_east---9b_a-04_west": RoomConnection("9b", all_doors["9b_a-03_east"], all_doors["9b_a-04_west"]), + "9b_a-04_east---9b_a-05_west": RoomConnection("9b", all_doors["9b_a-04_east"], all_doors["9b_a-05_west"]), + "9b_a-05_east---9b_b-00_west": RoomConnection("9b", all_doors["9b_a-05_east"], all_doors["9b_b-00_west"]), + "9b_b-00_east---9b_b-01_west": RoomConnection("9b", all_doors["9b_b-00_east"], all_doors["9b_b-01_west"]), + "9b_b-01_east---9b_b-02_west": RoomConnection("9b", all_doors["9b_b-01_east"], all_doors["9b_b-02_west"]), + "9b_b-02_east---9b_b-03_west": RoomConnection("9b", all_doors["9b_b-02_east"], all_doors["9b_b-03_west"]), + "9b_b-03_east---9b_b-04_west": RoomConnection("9b", all_doors["9b_b-03_east"], all_doors["9b_b-04_west"]), + "9b_b-04_east---9b_b-05_west": RoomConnection("9b", all_doors["9b_b-04_east"], all_doors["9b_b-05_west"]), + "9b_b-05_east---9b_c-01_bottom": RoomConnection("9b", all_doors["9b_b-05_east"], all_doors["9b_c-01_bottom"]), + "9b_c-01_top---9b_c-02_bottom": RoomConnection("9b", all_doors["9b_c-01_top"], all_doors["9b_c-02_bottom"]), + "9b_c-02_top---9b_c-03_bottom": RoomConnection("9b", all_doors["9b_c-02_top"], all_doors["9b_c-03_bottom"]), + "9b_c-03_top---9b_c-04_bottom": RoomConnection("9b", all_doors["9b_c-03_top"], all_doors["9b_c-04_bottom"]), + "9b_c-04_top---9b_c-05_west": RoomConnection("9b", all_doors["9b_c-04_top"], all_doors["9b_c-05_west"]), + "9b_c-05_east---9b_c-06_west": RoomConnection("9b", all_doors["9b_c-05_east"], all_doors["9b_c-06_west"]), + "9b_c-06_east---9b_c-08_west": RoomConnection("9b", all_doors["9b_c-06_east"], all_doors["9b_c-08_west"]), + "9b_c-08_east---9b_c-07_west": RoomConnection("9b", all_doors["9b_c-08_east"], all_doors["9b_c-07_west"]), + "9b_c-07_east---9b_space_west": RoomConnection("9b", all_doors["9b_c-07_east"], all_doors["9b_space_west"]), + + "9c_intro_east---9c_00_west": RoomConnection("9c", all_doors["9c_intro_east"], all_doors["9c_00_west"]), + "9c_00_east---9c_01_west": RoomConnection("9c", all_doors["9c_00_east"], all_doors["9c_01_west"]), + "9c_01_east---9c_02_west": RoomConnection("9c", all_doors["9c_01_east"], all_doors["9c_02_west"]), + + "10a_intro-00-past_east---10a_intro-01-future_west": RoomConnection("10a", all_doors["10a_intro-00-past_east"], all_doors["10a_intro-01-future_west"]), + "10a_intro-01-future_east---10a_intro-02-launch_bottom": RoomConnection("10a", all_doors["10a_intro-01-future_east"], all_doors["10a_intro-02-launch_bottom"]), + "10a_intro-02-launch_top---10a_intro-03-space_west": RoomConnection("10a", all_doors["10a_intro-02-launch_top"], all_doors["10a_intro-03-space_west"]), + "10a_intro-03-space_east---10a_a-00_west": RoomConnection("10a", all_doors["10a_intro-03-space_east"], all_doors["10a_a-00_west"]), + "10a_a-00_east---10a_a-01_west": RoomConnection("10a", all_doors["10a_a-00_east"], all_doors["10a_a-01_west"]), + "10a_a-01_east---10a_a-02_west": RoomConnection("10a", all_doors["10a_a-01_east"], all_doors["10a_a-02_west"]), + "10a_a-02_east---10a_a-03_west": RoomConnection("10a", all_doors["10a_a-02_east"], all_doors["10a_a-03_west"]), + "10a_a-03_east---10a_a-04_west": RoomConnection("10a", all_doors["10a_a-03_east"], all_doors["10a_a-04_west"]), + "10a_a-04_east---10a_a-05_west": RoomConnection("10a", all_doors["10a_a-04_east"], all_doors["10a_a-05_west"]), + "10a_a-05_east---10a_b-00_west": RoomConnection("10a", all_doors["10a_a-05_east"], all_doors["10a_b-00_west"]), + "10a_b-00_east---10a_b-01_west": RoomConnection("10a", all_doors["10a_b-00_east"], all_doors["10a_b-01_west"]), + "10a_b-01_east---10a_b-02_west": RoomConnection("10a", all_doors["10a_b-01_east"], all_doors["10a_b-02_west"]), + "10a_b-02_east---10a_b-03_west": RoomConnection("10a", all_doors["10a_b-02_east"], all_doors["10a_b-03_west"]), + "10a_b-03_east---10a_b-04_west": RoomConnection("10a", all_doors["10a_b-03_east"], all_doors["10a_b-04_west"]), + "10a_b-04_east---10a_b-05_west": RoomConnection("10a", all_doors["10a_b-04_east"], all_doors["10a_b-05_west"]), + "10a_b-05_east---10a_b-06_west": RoomConnection("10a", all_doors["10a_b-05_east"], all_doors["10a_b-06_west"]), + "10a_b-06_east---10a_b-07_west": RoomConnection("10a", all_doors["10a_b-06_east"], all_doors["10a_b-07_west"]), + "10a_b-07_east---10a_c-00_west": RoomConnection("10a", all_doors["10a_b-07_east"], all_doors["10a_c-00_west"]), + "10a_c-00_east---10a_c-00b_west": RoomConnection("10a", all_doors["10a_c-00_east"], all_doors["10a_c-00b_west"]), + "10a_c-00_north-east---10a_c-alt-00_west": RoomConnection("10a", all_doors["10a_c-00_north-east"], all_doors["10a_c-alt-00_west"]), + "10a_c-00b_east---10a_c-01_west": RoomConnection("10a", all_doors["10a_c-00b_east"], all_doors["10a_c-01_west"]), + "10a_c-01_east---10a_c-02_west": RoomConnection("10a", all_doors["10a_c-01_east"], all_doors["10a_c-02_west"]), + "10a_c-02_east---10a_c-03_south": RoomConnection("10a", all_doors["10a_c-02_east"], all_doors["10a_c-03_south"]), + "10a_c-alt-00_east---10a_c-alt-01_west": RoomConnection("10a", all_doors["10a_c-alt-00_east"], all_doors["10a_c-alt-01_west"]), + "10a_c-alt-01_east---10a_c-03_south-west": RoomConnection("10a", all_doors["10a_c-alt-01_east"], all_doors["10a_c-03_south-west"]), + "10a_c-03_north---10a_d-00_south": RoomConnection("10a", all_doors["10a_c-03_north"], all_doors["10a_d-00_south"]), + "10a_d-00_north-east-door---10a_d-04_west": RoomConnection("10a", all_doors["10a_d-00_north-east-door"], all_doors["10a_d-04_west"]), + "10a_d-00_south-east-door---10a_d-03_west": RoomConnection("10a", all_doors["10a_d-00_south-east-door"], all_doors["10a_d-03_west"]), + "10a_d-00_south-west-door---10a_d-01_east": RoomConnection("10a", all_doors["10a_d-00_south-west-door"], all_doors["10a_d-01_east"]), + "10a_d-00_west-door---10a_d-02_bottom": RoomConnection("10a", all_doors["10a_d-00_west-door"], all_doors["10a_d-02_bottom"]), + "10a_d-00_north-west-door---10a_d-05_west": RoomConnection("10a", all_doors["10a_d-00_north-west-door"], all_doors["10a_d-05_west"]), + "10a_d-00_north---10a_d-05_south": RoomConnection("10a", all_doors["10a_d-00_north"], all_doors["10a_d-05_south"]), + "10a_d-05_north---10a_e-00y_south": RoomConnection("10a", all_doors["10a_d-05_north"], all_doors["10a_e-00y_south"]), + "10a_e-00y_north---10a_e-00z_south": RoomConnection("10a", all_doors["10a_e-00y_north"], all_doors["10a_e-00z_south"]), + "10a_e-00y_south-east---10a_e-00yb_south": RoomConnection("10a", all_doors["10a_e-00y_south-east"], all_doors["10a_e-00yb_south"]), + "10a_e-00yb_north---10a_e-00y_north-east": RoomConnection("10a", all_doors["10a_e-00yb_north"], all_doors["10a_e-00y_north-east"]), + "10a_e-00z_north---10a_e-00_south": RoomConnection("10a", all_doors["10a_e-00z_north"], all_doors["10a_e-00_south"]), + "10a_e-00_north---10a_e-00b_south": RoomConnection("10a", all_doors["10a_e-00_north"], all_doors["10a_e-00b_south"]), + "10a_e-00b_north---10a_e-01_south": RoomConnection("10a", all_doors["10a_e-00b_north"], all_doors["10a_e-01_south"]), + "10a_e-01_north---10a_e-02_west": RoomConnection("10a", all_doors["10a_e-01_north"], all_doors["10a_e-02_west"]), + "10a_e-02_east---10a_e-03_west": RoomConnection("10a", all_doors["10a_e-02_east"], all_doors["10a_e-03_west"]), + "10a_e-03_east---10a_e-04_west": RoomConnection("10a", all_doors["10a_e-03_east"], all_doors["10a_e-04_west"]), + "10a_e-04_east---10a_e-05_west": RoomConnection("10a", all_doors["10a_e-04_east"], all_doors["10a_e-05_west"]), + "10a_e-05_east---10a_e-05b_west": RoomConnection("10a", all_doors["10a_e-05_east"], all_doors["10a_e-05b_west"]), + "10a_e-05b_east---10a_e-05c_west": RoomConnection("10a", all_doors["10a_e-05b_east"], all_doors["10a_e-05c_west"]), + "10a_e-05c_east---10a_e-06_west": RoomConnection("10a", all_doors["10a_e-05c_east"], all_doors["10a_e-06_west"]), + "10a_e-06_east---10a_e-07_west": RoomConnection("10a", all_doors["10a_e-06_east"], all_doors["10a_e-07_west"]), + "10a_e-07_east---10a_e-08_west": RoomConnection("10a", all_doors["10a_e-07_east"], all_doors["10a_e-08_west"]), + + "10b_f-door_east---10b_f-00_west": RoomConnection("10b", all_doors["10b_f-door_east"], all_doors["10b_f-00_west"]), + "10b_f-00_east---10b_f-01_west": RoomConnection("10b", all_doors["10b_f-00_east"], all_doors["10b_f-01_west"]), + "10b_f-01_east---10b_f-02_west": RoomConnection("10b", all_doors["10b_f-01_east"], all_doors["10b_f-02_west"]), + "10b_f-02_east---10b_f-03_west": RoomConnection("10b", all_doors["10b_f-02_east"], all_doors["10b_f-03_west"]), + "10b_f-03_east---10b_f-04_west": RoomConnection("10b", all_doors["10b_f-03_east"], all_doors["10b_f-04_west"]), + "10b_f-04_east---10b_f-05_west": RoomConnection("10b", all_doors["10b_f-04_east"], all_doors["10b_f-05_west"]), + "10b_f-05_east---10b_f-06_west": RoomConnection("10b", all_doors["10b_f-05_east"], all_doors["10b_f-06_west"]), + "10b_f-06_east---10b_f-07_west": RoomConnection("10b", all_doors["10b_f-06_east"], all_doors["10b_f-07_west"]), + "10b_f-07_east---10b_f-08_west": RoomConnection("10b", all_doors["10b_f-07_east"], all_doors["10b_f-08_west"]), + "10b_f-08_east---10b_f-09_west": RoomConnection("10b", all_doors["10b_f-08_east"], all_doors["10b_f-09_west"]), + "10b_f-09_east---10b_g-00_bottom": RoomConnection("10b", all_doors["10b_f-09_east"], all_doors["10b_g-00_bottom"]), + "10b_g-00_top---10b_g-01_bottom": RoomConnection("10b", all_doors["10b_g-00_top"], all_doors["10b_g-01_bottom"]), + "10b_g-01_top---10b_g-03_bottom": RoomConnection("10b", all_doors["10b_g-01_top"], all_doors["10b_g-03_bottom"]), + "10b_g-03_top---10b_g-02_west": RoomConnection("10b", all_doors["10b_g-03_top"], all_doors["10b_g-02_west"]), + "10b_g-02_east---10b_g-04_west": RoomConnection("10b", all_doors["10b_g-02_east"], all_doors["10b_g-04_west"]), + "10b_g-04_east---10b_g-05_west": RoomConnection("10b", all_doors["10b_g-04_east"], all_doors["10b_g-05_west"]), + "10b_g-05_east---10b_g-06_west": RoomConnection("10b", all_doors["10b_g-05_east"], all_doors["10b_g-06_west"]), + "10b_g-06_east---10b_h-00b_west": RoomConnection("10b", all_doors["10b_g-06_east"], all_doors["10b_h-00b_west"]), + "10b_h-00b_east---10b_h-00_west": RoomConnection("10b", all_doors["10b_h-00b_east"], all_doors["10b_h-00_west"]), + "10b_h-00_east---10b_h-01_west": RoomConnection("10b", all_doors["10b_h-00_east"], all_doors["10b_h-01_west"]), + "10b_h-01_east---10b_h-02_west": RoomConnection("10b", all_doors["10b_h-01_east"], all_doors["10b_h-02_west"]), + "10b_h-02_east---10b_h-03_west": RoomConnection("10b", all_doors["10b_h-02_east"], all_doors["10b_h-03_west"]), + "10b_h-03_east---10b_h-03b_west": RoomConnection("10b", all_doors["10b_h-03_east"], all_doors["10b_h-03b_west"]), + "10b_h-03b_east---10b_h-04_top": RoomConnection("10b", all_doors["10b_h-03b_east"], all_doors["10b_h-04_top"]), + "10b_h-04_east---10b_h-04b_west": RoomConnection("10b", all_doors["10b_h-04_east"], all_doors["10b_h-04b_west"]), + "10b_h-04_bottom---10b_h-05_west": RoomConnection("10b", all_doors["10b_h-04_bottom"], all_doors["10b_h-05_west"]), + "10b_h-04b_east---10b_h-05_top": RoomConnection("10b", all_doors["10b_h-04b_east"], all_doors["10b_h-05_top"]), + "10b_h-05_east---10b_h-06_west": RoomConnection("10b", all_doors["10b_h-05_east"], all_doors["10b_h-06_west"]), + "10b_h-06_east---10b_h-06b_bottom": RoomConnection("10b", all_doors["10b_h-06_east"], all_doors["10b_h-06b_bottom"]), + "10b_h-06b_top---10b_h-07_west": RoomConnection("10b", all_doors["10b_h-06b_top"], all_doors["10b_h-07_west"]), + "10b_h-07_east---10b_h-08_west": RoomConnection("10b", all_doors["10b_h-07_east"], all_doors["10b_h-08_west"]), + "10b_h-08_east---10b_h-09_west": RoomConnection("10b", all_doors["10b_h-08_east"], all_doors["10b_h-09_west"]), + "10b_h-09_east---10b_h-10_west": RoomConnection("10b", all_doors["10b_h-09_east"], all_doors["10b_h-10_west"]), + "10b_h-10_east---10b_i-00_west": RoomConnection("10b", all_doors["10b_h-10_east"], all_doors["10b_i-00_west"]), + "10b_i-00_east---10b_i-00b_west": RoomConnection("10b", all_doors["10b_i-00_east"], all_doors["10b_i-00b_west"]), + "10b_i-00b_east---10b_i-01_west": RoomConnection("10b", all_doors["10b_i-00b_east"], all_doors["10b_i-01_west"]), + "10b_i-01_east---10b_i-02_west": RoomConnection("10b", all_doors["10b_i-01_east"], all_doors["10b_i-02_west"]), + "10b_i-02_east---10b_i-03_west": RoomConnection("10b", all_doors["10b_i-02_east"], all_doors["10b_i-03_west"]), + "10b_i-03_east---10b_i-04_west": RoomConnection("10b", all_doors["10b_i-03_east"], all_doors["10b_i-04_west"]), + "10b_i-04_east---10b_i-05_west": RoomConnection("10b", all_doors["10b_i-04_east"], all_doors["10b_i-05_west"]), + "10b_i-05_east---10b_j-00_west": RoomConnection("10b", all_doors["10b_i-05_east"], all_doors["10b_j-00_west"]), + "10b_j-00_east---10b_j-00b_west": RoomConnection("10b", all_doors["10b_j-00_east"], all_doors["10b_j-00b_west"]), + "10b_j-00b_east---10b_j-01_west": RoomConnection("10b", all_doors["10b_j-00b_east"], all_doors["10b_j-01_west"]), + "10b_j-01_east---10b_j-02_west": RoomConnection("10b", all_doors["10b_j-01_east"], all_doors["10b_j-02_west"]), + "10b_j-02_east---10b_j-03_west": RoomConnection("10b", all_doors["10b_j-02_east"], all_doors["10b_j-03_west"]), + "10b_j-03_east---10b_j-04_west": RoomConnection("10b", all_doors["10b_j-03_east"], all_doors["10b_j-04_west"]), + "10b_j-04_east---10b_j-05_west": RoomConnection("10b", all_doors["10b_j-04_east"], all_doors["10b_j-05_west"]), + "10b_j-05_east---10b_j-06_west": RoomConnection("10b", all_doors["10b_j-05_east"], all_doors["10b_j-06_west"]), + "10b_j-06_east---10b_j-07_west": RoomConnection("10b", all_doors["10b_j-06_east"], all_doors["10b_j-07_west"]), + "10b_j-07_east---10b_j-08_west": RoomConnection("10b", all_doors["10b_j-07_east"], all_doors["10b_j-08_west"]), + "10b_j-08_east---10b_j-09_west": RoomConnection("10b", all_doors["10b_j-08_east"], all_doors["10b_j-09_west"]), + "10b_j-09_east---10b_j-10_west": RoomConnection("10b", all_doors["10b_j-09_east"], all_doors["10b_j-10_west"]), + "10b_j-10_east---10b_j-11_west": RoomConnection("10b", all_doors["10b_j-10_east"], all_doors["10b_j-11_west"]), + "10b_j-11_east---10b_j-12_west": RoomConnection("10b", all_doors["10b_j-11_east"], all_doors["10b_j-12_west"]), + "10b_j-12_east---10b_j-13_west": RoomConnection("10b", all_doors["10b_j-12_east"], all_doors["10b_j-13_west"]), + "10b_j-13_east---10b_j-14_west": RoomConnection("10b", all_doors["10b_j-13_east"], all_doors["10b_j-14_west"]), + "10b_j-14_east---10b_j-14b_west": RoomConnection("10b", all_doors["10b_j-14_east"], all_doors["10b_j-14b_west"]), + "10b_j-14b_east---10b_j-15_west": RoomConnection("10b", all_doors["10b_j-14b_east"], all_doors["10b_j-15_west"]), + "10b_j-15_east---10b_j-16_west": RoomConnection("10b", all_doors["10b_j-15_east"], all_doors["10b_j-16_west"]), + "10b_j-16_east---10b_GOAL_main": RoomConnection("10b", all_doors["10b_j-16_east"], all_doors["10b_GOAL_main"]), + "10b_j-16_top---10b_j-17_south": RoomConnection("10b", all_doors["10b_j-16_top"], all_doors["10b_j-17_south"]), + "10b_j-17_west---10b_j-18_west": RoomConnection("10b", all_doors["10b_j-17_west"], all_doors["10b_j-18_west"]), + "10b_j-17_east---10b_j-19_bottom": RoomConnection("10b", all_doors["10b_j-17_east"], all_doors["10b_j-19_bottom"]), + "10b_j-18_east---10b_j-17_north": RoomConnection("10b", all_doors["10b_j-18_east"], all_doors["10b_j-17_north"]), + "10b_j-19_top---10b_GOAL_moon": RoomConnection("10b", all_doors["10b_j-19_top"], all_doors["10b_GOAL_moon"]), + + +} + +all_rooms: dict[str, Room] = { + "0a_-1": Room("0a", "0a_-1", "Prologue - Room -1", [reg for _, reg in all_regions.items() if reg.room_name == "0a_-1"], [door for _, door in all_doors.items() if door.room_name == "0a_-1"]), + "0a_0": Room("0a", "0a_0", "Prologue - Room 0", [reg for _, reg in all_regions.items() if reg.room_name == "0a_0"], [door for _, door in all_doors.items() if door.room_name == "0a_0"], "Start", "0a_0_west"), + "0a_0b": Room("0a", "0a_0b", "Prologue - Room 0b", [reg for _, reg in all_regions.items() if reg.room_name == "0a_0b"], [door for _, door in all_doors.items() if door.room_name == "0a_0b"]), + "0a_1": Room("0a", "0a_1", "Prologue - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "0a_1"], [door for _, door in all_doors.items() if door.room_name == "0a_1"]), + "0a_2": Room("0a", "0a_2", "Prologue - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "0a_2"], [door for _, door in all_doors.items() if door.room_name == "0a_2"]), + "0a_3": Room("0a", "0a_3", "Prologue - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "0a_3"], [door for _, door in all_doors.items() if door.room_name == "0a_3"]), + + "1a_1": Room("1a", "1a_1", "Forsaken City A - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "1a_1"], [door for _, door in all_doors.items() if door.room_name == "1a_1"], "Start", "1a_1_main"), + "1a_2": Room("1a", "1a_2", "Forsaken City A - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "1a_2"], [door for _, door in all_doors.items() if door.room_name == "1a_2"]), + "1a_3": Room("1a", "1a_3", "Forsaken City A - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "1a_3"], [door for _, door in all_doors.items() if door.room_name == "1a_3"]), + "1a_4": Room("1a", "1a_4", "Forsaken City A - Room 4", [reg for _, reg in all_regions.items() if reg.room_name == "1a_4"], [door for _, door in all_doors.items() if door.room_name == "1a_4"]), + "1a_3b": Room("1a", "1a_3b", "Forsaken City A - Room 3b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_3b"], [door for _, door in all_doors.items() if door.room_name == "1a_3b"]), + "1a_5": Room("1a", "1a_5", "Forsaken City A - Room 5", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5"], [door for _, door in all_doors.items() if door.room_name == "1a_5"]), + "1a_5z": Room("1a", "1a_5z", "Forsaken City A - Room 5z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5z"], [door for _, door in all_doors.items() if door.room_name == "1a_5z"]), + "1a_5a": Room("1a", "1a_5a", "Forsaken City A - Room 5a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5a"], [door for _, door in all_doors.items() if door.room_name == "1a_5a"]), + "1a_6": Room("1a", "1a_6", "Forsaken City A - Room 6", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6"], [door for _, door in all_doors.items() if door.room_name == "1a_6"], "Crossing", "1a_6_south-west"), + "1a_6z": Room("1a", "1a_6z", "Forsaken City A - Room 6z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6z"], [door for _, door in all_doors.items() if door.room_name == "1a_6z"]), + "1a_6zb": Room("1a", "1a_6zb", "Forsaken City A - Room 6zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6zb"], [door for _, door in all_doors.items() if door.room_name == "1a_6zb"]), + "1a_7zb": Room("1a", "1a_7zb", "Forsaken City A - Room 7zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7zb"], [door for _, door in all_doors.items() if door.room_name == "1a_7zb"]), + "1a_6a": Room("1a", "1a_6a", "Forsaken City A - Room 6a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6a"], [door for _, door in all_doors.items() if door.room_name == "1a_6a"]), + "1a_6b": Room("1a", "1a_6b", "Forsaken City A - Room 6b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6b"], [door for _, door in all_doors.items() if door.room_name == "1a_6b"]), + "1a_s0": Room("1a", "1a_s0", "Forsaken City A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "1a_s0"], [door for _, door in all_doors.items() if door.room_name == "1a_s0"]), + "1a_s1": Room("1a", "1a_s1", "Forsaken City A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "1a_s1"], [door for _, door in all_doors.items() if door.room_name == "1a_s1"]), + "1a_6c": Room("1a", "1a_6c", "Forsaken City A - Room 6c", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6c"], [door for _, door in all_doors.items() if door.room_name == "1a_6c"]), + "1a_7": Room("1a", "1a_7", "Forsaken City A - Room 7", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7"], [door for _, door in all_doors.items() if door.room_name == "1a_7"]), + "1a_7z": Room("1a", "1a_7z", "Forsaken City A - Room 7z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7z"], [door for _, door in all_doors.items() if door.room_name == "1a_7z"]), + "1a_8z": Room("1a", "1a_8z", "Forsaken City A - Room 8z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8z"], [door for _, door in all_doors.items() if door.room_name == "1a_8z"]), + "1a_8zb": Room("1a", "1a_8zb", "Forsaken City A - Room 8zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8zb"], [door for _, door in all_doors.items() if door.room_name == "1a_8zb"]), + "1a_8": Room("1a", "1a_8", "Forsaken City A - Room 8", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8"], [door for _, door in all_doors.items() if door.room_name == "1a_8"]), + "1a_7a": Room("1a", "1a_7a", "Forsaken City A - Room 7a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7a"], [door for _, door in all_doors.items() if door.room_name == "1a_7a"]), + "1a_9z": Room("1a", "1a_9z", "Forsaken City A - Room 9z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9z"], [door for _, door in all_doors.items() if door.room_name == "1a_9z"]), + "1a_8b": Room("1a", "1a_8b", "Forsaken City A - Room 8b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8b"], [door for _, door in all_doors.items() if door.room_name == "1a_8b"]), + "1a_9": Room("1a", "1a_9", "Forsaken City A - Room 9", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9"], [door for _, door in all_doors.items() if door.room_name == "1a_9"]), + "1a_9b": Room("1a", "1a_9b", "Forsaken City A - Room 9b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9b"], [door for _, door in all_doors.items() if door.room_name == "1a_9b"], "Chasm", "1a_9b_west"), + "1a_9c": Room("1a", "1a_9c", "Forsaken City A - Room 9c", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9c"], [door for _, door in all_doors.items() if door.room_name == "1a_9c"]), + "1a_10": Room("1a", "1a_10", "Forsaken City A - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10"], [door for _, door in all_doors.items() if door.room_name == "1a_10"]), + "1a_10z": Room("1a", "1a_10z", "Forsaken City A - Room 10z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10z"], [door for _, door in all_doors.items() if door.room_name == "1a_10z"]), + "1a_10zb": Room("1a", "1a_10zb", "Forsaken City A - Room 10zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10zb"], [door for _, door in all_doors.items() if door.room_name == "1a_10zb"]), + "1a_11": Room("1a", "1a_11", "Forsaken City A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "1a_11"], [door for _, door in all_doors.items() if door.room_name == "1a_11"]), + "1a_11z": Room("1a", "1a_11z", "Forsaken City A - Room 11z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_11z"], [door for _, door in all_doors.items() if door.room_name == "1a_11z"]), + "1a_10a": Room("1a", "1a_10a", "Forsaken City A - Room 10a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10a"], [door for _, door in all_doors.items() if door.room_name == "1a_10a"]), + "1a_12": Room("1a", "1a_12", "Forsaken City A - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12"], [door for _, door in all_doors.items() if door.room_name == "1a_12"]), + "1a_12z": Room("1a", "1a_12z", "Forsaken City A - Room 12z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12z"], [door for _, door in all_doors.items() if door.room_name == "1a_12z"]), + "1a_12a": Room("1a", "1a_12a", "Forsaken City A - Room 12a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12a"], [door for _, door in all_doors.items() if door.room_name == "1a_12a"]), + "1a_end": Room("1a", "1a_end", "Forsaken City A - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "1a_end"], [door for _, door in all_doors.items() if door.room_name == "1a_end"]), + + "1b_00": Room("1b", "1b_00", "Forsaken City B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "1b_00"], [door for _, door in all_doors.items() if door.room_name == "1b_00"], "Start", "1b_00_west"), + "1b_01": Room("1b", "1b_01", "Forsaken City B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "1b_01"], [door for _, door in all_doors.items() if door.room_name == "1b_01"]), + "1b_02": Room("1b", "1b_02", "Forsaken City B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "1b_02"], [door for _, door in all_doors.items() if door.room_name == "1b_02"]), + "1b_02b": Room("1b", "1b_02b", "Forsaken City B - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_02b"], [door for _, door in all_doors.items() if door.room_name == "1b_02b"]), + "1b_03": Room("1b", "1b_03", "Forsaken City B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "1b_03"], [door for _, door in all_doors.items() if door.room_name == "1b_03"]), + "1b_04": Room("1b", "1b_04", "Forsaken City B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "1b_04"], [door for _, door in all_doors.items() if door.room_name == "1b_04"], "Contraption", "1b_04_west"), + "1b_05": Room("1b", "1b_05", "Forsaken City B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "1b_05"], [door for _, door in all_doors.items() if door.room_name == "1b_05"]), + "1b_05b": Room("1b", "1b_05b", "Forsaken City B - Room 05b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_05b"], [door for _, door in all_doors.items() if door.room_name == "1b_05b"]), + "1b_06": Room("1b", "1b_06", "Forsaken City B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "1b_06"], [door for _, door in all_doors.items() if door.room_name == "1b_06"]), + "1b_07": Room("1b", "1b_07", "Forsaken City B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "1b_07"], [door for _, door in all_doors.items() if door.room_name == "1b_07"]), + "1b_08": Room("1b", "1b_08", "Forsaken City B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "1b_08"], [door for _, door in all_doors.items() if door.room_name == "1b_08"], "Scrap Pit", "1b_08_west"), + "1b_08b": Room("1b", "1b_08b", "Forsaken City B - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_08b"], [door for _, door in all_doors.items() if door.room_name == "1b_08b"]), + "1b_09": Room("1b", "1b_09", "Forsaken City B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "1b_09"], [door for _, door in all_doors.items() if door.room_name == "1b_09"]), + "1b_10": Room("1b", "1b_10", "Forsaken City B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "1b_10"], [door for _, door in all_doors.items() if door.room_name == "1b_10"]), + "1b_11": Room("1b", "1b_11", "Forsaken City B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "1b_11"], [door for _, door in all_doors.items() if door.room_name == "1b_11"]), + "1b_end": Room("1b", "1b_end", "Forsaken City B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "1b_end"], [door for _, door in all_doors.items() if door.room_name == "1b_end"]), + + "1c_00": Room("1c", "1c_00", "Forsaken City C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "1c_00"], [door for _, door in all_doors.items() if door.room_name == "1c_00"], "Start", "1c_00_west"), + "1c_01": Room("1c", "1c_01", "Forsaken City C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "1c_01"], [door for _, door in all_doors.items() if door.room_name == "1c_01"]), + "1c_02": Room("1c", "1c_02", "Forsaken City C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "1c_02"], [door for _, door in all_doors.items() if door.room_name == "1c_02"]), + + "2a_start": Room("2a", "2a_start", "Old Site A - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "2a_start"], [door for _, door in all_doors.items() if door.room_name == "2a_start"], "Start", "2a_start_main"), + "2a_s0": Room("2a", "2a_s0", "Old Site A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s0"], [door for _, door in all_doors.items() if door.room_name == "2a_s0"]), + "2a_s1": Room("2a", "2a_s1", "Old Site A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s1"], [door for _, door in all_doors.items() if door.room_name == "2a_s1"]), + "2a_s2": Room("2a", "2a_s2", "Old Site A - Room s2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s2"], [door for _, door in all_doors.items() if door.room_name == "2a_s2"]), + "2a_0": Room("2a", "2a_0", "Old Site A - Room 0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_0"], [door for _, door in all_doors.items() if door.room_name == "2a_0"]), + "2a_1": Room("2a", "2a_1", "Old Site A - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_1"], [door for _, door in all_doors.items() if door.room_name == "2a_1"]), + "2a_d0": Room("2a", "2a_d0", "Old Site A - Room d0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d0"], [door for _, door in all_doors.items() if door.room_name == "2a_d0"]), + "2a_d7": Room("2a", "2a_d7", "Old Site A - Room d7", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d7"], [door for _, door in all_doors.items() if door.room_name == "2a_d7"]), + "2a_d8": Room("2a", "2a_d8", "Old Site A - Room d8", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d8"], [door for _, door in all_doors.items() if door.room_name == "2a_d8"]), + "2a_d3": Room("2a", "2a_d3", "Old Site A - Room d3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d3"], [door for _, door in all_doors.items() if door.room_name == "2a_d3"]), + "2a_d2": Room("2a", "2a_d2", "Old Site A - Room d2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d2"], [door for _, door in all_doors.items() if door.room_name == "2a_d2"]), + "2a_d9": Room("2a", "2a_d9", "Old Site A - Room d9", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d9"], [door for _, door in all_doors.items() if door.room_name == "2a_d9"]), + "2a_d1": Room("2a", "2a_d1", "Old Site A - Room d1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d1"], [door for _, door in all_doors.items() if door.room_name == "2a_d1"]), + "2a_d6": Room("2a", "2a_d6", "Old Site A - Room d6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d6"], [door for _, door in all_doors.items() if door.room_name == "2a_d6"]), + "2a_d4": Room("2a", "2a_d4", "Old Site A - Room d4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d4"], [door for _, door in all_doors.items() if door.room_name == "2a_d4"]), + "2a_d5": Room("2a", "2a_d5", "Old Site A - Room d5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d5"], [door for _, door in all_doors.items() if door.room_name == "2a_d5"]), + "2a_3x": Room("2a", "2a_3x", "Old Site A - Room 3x", [reg for _, reg in all_regions.items() if reg.room_name == "2a_3x"], [door for _, door in all_doors.items() if door.room_name == "2a_3x"]), + "2a_3": Room("2a", "2a_3", "Old Site A - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_3"], [door for _, door in all_doors.items() if door.room_name == "2a_3"], "Intervention", "2a_3_bottom"), + "2a_4": Room("2a", "2a_4", "Old Site A - Room 4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_4"], [door for _, door in all_doors.items() if door.room_name == "2a_4"]), + "2a_5": Room("2a", "2a_5", "Old Site A - Room 5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_5"], [door for _, door in all_doors.items() if door.room_name == "2a_5"]), + "2a_6": Room("2a", "2a_6", "Old Site A - Room 6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_6"], [door for _, door in all_doors.items() if door.room_name == "2a_6"]), + "2a_7": Room("2a", "2a_7", "Old Site A - Room 7", [reg for _, reg in all_regions.items() if reg.room_name == "2a_7"], [door for _, door in all_doors.items() if door.room_name == "2a_7"]), + "2a_8": Room("2a", "2a_8", "Old Site A - Room 8", [reg for _, reg in all_regions.items() if reg.room_name == "2a_8"], [door for _, door in all_doors.items() if door.room_name == "2a_8"]), + "2a_9": Room("2a", "2a_9", "Old Site A - Room 9", [reg for _, reg in all_regions.items() if reg.room_name == "2a_9"], [door for _, door in all_doors.items() if door.room_name == "2a_9"]), + "2a_9b": Room("2a", "2a_9b", "Old Site A - Room 9b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_9b"], [door for _, door in all_doors.items() if door.room_name == "2a_9b"]), + "2a_10": Room("2a", "2a_10", "Old Site A - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "2a_10"], [door for _, door in all_doors.items() if door.room_name == "2a_10"]), + "2a_2": Room("2a", "2a_2", "Old Site A - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_2"], [door for _, door in all_doors.items() if door.room_name == "2a_2"]), + "2a_11": Room("2a", "2a_11", "Old Site A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "2a_11"], [door for _, door in all_doors.items() if door.room_name == "2a_11"]), + "2a_12b": Room("2a", "2a_12b", "Old Site A - Room 12b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12b"], [door for _, door in all_doors.items() if door.room_name == "2a_12b"]), + "2a_12c": Room("2a", "2a_12c", "Old Site A - Room 12c", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12c"], [door for _, door in all_doors.items() if door.room_name == "2a_12c"]), + "2a_12d": Room("2a", "2a_12d", "Old Site A - Room 12d", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12d"], [door for _, door in all_doors.items() if door.room_name == "2a_12d"]), + "2a_12": Room("2a", "2a_12", "Old Site A - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12"], [door for _, door in all_doors.items() if door.room_name == "2a_12"]), + "2a_13": Room("2a", "2a_13", "Old Site A - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "2a_13"], [door for _, door in all_doors.items() if door.room_name == "2a_13"]), + "2a_end_0": Room("2a", "2a_end_0", "Old Site A - Room end_0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_0"], [door for _, door in all_doors.items() if door.room_name == "2a_end_0"]), + "2a_end_s0": Room("2a", "2a_end_s0", "Old Site A - Room end_s0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_s0"], [door for _, door in all_doors.items() if door.room_name == "2a_end_s0"]), + "2a_end_s1": Room("2a", "2a_end_s1", "Old Site A - Room end_s1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_s1"], [door for _, door in all_doors.items() if door.room_name == "2a_end_s1"]), + "2a_end_1": Room("2a", "2a_end_1", "Old Site A - Room end_1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_1"], [door for _, door in all_doors.items() if door.room_name == "2a_end_1"]), + "2a_end_2": Room("2a", "2a_end_2", "Old Site A - Room end_2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_2"], [door for _, door in all_doors.items() if door.room_name == "2a_end_2"]), + "2a_end_3": Room("2a", "2a_end_3", "Old Site A - Room end_3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3"], "Awake", "2a_end_3_west"), + "2a_end_4": Room("2a", "2a_end_4", "Old Site A - Room end_4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_4"], [door for _, door in all_doors.items() if door.room_name == "2a_end_4"]), + "2a_end_3b": Room("2a", "2a_end_3b", "Old Site A - Room end_3b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3b"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3b"]), + "2a_end_3cb": Room("2a", "2a_end_3cb", "Old Site A - Room end_3cb", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3cb"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3cb"]), + "2a_end_3c": Room("2a", "2a_end_3c", "Old Site A - Room end_3c", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3c"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3c"]), + "2a_end_5": Room("2a", "2a_end_5", "Old Site A - Room end_5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_5"], [door for _, door in all_doors.items() if door.room_name == "2a_end_5"]), + "2a_end_6": Room("2a", "2a_end_6", "Old Site A - Room end_6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_6"], [door for _, door in all_doors.items() if door.room_name == "2a_end_6"]), + + "2b_start": Room("2b", "2b_start", "Old Site B - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "2b_start"], [door for _, door in all_doors.items() if door.room_name == "2b_start"], "Start", "2b_start_west"), + "2b_00": Room("2b", "2b_00", "Old Site B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "2b_00"], [door for _, door in all_doors.items() if door.room_name == "2b_00"]), + "2b_01": Room("2b", "2b_01", "Old Site B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "2b_01"], [door for _, door in all_doors.items() if door.room_name == "2b_01"]), + "2b_01b": Room("2b", "2b_01b", "Old Site B - Room 01b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_01b"], [door for _, door in all_doors.items() if door.room_name == "2b_01b"]), + "2b_02b": Room("2b", "2b_02b", "Old Site B - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_02b"], [door for _, door in all_doors.items() if door.room_name == "2b_02b"]), + "2b_02": Room("2b", "2b_02", "Old Site B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "2b_02"], [door for _, door in all_doors.items() if door.room_name == "2b_02"]), + "2b_03": Room("2b", "2b_03", "Old Site B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "2b_03"], [door for _, door in all_doors.items() if door.room_name == "2b_03"], "Combination Lock", "2b_03_west"), + "2b_04": Room("2b", "2b_04", "Old Site B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "2b_04"], [door for _, door in all_doors.items() if door.room_name == "2b_04"]), + "2b_05": Room("2b", "2b_05", "Old Site B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "2b_05"], [door for _, door in all_doors.items() if door.room_name == "2b_05"]), + "2b_06": Room("2b", "2b_06", "Old Site B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "2b_06"], [door for _, door in all_doors.items() if door.room_name == "2b_06"]), + "2b_07": Room("2b", "2b_07", "Old Site B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "2b_07"], [door for _, door in all_doors.items() if door.room_name == "2b_07"]), + "2b_08b": Room("2b", "2b_08b", "Old Site B - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_08b"], [door for _, door in all_doors.items() if door.room_name == "2b_08b"], "Dream Altar", "2b_08b_west"), + "2b_08": Room("2b", "2b_08", "Old Site B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "2b_08"], [door for _, door in all_doors.items() if door.room_name == "2b_08"]), + "2b_09": Room("2b", "2b_09", "Old Site B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "2b_09"], [door for _, door in all_doors.items() if door.room_name == "2b_09"]), + "2b_10": Room("2b", "2b_10", "Old Site B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "2b_10"], [door for _, door in all_doors.items() if door.room_name == "2b_10"]), + "2b_11": Room("2b", "2b_11", "Old Site B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "2b_11"], [door for _, door in all_doors.items() if door.room_name == "2b_11"]), + "2b_end": Room("2b", "2b_end", "Old Site B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "2b_end"], [door for _, door in all_doors.items() if door.room_name == "2b_end"]), + + "2c_00": Room("2c", "2c_00", "Old Site C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "2c_00"], [door for _, door in all_doors.items() if door.room_name == "2c_00"], "Start", "2c_00_west"), + "2c_01": Room("2c", "2c_01", "Old Site C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "2c_01"], [door for _, door in all_doors.items() if door.room_name == "2c_01"]), + "2c_02": Room("2c", "2c_02", "Old Site C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "2c_02"], [door for _, door in all_doors.items() if door.room_name == "2c_02"]), + + "3a_s0": Room("3a", "3a_s0", "Celestial Resort A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s0"], [door for _, door in all_doors.items() if door.room_name == "3a_s0"], "Start", "3a_s0_main"), + "3a_s1": Room("3a", "3a_s1", "Celestial Resort A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s1"], [door for _, door in all_doors.items() if door.room_name == "3a_s1"]), + "3a_s2": Room("3a", "3a_s2", "Celestial Resort A - Room s2", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s2"], [door for _, door in all_doors.items() if door.room_name == "3a_s2"]), + "3a_s3": Room("3a", "3a_s3", "Celestial Resort A - Room s3", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s3"], [door for _, door in all_doors.items() if door.room_name == "3a_s3"]), + "3a_0x-a": Room("3a", "3a_0x-a", "Celestial Resort A - Room 0x-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_0x-a"], [door for _, door in all_doors.items() if door.room_name == "3a_0x-a"]), + "3a_00-a": Room("3a", "3a_00-a", "Celestial Resort A - Room 00-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-a"], [door for _, door in all_doors.items() if door.room_name == "3a_00-a"]), + "3a_02-a": Room("3a", "3a_02-a", "Celestial Resort A - Room 02-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-a"], [door for _, door in all_doors.items() if door.room_name == "3a_02-a"]), + "3a_02-b": Room("3a", "3a_02-b", "Celestial Resort A - Room 02-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-b"], [door for _, door in all_doors.items() if door.room_name == "3a_02-b"]), + "3a_01-b": Room("3a", "3a_01-b", "Celestial Resort A - Room 01-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_01-b"], [door for _, door in all_doors.items() if door.room_name == "3a_01-b"]), + "3a_00-b": Room("3a", "3a_00-b", "Celestial Resort A - Room 00-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-b"], [door for _, door in all_doors.items() if door.room_name == "3a_00-b"]), + "3a_00-c": Room("3a", "3a_00-c", "Celestial Resort A - Room 00-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-c"], [door for _, door in all_doors.items() if door.room_name == "3a_00-c"]), + "3a_0x-b": Room("3a", "3a_0x-b", "Celestial Resort A - Room 0x-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_0x-b"], [door for _, door in all_doors.items() if door.room_name == "3a_0x-b"]), + "3a_03-a": Room("3a", "3a_03-a", "Celestial Resort A - Room 03-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_03-a"], [door for _, door in all_doors.items() if door.room_name == "3a_03-a"]), + "3a_04-b": Room("3a", "3a_04-b", "Celestial Resort A - Room 04-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-b"], [door for _, door in all_doors.items() if door.room_name == "3a_04-b"]), + "3a_05-a": Room("3a", "3a_05-a", "Celestial Resort A - Room 05-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_05-a"], [door for _, door in all_doors.items() if door.room_name == "3a_05-a"]), + "3a_06-a": Room("3a", "3a_06-a", "Celestial Resort A - Room 06-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-a"], [door for _, door in all_doors.items() if door.room_name == "3a_06-a"]), + "3a_07-a": Room("3a", "3a_07-a", "Celestial Resort A - Room 07-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_07-a"], [door for _, door in all_doors.items() if door.room_name == "3a_07-a"]), + "3a_07-b": Room("3a", "3a_07-b", "Celestial Resort A - Room 07-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_07-b"], [door for _, door in all_doors.items() if door.room_name == "3a_07-b"]), + "3a_06-b": Room("3a", "3a_06-b", "Celestial Resort A - Room 06-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-b"], [door for _, door in all_doors.items() if door.room_name == "3a_06-b"]), + "3a_06-c": Room("3a", "3a_06-c", "Celestial Resort A - Room 06-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-c"], [door for _, door in all_doors.items() if door.room_name == "3a_06-c"]), + "3a_05-c": Room("3a", "3a_05-c", "Celestial Resort A - Room 05-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_05-c"], [door for _, door in all_doors.items() if door.room_name == "3a_05-c"]), + "3a_08-c": Room("3a", "3a_08-c", "Celestial Resort A - Room 08-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-c"], [door for _, door in all_doors.items() if door.room_name == "3a_08-c"]), + "3a_08-b": Room("3a", "3a_08-b", "Celestial Resort A - Room 08-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-b"], [door for _, door in all_doors.items() if door.room_name == "3a_08-b"]), + "3a_08-a": Room("3a", "3a_08-a", "Celestial Resort A - Room 08-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-a"], [door for _, door in all_doors.items() if door.room_name == "3a_08-a"], "Huge Mess", "3a_08-a_west"), + "3a_09-b": Room("3a", "3a_09-b", "Celestial Resort A - Room 09-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_09-b"], [door for _, door in all_doors.items() if door.room_name == "3a_09-b"]), + "3a_10-x": Room("3a", "3a_10-x", "Celestial Resort A - Room 10-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-x"], [door for _, door in all_doors.items() if door.room_name == "3a_10-x"]), + "3a_11-x": Room("3a", "3a_11-x", "Celestial Resort A - Room 11-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-x"], [door for _, door in all_doors.items() if door.room_name == "3a_11-x"]), + "3a_11-y": Room("3a", "3a_11-y", "Celestial Resort A - Room 11-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-y"], [door for _, door in all_doors.items() if door.room_name == "3a_11-y"]), + "3a_12-y": Room("3a", "3a_12-y", "Celestial Resort A - Room 12-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-y"], [door for _, door in all_doors.items() if door.room_name == "3a_12-y"]), + "3a_11-z": Room("3a", "3a_11-z", "Celestial Resort A - Room 11-z", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-z"], [door for _, door in all_doors.items() if door.room_name == "3a_11-z"]), + "3a_10-z": Room("3a", "3a_10-z", "Celestial Resort A - Room 10-z", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-z"], [door for _, door in all_doors.items() if door.room_name == "3a_10-z"]), + "3a_10-y": Room("3a", "3a_10-y", "Celestial Resort A - Room 10-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-y"], [door for _, door in all_doors.items() if door.room_name == "3a_10-y"]), + "3a_10-c": Room("3a", "3a_10-c", "Celestial Resort A - Room 10-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-c"], [door for _, door in all_doors.items() if door.room_name == "3a_10-c"]), + "3a_11-c": Room("3a", "3a_11-c", "Celestial Resort A - Room 11-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-c"], [door for _, door in all_doors.items() if door.room_name == "3a_11-c"]), + "3a_12-c": Room("3a", "3a_12-c", "Celestial Resort A - Room 12-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-c"], [door for _, door in all_doors.items() if door.room_name == "3a_12-c"]), + "3a_12-d": Room("3a", "3a_12-d", "Celestial Resort A - Room 12-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-d"], [door for _, door in all_doors.items() if door.room_name == "3a_12-d"]), + "3a_11-d": Room("3a", "3a_11-d", "Celestial Resort A - Room 11-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-d"], [door for _, door in all_doors.items() if door.room_name == "3a_11-d"]), + "3a_10-d": Room("3a", "3a_10-d", "Celestial Resort A - Room 10-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-d"], [door for _, door in all_doors.items() if door.room_name == "3a_10-d"]), + "3a_11-b": Room("3a", "3a_11-b", "Celestial Resort A - Room 11-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-b"], [door for _, door in all_doors.items() if door.room_name == "3a_11-b"]), + "3a_12-b": Room("3a", "3a_12-b", "Celestial Resort A - Room 12-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-b"], [door for _, door in all_doors.items() if door.room_name == "3a_12-b"]), + "3a_13-b": Room("3a", "3a_13-b", "Celestial Resort A - Room 13-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-b"], [door for _, door in all_doors.items() if door.room_name == "3a_13-b"]), + "3a_13-a": Room("3a", "3a_13-a", "Celestial Resort A - Room 13-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-a"], [door for _, door in all_doors.items() if door.room_name == "3a_13-a"]), + "3a_13-x": Room("3a", "3a_13-x", "Celestial Resort A - Room 13-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-x"], [door for _, door in all_doors.items() if door.room_name == "3a_13-x"]), + "3a_12-x": Room("3a", "3a_12-x", "Celestial Resort A - Room 12-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-x"], [door for _, door in all_doors.items() if door.room_name == "3a_12-x"]), + "3a_11-a": Room("3a", "3a_11-a", "Celestial Resort A - Room 11-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-a"], [door for _, door in all_doors.items() if door.room_name == "3a_11-a"]), + "3a_08-x": Room("3a", "3a_08-x", "Celestial Resort A - Room 08-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-x"], [door for _, door in all_doors.items() if door.room_name == "3a_08-x"]), + "3a_09-d": Room("3a", "3a_09-d", "Celestial Resort A - Room 09-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_09-d"], [door for _, door in all_doors.items() if door.room_name == "3a_09-d"], "Elevator Shaft", "3a_09-d_bottom"), + "3a_08-d": Room("3a", "3a_08-d", "Celestial Resort A - Room 08-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-d"], [door for _, door in all_doors.items() if door.room_name == "3a_08-d"]), + "3a_06-d": Room("3a", "3a_06-d", "Celestial Resort A - Room 06-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-d"], [door for _, door in all_doors.items() if door.room_name == "3a_06-d"]), + "3a_04-d": Room("3a", "3a_04-d", "Celestial Resort A - Room 04-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-d"], [door for _, door in all_doors.items() if door.room_name == "3a_04-d"]), + "3a_04-c": Room("3a", "3a_04-c", "Celestial Resort A - Room 04-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-c"], [door for _, door in all_doors.items() if door.room_name == "3a_04-c"]), + "3a_02-c": Room("3a", "3a_02-c", "Celestial Resort A - Room 02-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-c"], [door for _, door in all_doors.items() if door.room_name == "3a_02-c"]), + "3a_03-b": Room("3a", "3a_03-b", "Celestial Resort A - Room 03-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_03-b"], [door for _, door in all_doors.items() if door.room_name == "3a_03-b"]), + "3a_01-c": Room("3a", "3a_01-c", "Celestial Resort A - Room 01-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_01-c"], [door for _, door in all_doors.items() if door.room_name == "3a_01-c"]), + "3a_02-d": Room("3a", "3a_02-d", "Celestial Resort A - Room 02-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-d"], [door for _, door in all_doors.items() if door.room_name == "3a_02-d"]), + "3a_00-d": Room("3a", "3a_00-d", "Celestial Resort A - Room 00-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-d"], [door for _, door in all_doors.items() if door.room_name == "3a_00-d"], "Presidential Suite", "3a_00-d_east"), + "3a_roof00": Room("3a", "3a_roof00", "Celestial Resort A - Room roof00", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof00"], [door for _, door in all_doors.items() if door.room_name == "3a_roof00"]), + "3a_roof01": Room("3a", "3a_roof01", "Celestial Resort A - Room roof01", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof01"], [door for _, door in all_doors.items() if door.room_name == "3a_roof01"]), + "3a_roof02": Room("3a", "3a_roof02", "Celestial Resort A - Room roof02", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof02"], [door for _, door in all_doors.items() if door.room_name == "3a_roof02"]), + "3a_roof03": Room("3a", "3a_roof03", "Celestial Resort A - Room roof03", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof03"], [door for _, door in all_doors.items() if door.room_name == "3a_roof03"]), + "3a_roof04": Room("3a", "3a_roof04", "Celestial Resort A - Room roof04", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof04"], [door for _, door in all_doors.items() if door.room_name == "3a_roof04"]), + "3a_roof05": Room("3a", "3a_roof05", "Celestial Resort A - Room roof05", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof05"], [door for _, door in all_doors.items() if door.room_name == "3a_roof05"]), + "3a_roof06b": Room("3a", "3a_roof06b", "Celestial Resort A - Room roof06b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof06b"], [door for _, door in all_doors.items() if door.room_name == "3a_roof06b"]), + "3a_roof06": Room("3a", "3a_roof06", "Celestial Resort A - Room roof06", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof06"], [door for _, door in all_doors.items() if door.room_name == "3a_roof06"]), + "3a_roof07": Room("3a", "3a_roof07", "Celestial Resort A - Room roof07", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof07"], [door for _, door in all_doors.items() if door.room_name == "3a_roof07"]), + + "3b_00": Room("3b", "3b_00", "Celestial Resort B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "3b_00"], [door for _, door in all_doors.items() if door.room_name == "3b_00"], "Start", "3b_00_west"), + "3b_back": Room("3b", "3b_back", "Celestial Resort B - Room back", [reg for _, reg in all_regions.items() if reg.room_name == "3b_back"], [door for _, door in all_doors.items() if door.room_name == "3b_back"]), + "3b_01": Room("3b", "3b_01", "Celestial Resort B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "3b_01"], [door for _, door in all_doors.items() if door.room_name == "3b_01"]), + "3b_02": Room("3b", "3b_02", "Celestial Resort B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "3b_02"], [door for _, door in all_doors.items() if door.room_name == "3b_02"]), + "3b_03": Room("3b", "3b_03", "Celestial Resort B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "3b_03"], [door for _, door in all_doors.items() if door.room_name == "3b_03"]), + "3b_04": Room("3b", "3b_04", "Celestial Resort B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "3b_04"], [door for _, door in all_doors.items() if door.room_name == "3b_04"]), + "3b_05": Room("3b", "3b_05", "Celestial Resort B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "3b_05"], [door for _, door in all_doors.items() if door.room_name == "3b_05"]), + "3b_06": Room("3b", "3b_06", "Celestial Resort B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "3b_06"], [door for _, door in all_doors.items() if door.room_name == "3b_06"], "Staff Quarters", "3b_06_west"), + "3b_07": Room("3b", "3b_07", "Celestial Resort B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "3b_07"], [door for _, door in all_doors.items() if door.room_name == "3b_07"]), + "3b_08": Room("3b", "3b_08", "Celestial Resort B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "3b_08"], [door for _, door in all_doors.items() if door.room_name == "3b_08"]), + "3b_09": Room("3b", "3b_09", "Celestial Resort B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "3b_09"], [door for _, door in all_doors.items() if door.room_name == "3b_09"]), + "3b_10": Room("3b", "3b_10", "Celestial Resort B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "3b_10"], [door for _, door in all_doors.items() if door.room_name == "3b_10"]), + "3b_11": Room("3b", "3b_11", "Celestial Resort B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "3b_11"], [door for _, door in all_doors.items() if door.room_name == "3b_11"], "Library", "3b_11_west"), + "3b_13": Room("3b", "3b_13", "Celestial Resort B - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "3b_13"], [door for _, door in all_doors.items() if door.room_name == "3b_13"]), + "3b_14": Room("3b", "3b_14", "Celestial Resort B - Room 14", [reg for _, reg in all_regions.items() if reg.room_name == "3b_14"], [door for _, door in all_doors.items() if door.room_name == "3b_14"]), + "3b_15": Room("3b", "3b_15", "Celestial Resort B - Room 15", [reg for _, reg in all_regions.items() if reg.room_name == "3b_15"], [door for _, door in all_doors.items() if door.room_name == "3b_15"]), + "3b_12": Room("3b", "3b_12", "Celestial Resort B - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "3b_12"], [door for _, door in all_doors.items() if door.room_name == "3b_12"]), + "3b_16": Room("3b", "3b_16", "Celestial Resort B - Room 16", [reg for _, reg in all_regions.items() if reg.room_name == "3b_16"], [door for _, door in all_doors.items() if door.room_name == "3b_16"], "Rooftop", "3b_16_west"), + "3b_17": Room("3b", "3b_17", "Celestial Resort B - Room 17", [reg for _, reg in all_regions.items() if reg.room_name == "3b_17"], [door for _, door in all_doors.items() if door.room_name == "3b_17"]), + "3b_18": Room("3b", "3b_18", "Celestial Resort B - Room 18", [reg for _, reg in all_regions.items() if reg.room_name == "3b_18"], [door for _, door in all_doors.items() if door.room_name == "3b_18"]), + "3b_19": Room("3b", "3b_19", "Celestial Resort B - Room 19", [reg for _, reg in all_regions.items() if reg.room_name == "3b_19"], [door for _, door in all_doors.items() if door.room_name == "3b_19"]), + "3b_21": Room("3b", "3b_21", "Celestial Resort B - Room 21", [reg for _, reg in all_regions.items() if reg.room_name == "3b_21"], [door for _, door in all_doors.items() if door.room_name == "3b_21"]), + "3b_20": Room("3b", "3b_20", "Celestial Resort B - Room 20", [reg for _, reg in all_regions.items() if reg.room_name == "3b_20"], [door for _, door in all_doors.items() if door.room_name == "3b_20"]), + "3b_end": Room("3b", "3b_end", "Celestial Resort B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "3b_end"], [door for _, door in all_doors.items() if door.room_name == "3b_end"]), + + "3c_00": Room("3c", "3c_00", "Celestial Resort C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "3c_00"], [door for _, door in all_doors.items() if door.room_name == "3c_00"], "Start", "3c_00_west"), + "3c_01": Room("3c", "3c_01", "Celestial Resort C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "3c_01"], [door for _, door in all_doors.items() if door.room_name == "3c_01"]), + "3c_02": Room("3c", "3c_02", "Celestial Resort C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "3c_02"], [door for _, door in all_doors.items() if door.room_name == "3c_02"]), + + "4a_a-00": Room("4a", "4a_a-00", "Golden Ridge A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-00"], [door for _, door in all_doors.items() if door.room_name == "4a_a-00"], "Start", "4a_a-00_west"), + "4a_a-01": Room("4a", "4a_a-01", "Golden Ridge A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-01"], [door for _, door in all_doors.items() if door.room_name == "4a_a-01"]), + "4a_a-01x": Room("4a", "4a_a-01x", "Golden Ridge A - Room a-01x", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-01x"], [door for _, door in all_doors.items() if door.room_name == "4a_a-01x"]), + "4a_a-02": Room("4a", "4a_a-02", "Golden Ridge A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-02"], [door for _, door in all_doors.items() if door.room_name == "4a_a-02"]), + "4a_a-03": Room("4a", "4a_a-03", "Golden Ridge A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-03"], [door for _, door in all_doors.items() if door.room_name == "4a_a-03"]), + "4a_a-04": Room("4a", "4a_a-04", "Golden Ridge A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-04"], [door for _, door in all_doors.items() if door.room_name == "4a_a-04"]), + "4a_a-05": Room("4a", "4a_a-05", "Golden Ridge A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-05"], [door for _, door in all_doors.items() if door.room_name == "4a_a-05"]), + "4a_a-06": Room("4a", "4a_a-06", "Golden Ridge A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-06"], [door for _, door in all_doors.items() if door.room_name == "4a_a-06"]), + "4a_a-07": Room("4a", "4a_a-07", "Golden Ridge A - Room a-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-07"], [door for _, door in all_doors.items() if door.room_name == "4a_a-07"]), + "4a_a-08": Room("4a", "4a_a-08", "Golden Ridge A - Room a-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-08"], [door for _, door in all_doors.items() if door.room_name == "4a_a-08"]), + "4a_a-10": Room("4a", "4a_a-10", "Golden Ridge A - Room a-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-10"], [door for _, door in all_doors.items() if door.room_name == "4a_a-10"]), + "4a_a-11": Room("4a", "4a_a-11", "Golden Ridge A - Room a-11", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-11"], [door for _, door in all_doors.items() if door.room_name == "4a_a-11"]), + "4a_a-09": Room("4a", "4a_a-09", "Golden Ridge A - Room a-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-09"], [door for _, door in all_doors.items() if door.room_name == "4a_a-09"]), + "4a_b-00": Room("4a", "4a_b-00", "Golden Ridge A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-00"], [door for _, door in all_doors.items() if door.room_name == "4a_b-00"], "Shrine", "4a_b-00_south"), + "4a_b-01": Room("4a", "4a_b-01", "Golden Ridge A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-01"], [door for _, door in all_doors.items() if door.room_name == "4a_b-01"]), + "4a_b-04": Room("4a", "4a_b-04", "Golden Ridge A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-04"], [door for _, door in all_doors.items() if door.room_name == "4a_b-04"]), + "4a_b-06": Room("4a", "4a_b-06", "Golden Ridge A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-06"], [door for _, door in all_doors.items() if door.room_name == "4a_b-06"]), + "4a_b-07": Room("4a", "4a_b-07", "Golden Ridge A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-07"], [door for _, door in all_doors.items() if door.room_name == "4a_b-07"]), + "4a_b-03": Room("4a", "4a_b-03", "Golden Ridge A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-03"], [door for _, door in all_doors.items() if door.room_name == "4a_b-03"]), + "4a_b-02": Room("4a", "4a_b-02", "Golden Ridge A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-02"], [door for _, door in all_doors.items() if door.room_name == "4a_b-02"]), + "4a_b-sec": Room("4a", "4a_b-sec", "Golden Ridge A - Room b-sec", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-sec"], [door for _, door in all_doors.items() if door.room_name == "4a_b-sec"]), + "4a_b-secb": Room("4a", "4a_b-secb", "Golden Ridge A - Room b-secb", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-secb"], [door for _, door in all_doors.items() if door.room_name == "4a_b-secb"]), + "4a_b-05": Room("4a", "4a_b-05", "Golden Ridge A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-05"], [door for _, door in all_doors.items() if door.room_name == "4a_b-05"]), + "4a_b-08b": Room("4a", "4a_b-08b", "Golden Ridge A - Room b-08b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-08b"], [door for _, door in all_doors.items() if door.room_name == "4a_b-08b"]), + "4a_b-08": Room("4a", "4a_b-08", "Golden Ridge A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-08"], [door for _, door in all_doors.items() if door.room_name == "4a_b-08"]), + "4a_c-00": Room("4a", "4a_c-00", "Golden Ridge A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-00"], [door for _, door in all_doors.items() if door.room_name == "4a_c-00"], "Old Trail", "4a_c-00_west"), + "4a_c-01": Room("4a", "4a_c-01", "Golden Ridge A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-01"], [door for _, door in all_doors.items() if door.room_name == "4a_c-01"]), + "4a_c-02": Room("4a", "4a_c-02", "Golden Ridge A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-02"], [door for _, door in all_doors.items() if door.room_name == "4a_c-02"]), + "4a_c-04": Room("4a", "4a_c-04", "Golden Ridge A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-04"], [door for _, door in all_doors.items() if door.room_name == "4a_c-04"]), + "4a_c-05": Room("4a", "4a_c-05", "Golden Ridge A - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-05"], [door for _, door in all_doors.items() if door.room_name == "4a_c-05"]), + "4a_c-06": Room("4a", "4a_c-06", "Golden Ridge A - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-06"], [door for _, door in all_doors.items() if door.room_name == "4a_c-06"]), + "4a_c-06b": Room("4a", "4a_c-06b", "Golden Ridge A - Room c-06b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-06b"], [door for _, door in all_doors.items() if door.room_name == "4a_c-06b"]), + "4a_c-09": Room("4a", "4a_c-09", "Golden Ridge A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-09"], [door for _, door in all_doors.items() if door.room_name == "4a_c-09"]), + "4a_c-07": Room("4a", "4a_c-07", "Golden Ridge A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-07"], [door for _, door in all_doors.items() if door.room_name == "4a_c-07"]), + "4a_c-08": Room("4a", "4a_c-08", "Golden Ridge A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-08"], [door for _, door in all_doors.items() if door.room_name == "4a_c-08"]), + "4a_c-10": Room("4a", "4a_c-10", "Golden Ridge A - Room c-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-10"], [door for _, door in all_doors.items() if door.room_name == "4a_c-10"]), + "4a_d-00": Room("4a", "4a_d-00", "Golden Ridge A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-00"], [door for _, door in all_doors.items() if door.room_name == "4a_d-00"], "Cliff Face", "4a_d-00_west"), + "4a_d-00b": Room("4a", "4a_d-00b", "Golden Ridge A - Room d-00b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-00b"], [door for _, door in all_doors.items() if door.room_name == "4a_d-00b"]), + "4a_d-01": Room("4a", "4a_d-01", "Golden Ridge A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-01"], [door for _, door in all_doors.items() if door.room_name == "4a_d-01"]), + "4a_d-02": Room("4a", "4a_d-02", "Golden Ridge A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-02"], [door for _, door in all_doors.items() if door.room_name == "4a_d-02"]), + "4a_d-03": Room("4a", "4a_d-03", "Golden Ridge A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-03"], [door for _, door in all_doors.items() if door.room_name == "4a_d-03"]), + "4a_d-04": Room("4a", "4a_d-04", "Golden Ridge A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-04"], [door for _, door in all_doors.items() if door.room_name == "4a_d-04"]), + "4a_d-05": Room("4a", "4a_d-05", "Golden Ridge A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-05"], [door for _, door in all_doors.items() if door.room_name == "4a_d-05"]), + "4a_d-06": Room("4a", "4a_d-06", "Golden Ridge A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-06"], [door for _, door in all_doors.items() if door.room_name == "4a_d-06"]), + "4a_d-07": Room("4a", "4a_d-07", "Golden Ridge A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-07"], [door for _, door in all_doors.items() if door.room_name == "4a_d-07"]), + "4a_d-08": Room("4a", "4a_d-08", "Golden Ridge A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-08"], [door for _, door in all_doors.items() if door.room_name == "4a_d-08"]), + "4a_d-09": Room("4a", "4a_d-09", "Golden Ridge A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-09"], [door for _, door in all_doors.items() if door.room_name == "4a_d-09"]), + "4a_d-10": Room("4a", "4a_d-10", "Golden Ridge A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-10"], [door for _, door in all_doors.items() if door.room_name == "4a_d-10"]), + + "4b_a-00": Room("4b", "4b_a-00", "Golden Ridge B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-00"], [door for _, door in all_doors.items() if door.room_name == "4b_a-00"], "Start", "4b_a-00_west"), + "4b_a-01": Room("4b", "4b_a-01", "Golden Ridge B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-01"], [door for _, door in all_doors.items() if door.room_name == "4b_a-01"]), + "4b_a-02": Room("4b", "4b_a-02", "Golden Ridge B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-02"], [door for _, door in all_doors.items() if door.room_name == "4b_a-02"]), + "4b_a-03": Room("4b", "4b_a-03", "Golden Ridge B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-03"], [door for _, door in all_doors.items() if door.room_name == "4b_a-03"]), + "4b_a-04": Room("4b", "4b_a-04", "Golden Ridge B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-04"], [door for _, door in all_doors.items() if door.room_name == "4b_a-04"]), + "4b_b-00": Room("4b", "4b_b-00", "Golden Ridge B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-00"], [door for _, door in all_doors.items() if door.room_name == "4b_b-00"], "Stepping Stones", "4b_b-00_west"), + "4b_b-01": Room("4b", "4b_b-01", "Golden Ridge B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-01"], [door for _, door in all_doors.items() if door.room_name == "4b_b-01"]), + "4b_b-02": Room("4b", "4b_b-02", "Golden Ridge B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-02"], [door for _, door in all_doors.items() if door.room_name == "4b_b-02"]), + "4b_b-03": Room("4b", "4b_b-03", "Golden Ridge B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-03"], [door for _, door in all_doors.items() if door.room_name == "4b_b-03"]), + "4b_b-04": Room("4b", "4b_b-04", "Golden Ridge B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-04"], [door for _, door in all_doors.items() if door.room_name == "4b_b-04"]), + "4b_c-00": Room("4b", "4b_c-00", "Golden Ridge B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-00"], [door for _, door in all_doors.items() if door.room_name == "4b_c-00"], "Gusty Canyon", "4b_c-00_west"), + "4b_c-01": Room("4b", "4b_c-01", "Golden Ridge B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-01"], [door for _, door in all_doors.items() if door.room_name == "4b_c-01"]), + "4b_c-02": Room("4b", "4b_c-02", "Golden Ridge B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-02"], [door for _, door in all_doors.items() if door.room_name == "4b_c-02"]), + "4b_c-03": Room("4b", "4b_c-03", "Golden Ridge B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-03"], [door for _, door in all_doors.items() if door.room_name == "4b_c-03"]), + "4b_c-04": Room("4b", "4b_c-04", "Golden Ridge B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-04"], [door for _, door in all_doors.items() if door.room_name == "4b_c-04"]), + "4b_d-00": Room("4b", "4b_d-00", "Golden Ridge B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-00"], [door for _, door in all_doors.items() if door.room_name == "4b_d-00"], "Eye of the Storm", "4b_d-00_west"), + "4b_d-01": Room("4b", "4b_d-01", "Golden Ridge B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-01"], [door for _, door in all_doors.items() if door.room_name == "4b_d-01"]), + "4b_d-02": Room("4b", "4b_d-02", "Golden Ridge B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-02"], [door for _, door in all_doors.items() if door.room_name == "4b_d-02"]), + "4b_d-03": Room("4b", "4b_d-03", "Golden Ridge B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-03"], [door for _, door in all_doors.items() if door.room_name == "4b_d-03"]), + "4b_end": Room("4b", "4b_end", "Golden Ridge B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "4b_end"], [door for _, door in all_doors.items() if door.room_name == "4b_end"]), + + "4c_00": Room("4c", "4c_00", "Golden Ridge C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "4c_00"], [door for _, door in all_doors.items() if door.room_name == "4c_00"], "Start", "4c_00_west"), + "4c_01": Room("4c", "4c_01", "Golden Ridge C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "4c_01"], [door for _, door in all_doors.items() if door.room_name == "4c_01"]), + "4c_02": Room("4c", "4c_02", "Golden Ridge C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "4c_02"], [door for _, door in all_doors.items() if door.room_name == "4c_02"]), + + "5a_a-00b": Room("5a", "5a_a-00b", "Mirror Temple A - Room a-00b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00b"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00b"], "Start", "5a_a-00b_west"), + "5a_a-00x": Room("5a", "5a_a-00x", "Mirror Temple A - Room a-00x", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00x"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00x"]), + "5a_a-00d": Room("5a", "5a_a-00d", "Mirror Temple A - Room a-00d", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00d"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00d"]), + "5a_a-00c": Room("5a", "5a_a-00c", "Mirror Temple A - Room a-00c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00c"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00c"]), + "5a_a-00": Room("5a", "5a_a-00", "Mirror Temple A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00"]), + "5a_a-01": Room("5a", "5a_a-01", "Mirror Temple A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-01"], [door for _, door in all_doors.items() if door.room_name == "5a_a-01"]), + "5a_a-02": Room("5a", "5a_a-02", "Mirror Temple A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-02"], [door for _, door in all_doors.items() if door.room_name == "5a_a-02"]), + "5a_a-03": Room("5a", "5a_a-03", "Mirror Temple A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-03"], [door for _, door in all_doors.items() if door.room_name == "5a_a-03"]), + "5a_a-04": Room("5a", "5a_a-04", "Mirror Temple A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-04"], [door for _, door in all_doors.items() if door.room_name == "5a_a-04"]), + "5a_a-05": Room("5a", "5a_a-05", "Mirror Temple A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-05"], [door for _, door in all_doors.items() if door.room_name == "5a_a-05"]), + "5a_a-06": Room("5a", "5a_a-06", "Mirror Temple A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-06"], [door for _, door in all_doors.items() if door.room_name == "5a_a-06"]), + "5a_a-07": Room("5a", "5a_a-07", "Mirror Temple A - Room a-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-07"], [door for _, door in all_doors.items() if door.room_name == "5a_a-07"]), + "5a_a-08": Room("5a", "5a_a-08", "Mirror Temple A - Room a-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-08"], [door for _, door in all_doors.items() if door.room_name == "5a_a-08"]), + "5a_a-10": Room("5a", "5a_a-10", "Mirror Temple A - Room a-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-10"], [door for _, door in all_doors.items() if door.room_name == "5a_a-10"]), + "5a_a-09": Room("5a", "5a_a-09", "Mirror Temple A - Room a-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-09"], [door for _, door in all_doors.items() if door.room_name == "5a_a-09"]), + "5a_a-11": Room("5a", "5a_a-11", "Mirror Temple A - Room a-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-11"], [door for _, door in all_doors.items() if door.room_name == "5a_a-11"]), + "5a_a-12": Room("5a", "5a_a-12", "Mirror Temple A - Room a-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-12"], [door for _, door in all_doors.items() if door.room_name == "5a_a-12"]), + "5a_a-15": Room("5a", "5a_a-15", "Mirror Temple A - Room a-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-15"], [door for _, door in all_doors.items() if door.room_name == "5a_a-15"]), + "5a_a-14": Room("5a", "5a_a-14", "Mirror Temple A - Room a-14", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-14"], [door for _, door in all_doors.items() if door.room_name == "5a_a-14"]), + "5a_a-13": Room("5a", "5a_a-13", "Mirror Temple A - Room a-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-13"], [door for _, door in all_doors.items() if door.room_name == "5a_a-13"]), + "5a_b-00": Room("5a", "5a_b-00", "Mirror Temple A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-00"], [door for _, door in all_doors.items() if door.room_name == "5a_b-00"], "Depths", "5a_b-00_west"), + "5a_b-18": Room("5a", "5a_b-18", "Mirror Temple A - Room b-18", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-18"], [door for _, door in all_doors.items() if door.room_name == "5a_b-18"]), + "5a_b-01": Room("5a", "5a_b-01", "Mirror Temple A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01"]), + "5a_b-01c": Room("5a", "5a_b-01c", "Mirror Temple A - Room b-01c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01c"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01c"]), + "5a_b-20": Room("5a", "5a_b-20", "Mirror Temple A - Room b-20", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-20"], [door for _, door in all_doors.items() if door.room_name == "5a_b-20"]), + "5a_b-21": Room("5a", "5a_b-21", "Mirror Temple A - Room b-21", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-21"], [door for _, door in all_doors.items() if door.room_name == "5a_b-21"]), + "5a_b-01b": Room("5a", "5a_b-01b", "Mirror Temple A - Room b-01b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01b"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01b"]), + "5a_b-02": Room("5a", "5a_b-02", "Mirror Temple A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-02"], [door for _, door in all_doors.items() if door.room_name == "5a_b-02"]), + "5a_b-03": Room("5a", "5a_b-03", "Mirror Temple A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-03"], [door for _, door in all_doors.items() if door.room_name == "5a_b-03"]), + "5a_b-05": Room("5a", "5a_b-05", "Mirror Temple A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-05"], [door for _, door in all_doors.items() if door.room_name == "5a_b-05"]), + "5a_b-04": Room("5a", "5a_b-04", "Mirror Temple A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-04"], [door for _, door in all_doors.items() if door.room_name == "5a_b-04"]), + "5a_b-07": Room("5a", "5a_b-07", "Mirror Temple A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-07"], [door for _, door in all_doors.items() if door.room_name == "5a_b-07"]), + "5a_b-08": Room("5a", "5a_b-08", "Mirror Temple A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-08"], [door for _, door in all_doors.items() if door.room_name == "5a_b-08"]), + "5a_b-09": Room("5a", "5a_b-09", "Mirror Temple A - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-09"], [door for _, door in all_doors.items() if door.room_name == "5a_b-09"]), + "5a_b-10": Room("5a", "5a_b-10", "Mirror Temple A - Room b-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-10"], [door for _, door in all_doors.items() if door.room_name == "5a_b-10"]), + "5a_b-11": Room("5a", "5a_b-11", "Mirror Temple A - Room b-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-11"], [door for _, door in all_doors.items() if door.room_name == "5a_b-11"]), + "5a_b-12": Room("5a", "5a_b-12", "Mirror Temple A - Room b-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-12"], [door for _, door in all_doors.items() if door.room_name == "5a_b-12"]), + "5a_b-13": Room("5a", "5a_b-13", "Mirror Temple A - Room b-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-13"], [door for _, door in all_doors.items() if door.room_name == "5a_b-13"]), + "5a_b-17": Room("5a", "5a_b-17", "Mirror Temple A - Room b-17", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-17"], [door for _, door in all_doors.items() if door.room_name == "5a_b-17"]), + "5a_b-22": Room("5a", "5a_b-22", "Mirror Temple A - Room b-22", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-22"], [door for _, door in all_doors.items() if door.room_name == "5a_b-22"]), + "5a_b-06": Room("5a", "5a_b-06", "Mirror Temple A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-06"], [door for _, door in all_doors.items() if door.room_name == "5a_b-06"]), + "5a_b-19": Room("5a", "5a_b-19", "Mirror Temple A - Room b-19", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-19"], [door for _, door in all_doors.items() if door.room_name == "5a_b-19"]), + "5a_b-14": Room("5a", "5a_b-14", "Mirror Temple A - Room b-14", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-14"], [door for _, door in all_doors.items() if door.room_name == "5a_b-14"]), + "5a_b-15": Room("5a", "5a_b-15", "Mirror Temple A - Room b-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-15"], [door for _, door in all_doors.items() if door.room_name == "5a_b-15"]), + "5a_b-16": Room("5a", "5a_b-16", "Mirror Temple A - Room b-16", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-16"], [door for _, door in all_doors.items() if door.room_name == "5a_b-16"]), + "5a_void": Room("5a", "5a_void", "Mirror Temple A - Room void", [reg for _, reg in all_regions.items() if reg.room_name == "5a_void"], [door for _, door in all_doors.items() if door.room_name == "5a_void"]), + "5a_c-00": Room("5a", "5a_c-00", "Mirror Temple A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-00"], [door for _, door in all_doors.items() if door.room_name == "5a_c-00"], "Unravelling", "5a_c-00_top"), + "5a_c-01": Room("5a", "5a_c-01", "Mirror Temple A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01"]), + "5a_c-01b": Room("5a", "5a_c-01b", "Mirror Temple A - Room c-01b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01b"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01b"]), + "5a_c-01c": Room("5a", "5a_c-01c", "Mirror Temple A - Room c-01c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01c"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01c"]), + "5a_c-08b": Room("5a", "5a_c-08b", "Mirror Temple A - Room c-08b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-08b"], [door for _, door in all_doors.items() if door.room_name == "5a_c-08b"]), + "5a_c-08": Room("5a", "5a_c-08", "Mirror Temple A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-08"], [door for _, door in all_doors.items() if door.room_name == "5a_c-08"]), + "5a_c-10": Room("5a", "5a_c-10", "Mirror Temple A - Room c-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-10"], [door for _, door in all_doors.items() if door.room_name == "5a_c-10"]), + "5a_c-12": Room("5a", "5a_c-12", "Mirror Temple A - Room c-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-12"], [door for _, door in all_doors.items() if door.room_name == "5a_c-12"]), + "5a_c-07": Room("5a", "5a_c-07", "Mirror Temple A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-07"], [door for _, door in all_doors.items() if door.room_name == "5a_c-07"]), + "5a_c-11": Room("5a", "5a_c-11", "Mirror Temple A - Room c-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-11"], [door for _, door in all_doors.items() if door.room_name == "5a_c-11"]), + "5a_c-09": Room("5a", "5a_c-09", "Mirror Temple A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-09"], [door for _, door in all_doors.items() if door.room_name == "5a_c-09"]), + "5a_c-13": Room("5a", "5a_c-13", "Mirror Temple A - Room c-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-13"], [door for _, door in all_doors.items() if door.room_name == "5a_c-13"]), + "5a_d-00": Room("5a", "5a_d-00", "Mirror Temple A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-00"], [door for _, door in all_doors.items() if door.room_name == "5a_d-00"], "Search", "5a_d-00_south"), + "5a_d-01": Room("5a", "5a_d-01", "Mirror Temple A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-01"], [door for _, door in all_doors.items() if door.room_name == "5a_d-01"]), + "5a_d-09": Room("5a", "5a_d-09", "Mirror Temple A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-09"], [door for _, door in all_doors.items() if door.room_name == "5a_d-09"]), + "5a_d-04": Room("5a", "5a_d-04", "Mirror Temple A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-04"], [door for _, door in all_doors.items() if door.room_name == "5a_d-04"]), + "5a_d-05": Room("5a", "5a_d-05", "Mirror Temple A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-05"], [door for _, door in all_doors.items() if door.room_name == "5a_d-05"]), + "5a_d-06": Room("5a", "5a_d-06", "Mirror Temple A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-06"], [door for _, door in all_doors.items() if door.room_name == "5a_d-06"]), + "5a_d-07": Room("5a", "5a_d-07", "Mirror Temple A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-07"], [door for _, door in all_doors.items() if door.room_name == "5a_d-07"]), + "5a_d-02": Room("5a", "5a_d-02", "Mirror Temple A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-02"], [door for _, door in all_doors.items() if door.room_name == "5a_d-02"]), + "5a_d-03": Room("5a", "5a_d-03", "Mirror Temple A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-03"], [door for _, door in all_doors.items() if door.room_name == "5a_d-03"]), + "5a_d-15": Room("5a", "5a_d-15", "Mirror Temple A - Room d-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-15"], [door for _, door in all_doors.items() if door.room_name == "5a_d-15"]), + "5a_d-13": Room("5a", "5a_d-13", "Mirror Temple A - Room d-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-13"], [door for _, door in all_doors.items() if door.room_name == "5a_d-13"]), + "5a_d-19b": Room("5a", "5a_d-19b", "Mirror Temple A - Room d-19b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-19b"], [door for _, door in all_doors.items() if door.room_name == "5a_d-19b"]), + "5a_d-19": Room("5a", "5a_d-19", "Mirror Temple A - Room d-19", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-19"], [door for _, door in all_doors.items() if door.room_name == "5a_d-19"]), + "5a_d-10": Room("5a", "5a_d-10", "Mirror Temple A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-10"], [door for _, door in all_doors.items() if door.room_name == "5a_d-10"]), + "5a_d-20": Room("5a", "5a_d-20", "Mirror Temple A - Room d-20", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-20"], [door for _, door in all_doors.items() if door.room_name == "5a_d-20"]), + "5a_e-00": Room("5a", "5a_e-00", "Mirror Temple A - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-00"], [door for _, door in all_doors.items() if door.room_name == "5a_e-00"], "Rescue", "5a_e-00_west"), + "5a_e-01": Room("5a", "5a_e-01", "Mirror Temple A - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-01"], [door for _, door in all_doors.items() if door.room_name == "5a_e-01"]), + "5a_e-02": Room("5a", "5a_e-02", "Mirror Temple A - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-02"], [door for _, door in all_doors.items() if door.room_name == "5a_e-02"]), + "5a_e-03": Room("5a", "5a_e-03", "Mirror Temple A - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-03"], [door for _, door in all_doors.items() if door.room_name == "5a_e-03"]), + "5a_e-04": Room("5a", "5a_e-04", "Mirror Temple A - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-04"], [door for _, door in all_doors.items() if door.room_name == "5a_e-04"]), + "5a_e-06": Room("5a", "5a_e-06", "Mirror Temple A - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-06"], [door for _, door in all_doors.items() if door.room_name == "5a_e-06"]), + "5a_e-05": Room("5a", "5a_e-05", "Mirror Temple A - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-05"], [door for _, door in all_doors.items() if door.room_name == "5a_e-05"]), + "5a_e-07": Room("5a", "5a_e-07", "Mirror Temple A - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-07"], [door for _, door in all_doors.items() if door.room_name == "5a_e-07"]), + "5a_e-08": Room("5a", "5a_e-08", "Mirror Temple A - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-08"], [door for _, door in all_doors.items() if door.room_name == "5a_e-08"]), + "5a_e-09": Room("5a", "5a_e-09", "Mirror Temple A - Room e-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-09"], [door for _, door in all_doors.items() if door.room_name == "5a_e-09"]), + "5a_e-10": Room("5a", "5a_e-10", "Mirror Temple A - Room e-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-10"], [door for _, door in all_doors.items() if door.room_name == "5a_e-10"]), + "5a_e-11": Room("5a", "5a_e-11", "Mirror Temple A - Room e-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-11"], [door for _, door in all_doors.items() if door.room_name == "5a_e-11"]), + + "5b_start": Room("5b", "5b_start", "Mirror Temple B - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "5b_start"], [door for _, door in all_doors.items() if door.room_name == "5b_start"], "Start", "5b_start_west"), + "5b_a-00": Room("5b", "5b_a-00", "Mirror Temple B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-00"], [door for _, door in all_doors.items() if door.room_name == "5b_a-00"]), + "5b_a-01": Room("5b", "5b_a-01", "Mirror Temple B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-01"], [door for _, door in all_doors.items() if door.room_name == "5b_a-01"]), + "5b_a-02": Room("5b", "5b_a-02", "Mirror Temple B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-02"], [door for _, door in all_doors.items() if door.room_name == "5b_a-02"]), + "5b_b-00": Room("5b", "5b_b-00", "Mirror Temple B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-00"], [door for _, door in all_doors.items() if door.room_name == "5b_b-00"], "Central Chamber", "5b_b-00_south"), + "5b_b-01": Room("5b", "5b_b-01", "Mirror Temple B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-01"], [door for _, door in all_doors.items() if door.room_name == "5b_b-01"]), + "5b_b-04": Room("5b", "5b_b-04", "Mirror Temple B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-04"], [door for _, door in all_doors.items() if door.room_name == "5b_b-04"]), + "5b_b-02": Room("5b", "5b_b-02", "Mirror Temple B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-02"], [door for _, door in all_doors.items() if door.room_name == "5b_b-02"]), + "5b_b-05": Room("5b", "5b_b-05", "Mirror Temple B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-05"], [door for _, door in all_doors.items() if door.room_name == "5b_b-05"]), + "5b_b-06": Room("5b", "5b_b-06", "Mirror Temple B - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-06"], [door for _, door in all_doors.items() if door.room_name == "5b_b-06"]), + "5b_b-07": Room("5b", "5b_b-07", "Mirror Temple B - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-07"], [door for _, door in all_doors.items() if door.room_name == "5b_b-07"]), + "5b_b-03": Room("5b", "5b_b-03", "Mirror Temple B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-03"], [door for _, door in all_doors.items() if door.room_name == "5b_b-03"]), + "5b_b-08": Room("5b", "5b_b-08", "Mirror Temple B - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-08"], [door for _, door in all_doors.items() if door.room_name == "5b_b-08"]), + "5b_b-09": Room("5b", "5b_b-09", "Mirror Temple B - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-09"], [door for _, door in all_doors.items() if door.room_name == "5b_b-09"]), + "5b_c-00": Room("5b", "5b_c-00", "Mirror Temple B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-00"], [door for _, door in all_doors.items() if door.room_name == "5b_c-00"], "Through the Mirror", "5b_c-00_mirror"), + "5b_c-01": Room("5b", "5b_c-01", "Mirror Temple B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-01"], [door for _, door in all_doors.items() if door.room_name == "5b_c-01"]), + "5b_c-02": Room("5b", "5b_c-02", "Mirror Temple B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-02"], [door for _, door in all_doors.items() if door.room_name == "5b_c-02"]), + "5b_c-03": Room("5b", "5b_c-03", "Mirror Temple B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-03"], [door for _, door in all_doors.items() if door.room_name == "5b_c-03"]), + "5b_c-04": Room("5b", "5b_c-04", "Mirror Temple B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-04"], [door for _, door in all_doors.items() if door.room_name == "5b_c-04"]), + "5b_d-00": Room("5b", "5b_d-00", "Mirror Temple B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-00"], [door for _, door in all_doors.items() if door.room_name == "5b_d-00"], "Mix Master", "5b_d-00_west"), + "5b_d-01": Room("5b", "5b_d-01", "Mirror Temple B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-01"], [door for _, door in all_doors.items() if door.room_name == "5b_d-01"]), + "5b_d-02": Room("5b", "5b_d-02", "Mirror Temple B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-02"], [door for _, door in all_doors.items() if door.room_name == "5b_d-02"]), + "5b_d-03": Room("5b", "5b_d-03", "Mirror Temple B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-03"], [door for _, door in all_doors.items() if door.room_name == "5b_d-03"]), + "5b_d-04": Room("5b", "5b_d-04", "Mirror Temple B - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-04"], [door for _, door in all_doors.items() if door.room_name == "5b_d-04"]), + "5b_d-05": Room("5b", "5b_d-05", "Mirror Temple B - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-05"], [door for _, door in all_doors.items() if door.room_name == "5b_d-05"]), + + "5c_00": Room("5c", "5c_00", "Mirror Temple C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "5c_00"], [door for _, door in all_doors.items() if door.room_name == "5c_00"], "Start", "5c_00_west"), + "5c_01": Room("5c", "5c_01", "Mirror Temple C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "5c_01"], [door for _, door in all_doors.items() if door.room_name == "5c_01"]), + "5c_02": Room("5c", "5c_02", "Mirror Temple C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "5c_02"], [door for _, door in all_doors.items() if door.room_name == "5c_02"]), + + "6a_00": Room("6a", "6a_00", "Reflection A - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_00"], [door for _, door in all_doors.items() if door.room_name == "6a_00"], "Start", "6a_00_east"), + "6a_01": Room("6a", "6a_01", "Reflection A - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_01"], [door for _, door in all_doors.items() if door.room_name == "6a_01"]), + "6a_02": Room("6a", "6a_02", "Reflection A - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_02"], [door for _, door in all_doors.items() if door.room_name == "6a_02"]), + "6a_03": Room("6a", "6a_03", "Reflection A - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_03"], [door for _, door in all_doors.items() if door.room_name == "6a_03"]), + "6a_02b": Room("6a", "6a_02b", "Reflection A - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_02b"], [door for _, door in all_doors.items() if door.room_name == "6a_02b"]), + "6a_04": Room("6a", "6a_04", "Reflection A - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04"], [door for _, door in all_doors.items() if door.room_name == "6a_04"], "Hollows", "6a_04_south"), + "6a_04b": Room("6a", "6a_04b", "Reflection A - Room 04b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04b"], [door for _, door in all_doors.items() if door.room_name == "6a_04b"]), + "6a_04c": Room("6a", "6a_04c", "Reflection A - Room 04c", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04c"], [door for _, door in all_doors.items() if door.room_name == "6a_04c"]), + "6a_04d": Room("6a", "6a_04d", "Reflection A - Room 04d", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04d"], [door for _, door in all_doors.items() if door.room_name == "6a_04d"]), + "6a_04e": Room("6a", "6a_04e", "Reflection A - Room 04e", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04e"], [door for _, door in all_doors.items() if door.room_name == "6a_04e"]), + "6a_05": Room("6a", "6a_05", "Reflection A - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "6a_05"], [door for _, door in all_doors.items() if door.room_name == "6a_05"]), + "6a_06": Room("6a", "6a_06", "Reflection A - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "6a_06"], [door for _, door in all_doors.items() if door.room_name == "6a_06"]), + "6a_07": Room("6a", "6a_07", "Reflection A - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "6a_07"], [door for _, door in all_doors.items() if door.room_name == "6a_07"]), + "6a_08a": Room("6a", "6a_08a", "Reflection A - Room 08a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_08a"], [door for _, door in all_doors.items() if door.room_name == "6a_08a"]), + "6a_08b": Room("6a", "6a_08b", "Reflection A - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_08b"], [door for _, door in all_doors.items() if door.room_name == "6a_08b"]), + "6a_09": Room("6a", "6a_09", "Reflection A - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "6a_09"], [door for _, door in all_doors.items() if door.room_name == "6a_09"]), + "6a_10a": Room("6a", "6a_10a", "Reflection A - Room 10a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_10a"], [door for _, door in all_doors.items() if door.room_name == "6a_10a"]), + "6a_10b": Room("6a", "6a_10b", "Reflection A - Room 10b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_10b"], [door for _, door in all_doors.items() if door.room_name == "6a_10b"]), + "6a_11": Room("6a", "6a_11", "Reflection A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "6a_11"], [door for _, door in all_doors.items() if door.room_name == "6a_11"]), + "6a_12a": Room("6a", "6a_12a", "Reflection A - Room 12a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_12a"], [door for _, door in all_doors.items() if door.room_name == "6a_12a"]), + "6a_12b": Room("6a", "6a_12b", "Reflection A - Room 12b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_12b"], [door for _, door in all_doors.items() if door.room_name == "6a_12b"]), + "6a_13": Room("6a", "6a_13", "Reflection A - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "6a_13"], [door for _, door in all_doors.items() if door.room_name == "6a_13"]), + "6a_14a": Room("6a", "6a_14a", "Reflection A - Room 14a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_14a"], [door for _, door in all_doors.items() if door.room_name == "6a_14a"]), + "6a_14b": Room("6a", "6a_14b", "Reflection A - Room 14b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_14b"], [door for _, door in all_doors.items() if door.room_name == "6a_14b"]), + "6a_15": Room("6a", "6a_15", "Reflection A - Room 15", [reg for _, reg in all_regions.items() if reg.room_name == "6a_15"], [door for _, door in all_doors.items() if door.room_name == "6a_15"]), + "6a_16a": Room("6a", "6a_16a", "Reflection A - Room 16a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_16a"], [door for _, door in all_doors.items() if door.room_name == "6a_16a"]), + "6a_16b": Room("6a", "6a_16b", "Reflection A - Room 16b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_16b"], [door for _, door in all_doors.items() if door.room_name == "6a_16b"]), + "6a_17": Room("6a", "6a_17", "Reflection A - Room 17", [reg for _, reg in all_regions.items() if reg.room_name == "6a_17"], [door for _, door in all_doors.items() if door.room_name == "6a_17"]), + "6a_18a": Room("6a", "6a_18a", "Reflection A - Room 18a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_18a"], [door for _, door in all_doors.items() if door.room_name == "6a_18a"]), + "6a_18b": Room("6a", "6a_18b", "Reflection A - Room 18b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_18b"], [door for _, door in all_doors.items() if door.room_name == "6a_18b"]), + "6a_19": Room("6a", "6a_19", "Reflection A - Room 19", [reg for _, reg in all_regions.items() if reg.room_name == "6a_19"], [door for _, door in all_doors.items() if door.room_name == "6a_19"]), + "6a_20": Room("6a", "6a_20", "Reflection A - Room 20", [reg for _, reg in all_regions.items() if reg.room_name == "6a_20"], [door for _, door in all_doors.items() if door.room_name == "6a_20"]), + "6a_b-00": Room("6a", "6a_b-00", "Reflection A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00"], "Reflection", "6a_b-00_west"), + "6a_b-00b": Room("6a", "6a_b-00b", "Reflection A - Room b-00b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00b"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00b"]), + "6a_b-00c": Room("6a", "6a_b-00c", "Reflection A - Room b-00c", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00c"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00c"]), + "6a_b-01": Room("6a", "6a_b-01", "Reflection A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-01"], [door for _, door in all_doors.items() if door.room_name == "6a_b-01"]), + "6a_b-02": Room("6a", "6a_b-02", "Reflection A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-02"], [door for _, door in all_doors.items() if door.room_name == "6a_b-02"]), + "6a_b-02b": Room("6a", "6a_b-02b", "Reflection A - Room b-02b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-02b"], [door for _, door in all_doors.items() if door.room_name == "6a_b-02b"]), + "6a_b-03": Room("6a", "6a_b-03", "Reflection A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-03"], [door for _, door in all_doors.items() if door.room_name == "6a_b-03"]), + "6a_boss-00": Room("6a", "6a_boss-00", "Reflection A - Room boss-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-00"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-00"], "Rock Bottom", "6a_boss-00_west"), + "6a_boss-01": Room("6a", "6a_boss-01", "Reflection A - Room boss-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-01"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-01"]), + "6a_boss-02": Room("6a", "6a_boss-02", "Reflection A - Room boss-02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-02"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-02"]), + "6a_boss-03": Room("6a", "6a_boss-03", "Reflection A - Room boss-03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-03"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-03"]), + "6a_boss-04": Room("6a", "6a_boss-04", "Reflection A - Room boss-04", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-04"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-04"]), + "6a_boss-05": Room("6a", "6a_boss-05", "Reflection A - Room boss-05", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-05"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-05"]), + "6a_boss-06": Room("6a", "6a_boss-06", "Reflection A - Room boss-06", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-06"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-06"]), + "6a_boss-07": Room("6a", "6a_boss-07", "Reflection A - Room boss-07", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-07"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-07"]), + "6a_boss-08": Room("6a", "6a_boss-08", "Reflection A - Room boss-08", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-08"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-08"]), + "6a_boss-09": Room("6a", "6a_boss-09", "Reflection A - Room boss-09", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-09"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-09"]), + "6a_boss-10": Room("6a", "6a_boss-10", "Reflection A - Room boss-10", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-10"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-10"]), + "6a_boss-11": Room("6a", "6a_boss-11", "Reflection A - Room boss-11", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-11"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-11"]), + "6a_boss-12": Room("6a", "6a_boss-12", "Reflection A - Room boss-12", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-12"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-12"]), + "6a_boss-13": Room("6a", "6a_boss-13", "Reflection A - Room boss-13", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-13"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-13"]), + "6a_boss-14": Room("6a", "6a_boss-14", "Reflection A - Room boss-14", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-14"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-14"]), + "6a_boss-15": Room("6a", "6a_boss-15", "Reflection A - Room boss-15", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-15"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-15"]), + "6a_boss-16": Room("6a", "6a_boss-16", "Reflection A - Room boss-16", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-16"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-16"]), + "6a_boss-17": Room("6a", "6a_boss-17", "Reflection A - Room boss-17", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-17"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-17"]), + "6a_boss-18": Room("6a", "6a_boss-18", "Reflection A - Room boss-18", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-18"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-18"]), + "6a_boss-19": Room("6a", "6a_boss-19", "Reflection A - Room boss-19", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-19"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-19"]), + "6a_boss-20": Room("6a", "6a_boss-20", "Reflection A - Room boss-20", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-20"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-20"]), + "6a_after-00": Room("6a", "6a_after-00", "Reflection A - Room after-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_after-00"], [door for _, door in all_doors.items() if door.room_name == "6a_after-00"], "Resolution", "6a_after-00_bottom"), + "6a_after-01": Room("6a", "6a_after-01", "Reflection A - Room after-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_after-01"], [door for _, door in all_doors.items() if door.room_name == "6a_after-01"]), + + "6b_a-00": Room("6b", "6b_a-00", "Reflection B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-00"], [door for _, door in all_doors.items() if door.room_name == "6b_a-00"], "Start", "6b_a-00_bottom"), + "6b_a-01": Room("6b", "6b_a-01", "Reflection B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-01"], [door for _, door in all_doors.items() if door.room_name == "6b_a-01"]), + "6b_a-02": Room("6b", "6b_a-02", "Reflection B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-02"], [door for _, door in all_doors.items() if door.room_name == "6b_a-02"]), + "6b_a-03": Room("6b", "6b_a-03", "Reflection B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-03"], [door for _, door in all_doors.items() if door.room_name == "6b_a-03"]), + "6b_a-04": Room("6b", "6b_a-04", "Reflection B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-04"], [door for _, door in all_doors.items() if door.room_name == "6b_a-04"]), + "6b_a-05": Room("6b", "6b_a-05", "Reflection B - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-05"], [door for _, door in all_doors.items() if door.room_name == "6b_a-05"]), + "6b_a-06": Room("6b", "6b_a-06", "Reflection B - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-06"], [door for _, door in all_doors.items() if door.room_name == "6b_a-06"]), + "6b_b-00": Room("6b", "6b_b-00", "Reflection B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-00"], [door for _, door in all_doors.items() if door.room_name == "6b_b-00"], "Reflection", "6b_b-00_west"), + "6b_b-01": Room("6b", "6b_b-01", "Reflection B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-01"], [door for _, door in all_doors.items() if door.room_name == "6b_b-01"]), + "6b_b-02": Room("6b", "6b_b-02", "Reflection B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-02"], [door for _, door in all_doors.items() if door.room_name == "6b_b-02"]), + "6b_b-03": Room("6b", "6b_b-03", "Reflection B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-03"], [door for _, door in all_doors.items() if door.room_name == "6b_b-03"]), + "6b_b-04": Room("6b", "6b_b-04", "Reflection B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-04"], [door for _, door in all_doors.items() if door.room_name == "6b_b-04"]), + "6b_b-05": Room("6b", "6b_b-05", "Reflection B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-05"], [door for _, door in all_doors.items() if door.room_name == "6b_b-05"]), + "6b_b-06": Room("6b", "6b_b-06", "Reflection B - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-06"], [door for _, door in all_doors.items() if door.room_name == "6b_b-06"]), + "6b_b-07": Room("6b", "6b_b-07", "Reflection B - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-07"], [door for _, door in all_doors.items() if door.room_name == "6b_b-07"]), + "6b_b-08": Room("6b", "6b_b-08", "Reflection B - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-08"], [door for _, door in all_doors.items() if door.room_name == "6b_b-08"]), + "6b_b-10": Room("6b", "6b_b-10", "Reflection B - Room b-10", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-10"], [door for _, door in all_doors.items() if door.room_name == "6b_b-10"]), + "6b_c-00": Room("6b", "6b_c-00", "Reflection B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-00"], [door for _, door in all_doors.items() if door.room_name == "6b_c-00"], "Rock Bottom", "6b_c-00_west"), + "6b_c-01": Room("6b", "6b_c-01", "Reflection B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-01"], [door for _, door in all_doors.items() if door.room_name == "6b_c-01"]), + "6b_c-02": Room("6b", "6b_c-02", "Reflection B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-02"], [door for _, door in all_doors.items() if door.room_name == "6b_c-02"]), + "6b_c-03": Room("6b", "6b_c-03", "Reflection B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-03"], [door for _, door in all_doors.items() if door.room_name == "6b_c-03"]), + "6b_c-04": Room("6b", "6b_c-04", "Reflection B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-04"], [door for _, door in all_doors.items() if door.room_name == "6b_c-04"]), + "6b_d-00": Room("6b", "6b_d-00", "Reflection B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-00"], [door for _, door in all_doors.items() if door.room_name == "6b_d-00"], "Reprieve", "6b_d-00_west"), + "6b_d-01": Room("6b", "6b_d-01", "Reflection B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-01"], [door for _, door in all_doors.items() if door.room_name == "6b_d-01"]), + "6b_d-02": Room("6b", "6b_d-02", "Reflection B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-02"], [door for _, door in all_doors.items() if door.room_name == "6b_d-02"]), + "6b_d-03": Room("6b", "6b_d-03", "Reflection B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-03"], [door for _, door in all_doors.items() if door.room_name == "6b_d-03"]), + "6b_d-04": Room("6b", "6b_d-04", "Reflection B - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-04"], [door for _, door in all_doors.items() if door.room_name == "6b_d-04"]), + "6b_d-05": Room("6b", "6b_d-05", "Reflection B - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-05"], [door for _, door in all_doors.items() if door.room_name == "6b_d-05"]), + + "6c_00": Room("6c", "6c_00", "Reflection C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "6c_00"], [door for _, door in all_doors.items() if door.room_name == "6c_00"], "Start", "6c_00_west"), + "6c_01": Room("6c", "6c_01", "Reflection C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "6c_01"], [door for _, door in all_doors.items() if door.room_name == "6c_01"]), + "6c_02": Room("6c", "6c_02", "Reflection C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "6c_02"], [door for _, door in all_doors.items() if door.room_name == "6c_02"]), + + "7a_a-00": Room("7a", "7a_a-00", "The Summit A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-00"], [door for _, door in all_doors.items() if door.room_name == "7a_a-00"], "Start", "7a_a-00_west"), + "7a_a-01": Room("7a", "7a_a-01", "The Summit A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-01"], [door for _, door in all_doors.items() if door.room_name == "7a_a-01"]), + "7a_a-02": Room("7a", "7a_a-02", "The Summit A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-02"], [door for _, door in all_doors.items() if door.room_name == "7a_a-02"]), + "7a_a-02b": Room("7a", "7a_a-02b", "The Summit A - Room a-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_a-02b"]), + "7a_a-03": Room("7a", "7a_a-03", "The Summit A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-03"], [door for _, door in all_doors.items() if door.room_name == "7a_a-03"]), + "7a_a-04": Room("7a", "7a_a-04", "The Summit A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-04"], [door for _, door in all_doors.items() if door.room_name == "7a_a-04"]), + "7a_a-04b": Room("7a", "7a_a-04b", "The Summit A - Room a-04b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-04b"], [door for _, door in all_doors.items() if door.room_name == "7a_a-04b"]), + "7a_a-05": Room("7a", "7a_a-05", "The Summit A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-05"], [door for _, door in all_doors.items() if door.room_name == "7a_a-05"]), + "7a_a-06": Room("7a", "7a_a-06", "The Summit A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-06"], [door for _, door in all_doors.items() if door.room_name == "7a_a-06"]), + "7a_b-00": Room("7a", "7a_b-00", "The Summit A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-00"], [door for _, door in all_doors.items() if door.room_name == "7a_b-00"], "500 M", "7a_b-00_bottom"), + "7a_b-01": Room("7a", "7a_b-01", "The Summit A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-01"], [door for _, door in all_doors.items() if door.room_name == "7a_b-01"]), + "7a_b-02": Room("7a", "7a_b-02", "The Summit A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02"]), + "7a_b-02b": Room("7a", "7a_b-02b", "The Summit A - Room b-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02b"]), + "7a_b-02e": Room("7a", "7a_b-02e", "The Summit A - Room b-02e", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02e"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02e"]), + "7a_b-02c": Room("7a", "7a_b-02c", "The Summit A - Room b-02c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02c"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02c"]), + "7a_b-02d": Room("7a", "7a_b-02d", "The Summit A - Room b-02d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02d"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02d"]), + "7a_b-03": Room("7a", "7a_b-03", "The Summit A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-03"], [door for _, door in all_doors.items() if door.room_name == "7a_b-03"]), + "7a_b-04": Room("7a", "7a_b-04", "The Summit A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-04"], [door for _, door in all_doors.items() if door.room_name == "7a_b-04"]), + "7a_b-05": Room("7a", "7a_b-05", "The Summit A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-05"], [door for _, door in all_doors.items() if door.room_name == "7a_b-05"]), + "7a_b-06": Room("7a", "7a_b-06", "The Summit A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-06"], [door for _, door in all_doors.items() if door.room_name == "7a_b-06"]), + "7a_b-07": Room("7a", "7a_b-07", "The Summit A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-07"], [door for _, door in all_doors.items() if door.room_name == "7a_b-07"]), + "7a_b-08": Room("7a", "7a_b-08", "The Summit A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-08"], [door for _, door in all_doors.items() if door.room_name == "7a_b-08"]), + "7a_b-09": Room("7a", "7a_b-09", "The Summit A - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-09"], [door for _, door in all_doors.items() if door.room_name == "7a_b-09"]), + "7a_c-00": Room("7a", "7a_c-00", "The Summit A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-00"], [door for _, door in all_doors.items() if door.room_name == "7a_c-00"], "1000 M", "7a_c-00_west"), + "7a_c-01": Room("7a", "7a_c-01", "The Summit A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-01"], [door for _, door in all_doors.items() if door.room_name == "7a_c-01"]), + "7a_c-02": Room("7a", "7a_c-02", "The Summit A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-02"], [door for _, door in all_doors.items() if door.room_name == "7a_c-02"]), + "7a_c-03": Room("7a", "7a_c-03", "The Summit A - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-03"], [door for _, door in all_doors.items() if door.room_name == "7a_c-03"]), + "7a_c-03b": Room("7a", "7a_c-03b", "The Summit A - Room c-03b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-03b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-03b"]), + "7a_c-04": Room("7a", "7a_c-04", "The Summit A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-04"], [door for _, door in all_doors.items() if door.room_name == "7a_c-04"]), + "7a_c-05": Room("7a", "7a_c-05", "The Summit A - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-05"], [door for _, door in all_doors.items() if door.room_name == "7a_c-05"]), + "7a_c-06": Room("7a", "7a_c-06", "The Summit A - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06"]), + "7a_c-06b": Room("7a", "7a_c-06b", "The Summit A - Room c-06b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06b"]), + "7a_c-06c": Room("7a", "7a_c-06c", "The Summit A - Room c-06c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06c"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06c"]), + "7a_c-07": Room("7a", "7a_c-07", "The Summit A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-07"], [door for _, door in all_doors.items() if door.room_name == "7a_c-07"]), + "7a_c-07b": Room("7a", "7a_c-07b", "The Summit A - Room c-07b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-07b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-07b"]), + "7a_c-08": Room("7a", "7a_c-08", "The Summit A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-08"], [door for _, door in all_doors.items() if door.room_name == "7a_c-08"]), + "7a_c-09": Room("7a", "7a_c-09", "The Summit A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-09"], [door for _, door in all_doors.items() if door.room_name == "7a_c-09"]), + "7a_d-00": Room("7a", "7a_d-00", "The Summit A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-00"], [door for _, door in all_doors.items() if door.room_name == "7a_d-00"], "1500 M", "7a_d-00_bottom"), + "7a_d-01": Room("7a", "7a_d-01", "The Summit A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01"]), + "7a_d-01b": Room("7a", "7a_d-01b", "The Summit A - Room d-01b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01b"]), + "7a_d-01c": Room("7a", "7a_d-01c", "The Summit A - Room d-01c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01c"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01c"]), + "7a_d-01d": Room("7a", "7a_d-01d", "The Summit A - Room d-01d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01d"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01d"]), + "7a_d-02": Room("7a", "7a_d-02", "The Summit A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-02"], [door for _, door in all_doors.items() if door.room_name == "7a_d-02"]), + "7a_d-03": Room("7a", "7a_d-03", "The Summit A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-03"], [door for _, door in all_doors.items() if door.room_name == "7a_d-03"]), + "7a_d-03b": Room("7a", "7a_d-03b", "The Summit A - Room d-03b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-03b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-03b"]), + "7a_d-04": Room("7a", "7a_d-04", "The Summit A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-04"], [door for _, door in all_doors.items() if door.room_name == "7a_d-04"]), + "7a_d-05": Room("7a", "7a_d-05", "The Summit A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-05"], [door for _, door in all_doors.items() if door.room_name == "7a_d-05"]), + "7a_d-05b": Room("7a", "7a_d-05b", "The Summit A - Room d-05b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-05b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-05b"]), + "7a_d-06": Room("7a", "7a_d-06", "The Summit A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-06"], [door for _, door in all_doors.items() if door.room_name == "7a_d-06"]), + "7a_d-07": Room("7a", "7a_d-07", "The Summit A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-07"], [door for _, door in all_doors.items() if door.room_name == "7a_d-07"]), + "7a_d-08": Room("7a", "7a_d-08", "The Summit A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-08"], [door for _, door in all_doors.items() if door.room_name == "7a_d-08"]), + "7a_d-09": Room("7a", "7a_d-09", "The Summit A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-09"], [door for _, door in all_doors.items() if door.room_name == "7a_d-09"]), + "7a_d-10": Room("7a", "7a_d-10", "The Summit A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-10"], [door for _, door in all_doors.items() if door.room_name == "7a_d-10"]), + "7a_d-10b": Room("7a", "7a_d-10b", "The Summit A - Room d-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-10b"]), + "7a_d-11": Room("7a", "7a_d-11", "The Summit A - Room d-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-11"], [door for _, door in all_doors.items() if door.room_name == "7a_d-11"]), + "7a_e-00b": Room("7a", "7a_e-00b", "The Summit A - Room e-00b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-00b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-00b"], "2000 M", "7a_e-00b_bottom"), + "7a_e-00": Room("7a", "7a_e-00", "The Summit A - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-00"], [door for _, door in all_doors.items() if door.room_name == "7a_e-00"]), + "7a_e-01": Room("7a", "7a_e-01", "The Summit A - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01"]), + "7a_e-01b": Room("7a", "7a_e-01b", "The Summit A - Room e-01b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01b"]), + "7a_e-01c": Room("7a", "7a_e-01c", "The Summit A - Room e-01c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01c"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01c"]), + "7a_e-02": Room("7a", "7a_e-02", "The Summit A - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-02"], [door for _, door in all_doors.items() if door.room_name == "7a_e-02"]), + "7a_e-03": Room("7a", "7a_e-03", "The Summit A - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-03"], [door for _, door in all_doors.items() if door.room_name == "7a_e-03"]), + "7a_e-04": Room("7a", "7a_e-04", "The Summit A - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-04"], [door for _, door in all_doors.items() if door.room_name == "7a_e-04"]), + "7a_e-05": Room("7a", "7a_e-05", "The Summit A - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-05"], [door for _, door in all_doors.items() if door.room_name == "7a_e-05"]), + "7a_e-06": Room("7a", "7a_e-06", "The Summit A - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-06"], [door for _, door in all_doors.items() if door.room_name == "7a_e-06"]), + "7a_e-07": Room("7a", "7a_e-07", "The Summit A - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-07"], [door for _, door in all_doors.items() if door.room_name == "7a_e-07"]), + "7a_e-08": Room("7a", "7a_e-08", "The Summit A - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-08"], [door for _, door in all_doors.items() if door.room_name == "7a_e-08"]), + "7a_e-09": Room("7a", "7a_e-09", "The Summit A - Room e-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-09"], [door for _, door in all_doors.items() if door.room_name == "7a_e-09"]), + "7a_e-11": Room("7a", "7a_e-11", "The Summit A - Room e-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-11"], [door for _, door in all_doors.items() if door.room_name == "7a_e-11"]), + "7a_e-12": Room("7a", "7a_e-12", "The Summit A - Room e-12", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-12"], [door for _, door in all_doors.items() if door.room_name == "7a_e-12"]), + "7a_e-10": Room("7a", "7a_e-10", "The Summit A - Room e-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-10"], [door for _, door in all_doors.items() if door.room_name == "7a_e-10"]), + "7a_e-10b": Room("7a", "7a_e-10b", "The Summit A - Room e-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-10b"]), + "7a_e-13": Room("7a", "7a_e-13", "The Summit A - Room e-13", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-13"], [door for _, door in all_doors.items() if door.room_name == "7a_e-13"]), + "7a_f-00": Room("7a", "7a_f-00", "The Summit A - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-00"], [door for _, door in all_doors.items() if door.room_name == "7a_f-00"], "2500 M", "7a_f-00_south"), + "7a_f-01": Room("7a", "7a_f-01", "The Summit A - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-01"], [door for _, door in all_doors.items() if door.room_name == "7a_f-01"]), + "7a_f-02": Room("7a", "7a_f-02", "The Summit A - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-02"], [door for _, door in all_doors.items() if door.room_name == "7a_f-02"]), + "7a_f-02b": Room("7a", "7a_f-02b", "The Summit A - Room f-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-02b"]), + "7a_f-04": Room("7a", "7a_f-04", "The Summit A - Room f-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-04"], [door for _, door in all_doors.items() if door.room_name == "7a_f-04"]), + "7a_f-03": Room("7a", "7a_f-03", "The Summit A - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-03"], [door for _, door in all_doors.items() if door.room_name == "7a_f-03"]), + "7a_f-05": Room("7a", "7a_f-05", "The Summit A - Room f-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-05"], [door for _, door in all_doors.items() if door.room_name == "7a_f-05"]), + "7a_f-06": Room("7a", "7a_f-06", "The Summit A - Room f-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-06"], [door for _, door in all_doors.items() if door.room_name == "7a_f-06"]), + "7a_f-07": Room("7a", "7a_f-07", "The Summit A - Room f-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-07"], [door for _, door in all_doors.items() if door.room_name == "7a_f-07"]), + "7a_f-08": Room("7a", "7a_f-08", "The Summit A - Room f-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08"]), + "7a_f-08b": Room("7a", "7a_f-08b", "The Summit A - Room f-08b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08b"]), + "7a_f-08d": Room("7a", "7a_f-08d", "The Summit A - Room f-08d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08d"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08d"]), + "7a_f-08c": Room("7a", "7a_f-08c", "The Summit A - Room f-08c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08c"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08c"]), + "7a_f-09": Room("7a", "7a_f-09", "The Summit A - Room f-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-09"], [door for _, door in all_doors.items() if door.room_name == "7a_f-09"]), + "7a_f-10": Room("7a", "7a_f-10", "The Summit A - Room f-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-10"], [door for _, door in all_doors.items() if door.room_name == "7a_f-10"]), + "7a_f-10b": Room("7a", "7a_f-10b", "The Summit A - Room f-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-10b"]), + "7a_f-11": Room("7a", "7a_f-11", "The Summit A - Room f-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-11"], [door for _, door in all_doors.items() if door.room_name == "7a_f-11"]), + "7a_g-00": Room("7a", "7a_g-00", "The Summit A - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-00"], [door for _, door in all_doors.items() if door.room_name == "7a_g-00"], "3000 M", "7a_g-00_bottom"), + "7a_g-00b": Room("7a", "7a_g-00b", "The Summit A - Room g-00b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-00b"], [door for _, door in all_doors.items() if door.room_name == "7a_g-00b"]), + "7a_g-01": Room("7a", "7a_g-01", "The Summit A - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-01"], [door for _, door in all_doors.items() if door.room_name == "7a_g-01"]), + "7a_g-02": Room("7a", "7a_g-02", "The Summit A - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-02"], [door for _, door in all_doors.items() if door.room_name == "7a_g-02"]), + "7a_g-03": Room("7a", "7a_g-03", "The Summit A - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-03"], [door for _, door in all_doors.items() if door.room_name == "7a_g-03"]), + + "7b_a-00": Room("7b", "7b_a-00", "The Summit B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-00"], [door for _, door in all_doors.items() if door.room_name == "7b_a-00"], "Start", "7b_a-00_west"), + "7b_a-01": Room("7b", "7b_a-01", "The Summit B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-01"], [door for _, door in all_doors.items() if door.room_name == "7b_a-01"]), + "7b_a-02": Room("7b", "7b_a-02", "The Summit B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-02"], [door for _, door in all_doors.items() if door.room_name == "7b_a-02"]), + "7b_a-03": Room("7b", "7b_a-03", "The Summit B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-03"], [door for _, door in all_doors.items() if door.room_name == "7b_a-03"]), + "7b_b-00": Room("7b", "7b_b-00", "The Summit B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-00"], [door for _, door in all_doors.items() if door.room_name == "7b_b-00"], "500 M", "7b_b-00_bottom"), + "7b_b-01": Room("7b", "7b_b-01", "The Summit B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-01"], [door for _, door in all_doors.items() if door.room_name == "7b_b-01"]), + "7b_b-02": Room("7b", "7b_b-02", "The Summit B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-02"], [door for _, door in all_doors.items() if door.room_name == "7b_b-02"]), + "7b_b-03": Room("7b", "7b_b-03", "The Summit B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-03"], [door for _, door in all_doors.items() if door.room_name == "7b_b-03"]), + "7b_c-01": Room("7b", "7b_c-01", "The Summit B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-01"], [door for _, door in all_doors.items() if door.room_name == "7b_c-01"], "1000 M", "7b_c-01_west"), + "7b_c-00": Room("7b", "7b_c-00", "The Summit B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-00"], [door for _, door in all_doors.items() if door.room_name == "7b_c-00"]), + "7b_c-02": Room("7b", "7b_c-02", "The Summit B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-02"], [door for _, door in all_doors.items() if door.room_name == "7b_c-02"]), + "7b_c-03": Room("7b", "7b_c-03", "The Summit B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-03"], [door for _, door in all_doors.items() if door.room_name == "7b_c-03"]), + "7b_d-00": Room("7b", "7b_d-00", "The Summit B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-00"], [door for _, door in all_doors.items() if door.room_name == "7b_d-00"], "1500 M", "7b_d-00_west"), + "7b_d-01": Room("7b", "7b_d-01", "The Summit B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-01"], [door for _, door in all_doors.items() if door.room_name == "7b_d-01"]), + "7b_d-02": Room("7b", "7b_d-02", "The Summit B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-02"], [door for _, door in all_doors.items() if door.room_name == "7b_d-02"]), + "7b_d-03": Room("7b", "7b_d-03", "The Summit B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-03"], [door for _, door in all_doors.items() if door.room_name == "7b_d-03"]), + "7b_e-00": Room("7b", "7b_e-00", "The Summit B - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-00"], [door for _, door in all_doors.items() if door.room_name == "7b_e-00"], "2000 M", "7b_e-00_west"), + "7b_e-01": Room("7b", "7b_e-01", "The Summit B - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-01"], [door for _, door in all_doors.items() if door.room_name == "7b_e-01"]), + "7b_e-02": Room("7b", "7b_e-02", "The Summit B - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-02"], [door for _, door in all_doors.items() if door.room_name == "7b_e-02"]), + "7b_e-03": Room("7b", "7b_e-03", "The Summit B - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-03"], [door for _, door in all_doors.items() if door.room_name == "7b_e-03"]), + "7b_f-00": Room("7b", "7b_f-00", "The Summit B - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-00"], [door for _, door in all_doors.items() if door.room_name == "7b_f-00"], "2500 M", "7b_f-00_west"), + "7b_f-01": Room("7b", "7b_f-01", "The Summit B - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-01"], [door for _, door in all_doors.items() if door.room_name == "7b_f-01"]), + "7b_f-02": Room("7b", "7b_f-02", "The Summit B - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-02"], [door for _, door in all_doors.items() if door.room_name == "7b_f-02"]), + "7b_f-03": Room("7b", "7b_f-03", "The Summit B - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-03"], [door for _, door in all_doors.items() if door.room_name == "7b_f-03"]), + "7b_g-00": Room("7b", "7b_g-00", "The Summit B - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-00"], [door for _, door in all_doors.items() if door.room_name == "7b_g-00"], "3000 M", "7b_g-00_bottom"), + "7b_g-01": Room("7b", "7b_g-01", "The Summit B - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-01"], [door for _, door in all_doors.items() if door.room_name == "7b_g-01"]), + "7b_g-02": Room("7b", "7b_g-02", "The Summit B - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-02"], [door for _, door in all_doors.items() if door.room_name == "7b_g-02"]), + "7b_g-03": Room("7b", "7b_g-03", "The Summit B - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-03"], [door for _, door in all_doors.items() if door.room_name == "7b_g-03"]), + + "7c_01": Room("7c", "7c_01", "The Summit C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "7c_01"], [door for _, door in all_doors.items() if door.room_name == "7c_01"], "Start", "7c_01_west"), + "7c_02": Room("7c", "7c_02", "The Summit C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "7c_02"], [door for _, door in all_doors.items() if door.room_name == "7c_02"]), + "7c_03": Room("7c", "7c_03", "The Summit C - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "7c_03"], [door for _, door in all_doors.items() if door.room_name == "7c_03"]), + + "8a_outside": Room("8a", "8a_outside", "Epilogue - Room outside", [reg for _, reg in all_regions.items() if reg.room_name == "8a_outside"], [door for _, door in all_doors.items() if door.room_name == "8a_outside"], "Start", "8a_outside_east"), + "8a_bridge": Room("8a", "8a_bridge", "Epilogue - Room bridge", [reg for _, reg in all_regions.items() if reg.room_name == "8a_bridge"], [door for _, door in all_doors.items() if door.room_name == "8a_bridge"]), + "8a_secret": Room("8a", "8a_secret", "Epilogue - Room secret", [reg for _, reg in all_regions.items() if reg.room_name == "8a_secret"], [door for _, door in all_doors.items() if door.room_name == "8a_secret"]), + + "9a_00": Room("9a", "9a_00", "Core A - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_00"], [door for _, door in all_doors.items() if door.room_name == "9a_00"], "Start", "9a_00_west"), + "9a_0x": Room("9a", "9a_0x", "Core A - Room 0x", [reg for _, reg in all_regions.items() if reg.room_name == "9a_0x"], [door for _, door in all_doors.items() if door.room_name == "9a_0x"]), + "9a_01": Room("9a", "9a_01", "Core A - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_01"], [door for _, door in all_doors.items() if door.room_name == "9a_01"]), + "9a_02": Room("9a", "9a_02", "Core A - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_02"], [door for _, door in all_doors.items() if door.room_name == "9a_02"]), + "9a_a-00": Room("9a", "9a_a-00", "Core A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-00"], [door for _, door in all_doors.items() if door.room_name == "9a_a-00"], "Into the Core", "9a_a-00_west"), + "9a_a-01": Room("9a", "9a_a-01", "Core A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-01"], [door for _, door in all_doors.items() if door.room_name == "9a_a-01"]), + "9a_a-02": Room("9a", "9a_a-02", "Core A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-02"], [door for _, door in all_doors.items() if door.room_name == "9a_a-02"]), + "9a_a-03": Room("9a", "9a_a-03", "Core A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-03"], [door for _, door in all_doors.items() if door.room_name == "9a_a-03"]), + "9a_b-00": Room("9a", "9a_b-00", "Core A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-00"], [door for _, door in all_doors.items() if door.room_name == "9a_b-00"]), + "9a_b-01": Room("9a", "9a_b-01", "Core A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-01"], [door for _, door in all_doors.items() if door.room_name == "9a_b-01"]), + "9a_b-02": Room("9a", "9a_b-02", "Core A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-02"], [door for _, door in all_doors.items() if door.room_name == "9a_b-02"]), + "9a_b-03": Room("9a", "9a_b-03", "Core A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-03"], [door for _, door in all_doors.items() if door.room_name == "9a_b-03"]), + "9a_b-04": Room("9a", "9a_b-04", "Core A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-04"], [door for _, door in all_doors.items() if door.room_name == "9a_b-04"]), + "9a_b-05": Room("9a", "9a_b-05", "Core A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-05"], [door for _, door in all_doors.items() if door.room_name == "9a_b-05"]), + "9a_b-06": Room("9a", "9a_b-06", "Core A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-06"], [door for _, door in all_doors.items() if door.room_name == "9a_b-06"]), + "9a_b-07b": Room("9a", "9a_b-07b", "Core A - Room b-07b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-07b"], [door for _, door in all_doors.items() if door.room_name == "9a_b-07b"]), + "9a_b-07": Room("9a", "9a_b-07", "Core A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-07"], [door for _, door in all_doors.items() if door.room_name == "9a_b-07"]), + "9a_c-00": Room("9a", "9a_c-00", "Core A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-00"], [door for _, door in all_doors.items() if door.room_name == "9a_c-00"], "Hot and Cold", "9a_c-00_west"), + "9a_c-00b": Room("9a", "9a_c-00b", "Core A - Room c-00b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-00b"], [door for _, door in all_doors.items() if door.room_name == "9a_c-00b"]), + "9a_c-01": Room("9a", "9a_c-01", "Core A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-01"], [door for _, door in all_doors.items() if door.room_name == "9a_c-01"]), + "9a_c-02": Room("9a", "9a_c-02", "Core A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-02"], [door for _, door in all_doors.items() if door.room_name == "9a_c-02"]), + "9a_c-03": Room("9a", "9a_c-03", "Core A - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-03"], [door for _, door in all_doors.items() if door.room_name == "9a_c-03"]), + "9a_c-03b": Room("9a", "9a_c-03b", "Core A - Room c-03b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-03b"], [door for _, door in all_doors.items() if door.room_name == "9a_c-03b"]), + "9a_c-04": Room("9a", "9a_c-04", "Core A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-04"], [door for _, door in all_doors.items() if door.room_name == "9a_c-04"]), + "9a_d-00": Room("9a", "9a_d-00", "Core A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-00"], [door for _, door in all_doors.items() if door.room_name == "9a_d-00"], "Heart of the Mountain", "9a_d-00_bottom"), + "9a_d-01": Room("9a", "9a_d-01", "Core A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-01"], [door for _, door in all_doors.items() if door.room_name == "9a_d-01"]), + "9a_d-02": Room("9a", "9a_d-02", "Core A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-02"], [door for _, door in all_doors.items() if door.room_name == "9a_d-02"]), + "9a_d-03": Room("9a", "9a_d-03", "Core A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-03"], [door for _, door in all_doors.items() if door.room_name == "9a_d-03"]), + "9a_d-04": Room("9a", "9a_d-04", "Core A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-04"], [door for _, door in all_doors.items() if door.room_name == "9a_d-04"]), + "9a_d-05": Room("9a", "9a_d-05", "Core A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-05"], [door for _, door in all_doors.items() if door.room_name == "9a_d-05"]), + "9a_d-06": Room("9a", "9a_d-06", "Core A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-06"], [door for _, door in all_doors.items() if door.room_name == "9a_d-06"]), + "9a_d-07": Room("9a", "9a_d-07", "Core A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-07"], [door for _, door in all_doors.items() if door.room_name == "9a_d-07"]), + "9a_d-08": Room("9a", "9a_d-08", "Core A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-08"], [door for _, door in all_doors.items() if door.room_name == "9a_d-08"]), + "9a_d-09": Room("9a", "9a_d-09", "Core A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-09"], [door for _, door in all_doors.items() if door.room_name == "9a_d-09"]), + "9a_d-10": Room("9a", "9a_d-10", "Core A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10"]), + "9a_d-10b": Room("9a", "9a_d-10b", "Core A - Room d-10b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10b"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10b"]), + "9a_d-10c": Room("9a", "9a_d-10c", "Core A - Room d-10c", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10c"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10c"]), + "9a_d-11": Room("9a", "9a_d-11", "Core A - Room d-11", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-11"], [door for _, door in all_doors.items() if door.room_name == "9a_d-11"]), + "9a_space": Room("9a", "9a_space", "Core A - Room space", [reg for _, reg in all_regions.items() if reg.room_name == "9a_space"], [door for _, door in all_doors.items() if door.room_name == "9a_space"]), + + "9b_00": Room("9b", "9b_00", "Core B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_00"], [door for _, door in all_doors.items() if door.room_name == "9b_00"], "Start", "9b_00_east"), + "9b_01": Room("9b", "9b_01", "Core B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_01"], [door for _, door in all_doors.items() if door.room_name == "9b_01"]), + "9b_a-00": Room("9b", "9b_a-00", "Core B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-00"], [door for _, door in all_doors.items() if door.room_name == "9b_a-00"], "Into the Core", "9b_a-00_west"), + "9b_a-01": Room("9b", "9b_a-01", "Core B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-01"], [door for _, door in all_doors.items() if door.room_name == "9b_a-01"]), + "9b_a-02": Room("9b", "9b_a-02", "Core B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-02"], [door for _, door in all_doors.items() if door.room_name == "9b_a-02"]), + "9b_a-03": Room("9b", "9b_a-03", "Core B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-03"], [door for _, door in all_doors.items() if door.room_name == "9b_a-03"]), + "9b_a-04": Room("9b", "9b_a-04", "Core B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-04"], [door for _, door in all_doors.items() if door.room_name == "9b_a-04"]), + "9b_a-05": Room("9b", "9b_a-05", "Core B - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-05"], [door for _, door in all_doors.items() if door.room_name == "9b_a-05"]), + "9b_b-00": Room("9b", "9b_b-00", "Core B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-00"], [door for _, door in all_doors.items() if door.room_name == "9b_b-00"], "Burning or Freezing", "9b_b-00_west"), + "9b_b-01": Room("9b", "9b_b-01", "Core B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-01"], [door for _, door in all_doors.items() if door.room_name == "9b_b-01"]), + "9b_b-02": Room("9b", "9b_b-02", "Core B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-02"], [door for _, door in all_doors.items() if door.room_name == "9b_b-02"]), + "9b_b-03": Room("9b", "9b_b-03", "Core B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-03"], [door for _, door in all_doors.items() if door.room_name == "9b_b-03"]), + "9b_b-04": Room("9b", "9b_b-04", "Core B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-04"], [door for _, door in all_doors.items() if door.room_name == "9b_b-04"]), + "9b_b-05": Room("9b", "9b_b-05", "Core B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-05"], [door for _, door in all_doors.items() if door.room_name == "9b_b-05"]), + "9b_c-01": Room("9b", "9b_c-01", "Core B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-01"], [door for _, door in all_doors.items() if door.room_name == "9b_c-01"], "Heartbeat", "9b_c-01_bottom"), + "9b_c-02": Room("9b", "9b_c-02", "Core B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-02"], [door for _, door in all_doors.items() if door.room_name == "9b_c-02"]), + "9b_c-03": Room("9b", "9b_c-03", "Core B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-03"], [door for _, door in all_doors.items() if door.room_name == "9b_c-03"]), + "9b_c-04": Room("9b", "9b_c-04", "Core B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-04"], [door for _, door in all_doors.items() if door.room_name == "9b_c-04"]), + "9b_c-05": Room("9b", "9b_c-05", "Core B - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-05"], [door for _, door in all_doors.items() if door.room_name == "9b_c-05"]), + "9b_c-06": Room("9b", "9b_c-06", "Core B - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-06"], [door for _, door in all_doors.items() if door.room_name == "9b_c-06"]), + "9b_c-08": Room("9b", "9b_c-08", "Core B - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-08"], [door for _, door in all_doors.items() if door.room_name == "9b_c-08"]), + "9b_c-07": Room("9b", "9b_c-07", "Core B - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-07"], [door for _, door in all_doors.items() if door.room_name == "9b_c-07"]), + "9b_space": Room("9b", "9b_space", "Core B - Room space", [reg for _, reg in all_regions.items() if reg.room_name == "9b_space"], [door for _, door in all_doors.items() if door.room_name == "9b_space"]), + + "9c_intro": Room("9c", "9c_intro", "Core C - Room intro", [reg for _, reg in all_regions.items() if reg.room_name == "9c_intro"], [door for _, door in all_doors.items() if door.room_name == "9c_intro"], "Start", "9c_intro_west"), + "9c_00": Room("9c", "9c_00", "Core C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9c_00"], [door for _, door in all_doors.items() if door.room_name == "9c_00"]), + "9c_01": Room("9c", "9c_01", "Core C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9c_01"], [door for _, door in all_doors.items() if door.room_name == "9c_01"]), + "9c_02": Room("9c", "9c_02", "Core C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "9c_02"], [door for _, door in all_doors.items() if door.room_name == "9c_02"]), + + "10a_intro-00-past": Room("10a", "10a_intro-00-past", "Farewell - Room intro-00-past", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-00-past"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-00-past"], "Start", "10a_intro-00-past_west"), + "10a_intro-01-future": Room("10a", "10a_intro-01-future", "Farewell - Room intro-01-future", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-01-future"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-01-future"]), + "10a_intro-02-launch": Room("10a", "10a_intro-02-launch", "Farewell - Room intro-02-launch", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-02-launch"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-02-launch"]), + "10a_intro-03-space": Room("10a", "10a_intro-03-space", "Farewell - Room intro-03-space", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-03-space"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-03-space"]), + "10a_a-00": Room("10a", "10a_a-00", "Farewell - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-00"], [door for _, door in all_doors.items() if door.room_name == "10a_a-00"], "Singular", "10a_a-00_west"), + "10a_a-01": Room("10a", "10a_a-01", "Farewell - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-01"], [door for _, door in all_doors.items() if door.room_name == "10a_a-01"]), + "10a_a-02": Room("10a", "10a_a-02", "Farewell - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-02"], [door for _, door in all_doors.items() if door.room_name == "10a_a-02"]), + "10a_a-03": Room("10a", "10a_a-03", "Farewell - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-03"], [door for _, door in all_doors.items() if door.room_name == "10a_a-03"]), + "10a_a-04": Room("10a", "10a_a-04", "Farewell - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-04"], [door for _, door in all_doors.items() if door.room_name == "10a_a-04"]), + "10a_a-05": Room("10a", "10a_a-05", "Farewell - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-05"], [door for _, door in all_doors.items() if door.room_name == "10a_a-05"]), + "10a_b-00": Room("10a", "10a_b-00", "Farewell - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-00"], [door for _, door in all_doors.items() if door.room_name == "10a_b-00"]), + "10a_b-01": Room("10a", "10a_b-01", "Farewell - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-01"], [door for _, door in all_doors.items() if door.room_name == "10a_b-01"]), + "10a_b-02": Room("10a", "10a_b-02", "Farewell - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-02"], [door for _, door in all_doors.items() if door.room_name == "10a_b-02"]), + "10a_b-03": Room("10a", "10a_b-03", "Farewell - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-03"], [door for _, door in all_doors.items() if door.room_name == "10a_b-03"]), + "10a_b-04": Room("10a", "10a_b-04", "Farewell - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-04"], [door for _, door in all_doors.items() if door.room_name == "10a_b-04"]), + "10a_b-05": Room("10a", "10a_b-05", "Farewell - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-05"], [door for _, door in all_doors.items() if door.room_name == "10a_b-05"]), + "10a_b-06": Room("10a", "10a_b-06", "Farewell - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-06"], [door for _, door in all_doors.items() if door.room_name == "10a_b-06"]), + "10a_b-07": Room("10a", "10a_b-07", "Farewell - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-07"], [door for _, door in all_doors.items() if door.room_name == "10a_b-07"]), + "10a_c-00": Room("10a", "10a_c-00", "Farewell - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-00"], [door for _, door in all_doors.items() if door.room_name == "10a_c-00"], "Power Source", "10a_c-00_west"), + "10a_c-00b": Room("10a", "10a_c-00b", "Farewell - Room c-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-00b"], [door for _, door in all_doors.items() if door.room_name == "10a_c-00b"]), + "10a_c-01": Room("10a", "10a_c-01", "Farewell - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-01"], [door for _, door in all_doors.items() if door.room_name == "10a_c-01"]), + "10a_c-02": Room("10a", "10a_c-02", "Farewell - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-02"], [door for _, door in all_doors.items() if door.room_name == "10a_c-02"]), + "10a_c-alt-00": Room("10a", "10a_c-alt-00", "Farewell - Room c-alt-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-alt-00"], [door for _, door in all_doors.items() if door.room_name == "10a_c-alt-00"]), + "10a_c-alt-01": Room("10a", "10a_c-alt-01", "Farewell - Room c-alt-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-alt-01"], [door for _, door in all_doors.items() if door.room_name == "10a_c-alt-01"]), + "10a_c-03": Room("10a", "10a_c-03", "Farewell - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-03"], [door for _, door in all_doors.items() if door.room_name == "10a_c-03"]), + "10a_d-00": Room("10a", "10a_d-00", "Farewell - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-00"], [door for _, door in all_doors.items() if door.room_name == "10a_d-00"]), + "10a_d-04": Room("10a", "10a_d-04", "Farewell - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-04"], [door for _, door in all_doors.items() if door.room_name == "10a_d-04"]), + "10a_d-03": Room("10a", "10a_d-03", "Farewell - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-03"], [door for _, door in all_doors.items() if door.room_name == "10a_d-03"]), + "10a_d-01": Room("10a", "10a_d-01", "Farewell - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-01"], [door for _, door in all_doors.items() if door.room_name == "10a_d-01"]), + "10a_d-02": Room("10a", "10a_d-02", "Farewell - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-02"], [door for _, door in all_doors.items() if door.room_name == "10a_d-02"]), + "10a_d-05": Room("10a", "10a_d-05", "Farewell - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-05"], [door for _, door in all_doors.items() if door.room_name == "10a_d-05"]), + "10a_e-00y": Room("10a", "10a_e-00y", "Farewell - Room e-00y", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00y"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00y"]), + "10a_e-00yb": Room("10a", "10a_e-00yb", "Farewell - Room e-00yb", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00yb"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00yb"]), + "10a_e-00z": Room("10a", "10a_e-00z", "Farewell - Room e-00z", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00z"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00z"], "Remembered", "10a_e-00z_south"), + "10a_e-00": Room("10a", "10a_e-00", "Farewell - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00"]), + "10a_e-00b": Room("10a", "10a_e-00b", "Farewell - Room e-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00b"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00b"]), + "10a_e-01": Room("10a", "10a_e-01", "Farewell - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-01"], [door for _, door in all_doors.items() if door.room_name == "10a_e-01"]), + "10a_e-02": Room("10a", "10a_e-02", "Farewell - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-02"], [door for _, door in all_doors.items() if door.room_name == "10a_e-02"]), + "10a_e-03": Room("10a", "10a_e-03", "Farewell - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-03"], [door for _, door in all_doors.items() if door.room_name == "10a_e-03"]), + "10a_e-04": Room("10a", "10a_e-04", "Farewell - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-04"], [door for _, door in all_doors.items() if door.room_name == "10a_e-04"]), + "10a_e-05": Room("10a", "10a_e-05", "Farewell - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05"]), + "10a_e-05b": Room("10a", "10a_e-05b", "Farewell - Room e-05b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05b"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05b"]), + "10a_e-05c": Room("10a", "10a_e-05c", "Farewell - Room e-05c", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05c"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05c"]), + "10a_e-06": Room("10a", "10a_e-06", "Farewell - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-06"], [door for _, door in all_doors.items() if door.room_name == "10a_e-06"]), + "10a_e-07": Room("10a", "10a_e-07", "Farewell - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-07"], [door for _, door in all_doors.items() if door.room_name == "10a_e-07"]), + "10a_e-08": Room("10a", "10a_e-08", "Farewell - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-08"], [door for _, door in all_doors.items() if door.room_name == "10a_e-08"]), + + "10b_f-door": Room("10b", "10b_f-door", "Farewell - Room f-door", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-door"], [door for _, door in all_doors.items() if door.room_name == "10b_f-door"], "Event Horizon", "10b_f-door_west"), + "10b_f-00": Room("10b", "10b_f-00", "Farewell - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-00"], [door for _, door in all_doors.items() if door.room_name == "10b_f-00"]), + "10b_f-01": Room("10b", "10b_f-01", "Farewell - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-01"], [door for _, door in all_doors.items() if door.room_name == "10b_f-01"]), + "10b_f-02": Room("10b", "10b_f-02", "Farewell - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-02"], [door for _, door in all_doors.items() if door.room_name == "10b_f-02"]), + "10b_f-03": Room("10b", "10b_f-03", "Farewell - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-03"], [door for _, door in all_doors.items() if door.room_name == "10b_f-03"]), + "10b_f-04": Room("10b", "10b_f-04", "Farewell - Room f-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-04"], [door for _, door in all_doors.items() if door.room_name == "10b_f-04"]), + "10b_f-05": Room("10b", "10b_f-05", "Farewell - Room f-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-05"], [door for _, door in all_doors.items() if door.room_name == "10b_f-05"]), + "10b_f-06": Room("10b", "10b_f-06", "Farewell - Room f-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-06"], [door for _, door in all_doors.items() if door.room_name == "10b_f-06"]), + "10b_f-07": Room("10b", "10b_f-07", "Farewell - Room f-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-07"], [door for _, door in all_doors.items() if door.room_name == "10b_f-07"]), + "10b_f-08": Room("10b", "10b_f-08", "Farewell - Room f-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-08"], [door for _, door in all_doors.items() if door.room_name == "10b_f-08"]), + "10b_f-09": Room("10b", "10b_f-09", "Farewell - Room f-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-09"], [door for _, door in all_doors.items() if door.room_name == "10b_f-09"]), + "10b_g-00": Room("10b", "10b_g-00", "Farewell - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-00"], [door for _, door in all_doors.items() if door.room_name == "10b_g-00"]), + "10b_g-01": Room("10b", "10b_g-01", "Farewell - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-01"], [door for _, door in all_doors.items() if door.room_name == "10b_g-01"]), + "10b_g-03": Room("10b", "10b_g-03", "Farewell - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-03"], [door for _, door in all_doors.items() if door.room_name == "10b_g-03"]), + "10b_g-02": Room("10b", "10b_g-02", "Farewell - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-02"], [door for _, door in all_doors.items() if door.room_name == "10b_g-02"]), + "10b_g-04": Room("10b", "10b_g-04", "Farewell - Room g-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-04"], [door for _, door in all_doors.items() if door.room_name == "10b_g-04"]), + "10b_g-05": Room("10b", "10b_g-05", "Farewell - Room g-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-05"], [door for _, door in all_doors.items() if door.room_name == "10b_g-05"]), + "10b_g-06": Room("10b", "10b_g-06", "Farewell - Room g-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-06"], [door for _, door in all_doors.items() if door.room_name == "10b_g-06"]), + "10b_h-00b": Room("10b", "10b_h-00b", "Farewell - Room h-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-00b"], "Determination", "10b_h-00b_west"), + "10b_h-00": Room("10b", "10b_h-00", "Farewell - Room h-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-00"], [door for _, door in all_doors.items() if door.room_name == "10b_h-00"]), + "10b_h-01": Room("10b", "10b_h-01", "Farewell - Room h-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-01"], [door for _, door in all_doors.items() if door.room_name == "10b_h-01"]), + "10b_h-02": Room("10b", "10b_h-02", "Farewell - Room h-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-02"], [door for _, door in all_doors.items() if door.room_name == "10b_h-02"]), + "10b_h-03": Room("10b", "10b_h-03", "Farewell - Room h-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-03"], [door for _, door in all_doors.items() if door.room_name == "10b_h-03"]), + "10b_h-03b": Room("10b", "10b_h-03b", "Farewell - Room h-03b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-03b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-03b"]), + "10b_h-04": Room("10b", "10b_h-04", "Farewell - Room h-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-04"], [door for _, door in all_doors.items() if door.room_name == "10b_h-04"]), + "10b_h-04b": Room("10b", "10b_h-04b", "Farewell - Room h-04b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-04b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-04b"]), + "10b_h-05": Room("10b", "10b_h-05", "Farewell - Room h-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-05"], [door for _, door in all_doors.items() if door.room_name == "10b_h-05"]), + "10b_h-06": Room("10b", "10b_h-06", "Farewell - Room h-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-06"], [door for _, door in all_doors.items() if door.room_name == "10b_h-06"]), + "10b_h-06b": Room("10b", "10b_h-06b", "Farewell - Room h-06b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-06b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-06b"]), + "10b_h-07": Room("10b", "10b_h-07", "Farewell - Room h-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-07"], [door for _, door in all_doors.items() if door.room_name == "10b_h-07"]), + "10b_h-08": Room("10b", "10b_h-08", "Farewell - Room h-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-08"], [door for _, door in all_doors.items() if door.room_name == "10b_h-08"]), + "10b_h-09": Room("10b", "10b_h-09", "Farewell - Room h-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-09"], [door for _, door in all_doors.items() if door.room_name == "10b_h-09"]), + "10b_h-10": Room("10b", "10b_h-10", "Farewell - Room h-10", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-10"], [door for _, door in all_doors.items() if door.room_name == "10b_h-10"]), + "10b_i-00": Room("10b", "10b_i-00", "Farewell - Room i-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-00"], [door for _, door in all_doors.items() if door.room_name == "10b_i-00"], "Stubbornness", "10b_i-00_west"), + "10b_i-00b": Room("10b", "10b_i-00b", "Farewell - Room i-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_i-00b"]), + "10b_i-01": Room("10b", "10b_i-01", "Farewell - Room i-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-01"], [door for _, door in all_doors.items() if door.room_name == "10b_i-01"]), + "10b_i-02": Room("10b", "10b_i-02", "Farewell - Room i-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-02"], [door for _, door in all_doors.items() if door.room_name == "10b_i-02"]), + "10b_i-03": Room("10b", "10b_i-03", "Farewell - Room i-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-03"], [door for _, door in all_doors.items() if door.room_name == "10b_i-03"]), + "10b_i-04": Room("10b", "10b_i-04", "Farewell - Room i-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-04"], [door for _, door in all_doors.items() if door.room_name == "10b_i-04"]), + "10b_i-05": Room("10b", "10b_i-05", "Farewell - Room i-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-05"], [door for _, door in all_doors.items() if door.room_name == "10b_i-05"]), + "10b_j-00": Room("10b", "10b_j-00", "Farewell - Room j-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-00"], [door for _, door in all_doors.items() if door.room_name == "10b_j-00"], "Reconciliation", "10b_j-00_west"), + "10b_j-00b": Room("10b", "10b_j-00b", "Farewell - Room j-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_j-00b"]), + "10b_j-01": Room("10b", "10b_j-01", "Farewell - Room j-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-01"], [door for _, door in all_doors.items() if door.room_name == "10b_j-01"]), + "10b_j-02": Room("10b", "10b_j-02", "Farewell - Room j-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-02"], [door for _, door in all_doors.items() if door.room_name == "10b_j-02"]), + "10b_j-03": Room("10b", "10b_j-03", "Farewell - Room j-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-03"], [door for _, door in all_doors.items() if door.room_name == "10b_j-03"]), + "10b_j-04": Room("10b", "10b_j-04", "Farewell - Room j-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-04"], [door for _, door in all_doors.items() if door.room_name == "10b_j-04"]), + "10b_j-05": Room("10b", "10b_j-05", "Farewell - Room j-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-05"], [door for _, door in all_doors.items() if door.room_name == "10b_j-05"]), + "10b_j-06": Room("10b", "10b_j-06", "Farewell - Room j-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-06"], [door for _, door in all_doors.items() if door.room_name == "10b_j-06"]), + "10b_j-07": Room("10b", "10b_j-07", "Farewell - Room j-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-07"], [door for _, door in all_doors.items() if door.room_name == "10b_j-07"]), + "10b_j-08": Room("10b", "10b_j-08", "Farewell - Room j-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-08"], [door for _, door in all_doors.items() if door.room_name == "10b_j-08"]), + "10b_j-09": Room("10b", "10b_j-09", "Farewell - Room j-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-09"], [door for _, door in all_doors.items() if door.room_name == "10b_j-09"]), + "10b_j-10": Room("10b", "10b_j-10", "Farewell - Room j-10", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-10"], [door for _, door in all_doors.items() if door.room_name == "10b_j-10"]), + "10b_j-11": Room("10b", "10b_j-11", "Farewell - Room j-11", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-11"], [door for _, door in all_doors.items() if door.room_name == "10b_j-11"]), + "10b_j-12": Room("10b", "10b_j-12", "Farewell - Room j-12", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-12"], [door for _, door in all_doors.items() if door.room_name == "10b_j-12"]), + "10b_j-13": Room("10b", "10b_j-13", "Farewell - Room j-13", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-13"], [door for _, door in all_doors.items() if door.room_name == "10b_j-13"]), + "10b_j-14": Room("10b", "10b_j-14", "Farewell - Room j-14", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-14"], [door for _, door in all_doors.items() if door.room_name == "10b_j-14"]), + "10b_j-14b": Room("10b", "10b_j-14b", "Farewell - Room j-14b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-14b"], [door for _, door in all_doors.items() if door.room_name == "10b_j-14b"]), + "10b_j-15": Room("10b", "10b_j-15", "Farewell - Room j-15", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-15"], [door for _, door in all_doors.items() if door.room_name == "10b_j-15"]), + "10b_j-16": Room("10b", "10b_j-16", "Farewell - Room j-16", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-16"], [door for _, door in all_doors.items() if door.room_name == "10b_j-16"], "Farewell", "10b_j-16_west"), + "10b_j-17": Room("10b", "10b_j-17", "Farewell - Room j-17", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-17"], [door for _, door in all_doors.items() if door.room_name == "10b_j-17"]), + "10b_j-18": Room("10b", "10b_j-18", "Farewell - Room j-18", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-18"], [door for _, door in all_doors.items() if door.room_name == "10b_j-18"]), + "10b_j-19": Room("10b", "10b_j-19", "Farewell - Room j-19", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-19"], [door for _, door in all_doors.items() if door.room_name == "10b_j-19"]), + "10b_GOAL": Room("10b", "10b_GOAL", "Farewell - Room GOAL", [reg for _, reg in all_regions.items() if reg.room_name == "10b_GOAL"], [door for _, door in all_doors.items() if door.room_name == "10b_GOAL"]), + + "10c_end-golden": Room("10c", "10c_end-golden", "Farewell - Room end-golden", [reg for _, reg in all_regions.items() if reg.room_name == "10c_end-golden"], [door for _, door in all_doors.items() if door.room_name == "10c_end-golden"]), + +} + +all_levels: dict[str, Level] = { + "0a": Level("0a", "Prologue", [room for _, room in all_rooms.items() if room.level_name == "0a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "0a"]), + "1a": Level("1a", "Forsaken City A", [room for _, room in all_rooms.items() if room.level_name == "1a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1a"]), + "1b": Level("1b", "Forsaken City B", [room for _, room in all_rooms.items() if room.level_name == "1b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1b"]), + "1c": Level("1c", "Forsaken City C", [room for _, room in all_rooms.items() if room.level_name == "1c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1c"]), + "2a": Level("2a", "Old Site A", [room for _, room in all_rooms.items() if room.level_name == "2a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2a"]), + "2b": Level("2b", "Old Site B", [room for _, room in all_rooms.items() if room.level_name == "2b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2b"]), + "2c": Level("2c", "Old Site C", [room for _, room in all_rooms.items() if room.level_name == "2c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2c"]), + "3a": Level("3a", "Celestial Resort A", [room for _, room in all_rooms.items() if room.level_name == "3a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3a"]), + "3b": Level("3b", "Celestial Resort B", [room for _, room in all_rooms.items() if room.level_name == "3b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3b"]), + "3c": Level("3c", "Celestial Resort C", [room for _, room in all_rooms.items() if room.level_name == "3c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3c"]), + "4a": Level("4a", "Golden Ridge A", [room for _, room in all_rooms.items() if room.level_name == "4a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4a"]), + "4b": Level("4b", "Golden Ridge B", [room for _, room in all_rooms.items() if room.level_name == "4b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4b"]), + "4c": Level("4c", "Golden Ridge C", [room for _, room in all_rooms.items() if room.level_name == "4c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4c"]), + "5a": Level("5a", "Mirror Temple A", [room for _, room in all_rooms.items() if room.level_name == "5a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5a"]), + "5b": Level("5b", "Mirror Temple B", [room for _, room in all_rooms.items() if room.level_name == "5b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5b"]), + "5c": Level("5c", "Mirror Temple C", [room for _, room in all_rooms.items() if room.level_name == "5c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5c"]), + "6a": Level("6a", "Reflection A", [room for _, room in all_rooms.items() if room.level_name == "6a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6a"]), + "6b": Level("6b", "Reflection B", [room for _, room in all_rooms.items() if room.level_name == "6b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6b"]), + "6c": Level("6c", "Reflection C", [room for _, room in all_rooms.items() if room.level_name == "6c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6c"]), + "7a": Level("7a", "The Summit A", [room for _, room in all_rooms.items() if room.level_name == "7a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7a"]), + "7b": Level("7b", "The Summit B", [room for _, room in all_rooms.items() if room.level_name == "7b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7b"]), + "7c": Level("7c", "The Summit C", [room for _, room in all_rooms.items() if room.level_name == "7c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7c"]), + "8a": Level("8a", "Epilogue", [room for _, room in all_rooms.items() if room.level_name == "8a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "8a"]), + "9a": Level("9a", "Core A", [room for _, room in all_rooms.items() if room.level_name == "9a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9a"]), + "9b": Level("9b", "Core B", [room for _, room in all_rooms.items() if room.level_name == "9b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9b"]), + "9c": Level("9c", "Core C", [room for _, room in all_rooms.items() if room.level_name == "9c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9c"]), + "10a": Level("10a", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10a"]), + "10b": Level("10b", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10b"]), + "10c": Level("10c", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10c"]), + +} + diff --git a/worlds/celeste_open_world/data/ParseData.py b/worlds/celeste_open_world/data/ParseData.py new file mode 100644 index 00000000..b9f8f472 --- /dev/null +++ b/worlds/celeste_open_world/data/ParseData.py @@ -0,0 +1,190 @@ +if __name__ == "__main__": + import json + + all_doors: list[str] = [] + all_region_connections: list[str] = [] + all_locations: list[str] = [] + all_regions: list[str] = [] + all_room_connections: list[str] = [] + all_rooms: list[str] = [] + all_levels: list[str] = [] + + + data_file = open('CelesteLevelData.json') + level_data = json.load(data_file) + data_file.close() + + # Levels + for level in level_data["levels"]: + level_str = (f" \"{level['name']}\": Level(\"{level['name']}\", " + f"\"{level['display_name']}\", " + f"[room for _, room in all_rooms.items() if room.level_name == \"{level['name']}\"], " + f"[room_con for _, room_con in all_room_connections.items() if room_con.level_name == \"{level['name']}\"])," + ) + + all_levels.append(level_str) + + # Rooms + for room in level["rooms"]: + room_full_name = f"{level['name']}_{room['name']}" + room_full_display_name = f"{level['display_name']} - Room {room['name']}" + + room_str = (f" \"{room_full_name}\": Room(\"{level['name']}\", " + f"\"{room_full_name}\", \"{room_full_display_name}\", " + f"[reg for _, reg in all_regions.items() if reg.room_name == \"{room_full_name}\"], " + f"[door for _, door in all_doors.items() if door.room_name == \"{room_full_name}\"]" + ) + + if "checkpoint" in room and room["checkpoint"] != "": + room_str += f", \"{room['checkpoint']}\", \"{room_full_name}_{room['checkpoint_region']}\"" + room_str += ")," + + all_rooms.append(room_str) + + # Regions + for region in room["regions"]: + region_full_name = f"{room_full_name}_{region['name']}" + + region_str = (f" \"{region_full_name}\": PreRegion(\"{region_full_name}\", " + f"\"{room_full_name}\", " + f"[reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == \"{region_full_name}\"], " + f"[loc for _, loc in all_locations.items() if loc.region_name == \"{region_full_name}\"])," + ) + + all_regions.append(region_str) + + # Locations + if "locations" in region: + for location in region["locations"]: + location_full_name = f"{room_full_name}_{location['name']}" + + location_display_name = location['display_name'] + if (location['type'] == "strawberry" and location_display_name != "Moon Berry") or location['type'] == "binoculars" : + location_display_name = f"Room {room['name']} {location_display_name}" + location_full_display_name = f"{level['display_name']} - {location_display_name}" + + location_str = (f" \"{location_full_name}\": LevelLocation(\"{location_full_name}\", " + f"\"{location_full_display_name}\", \"{region_full_name}\", " + f"LocationType.{location['type']}, [" + ) + + if "rule" in location: + for possible_access in location['rule']: + location_str += f"[" + for item in possible_access: + if "Key" in item or "Gem" in item: + location_str += f"\"{level['display_name']} - {item}\", " + else: + location_str += f"ItemName.{item}, " + location_str += f"], " + elif "rules" in location: + raise Exception(f"Location {location_full_name} uses 'rules' instead of 'rule") + + location_str += "])," + + all_locations.append(location_str) + + # Region Connections + for reg_con in region["connections"]: + dest_region_full_name = f"{room_full_name}_{reg_con['dest']}" + reg_con_full_name = f"{region_full_name}---{dest_region_full_name}" + + reg_con_str = f" \"{reg_con_full_name}\": RegionConnection(\"{region_full_name}\", \"{dest_region_full_name}\", [" + + for possible_access in reg_con['rule']: + reg_con_str += f"[" + for item in possible_access: + if "Key" in item or "Gem" in item: + reg_con_str += f"\"{level['display_name']} - {item}\", " + else: + reg_con_str += f"ItemName.{item}, " + reg_con_str += f"], " + + reg_con_str += "])," + + all_region_connections.append(reg_con_str) + + for door in room["doors"]: + door_full_name = f"{room_full_name}_{door['name']}" + + door_str = (f" \"{door_full_name}\": Door(\"{door_full_name}\", " + f"\"{room_full_name}\", " + f"DoorDirection.{door['direction']}, " + ) + + door_str += "True, " if door["blocked"] else "False, " + door_str += "True)," if door["closes_behind"] else "False)," + + all_doors.append(door_str) + + all_regions.append("") + all_region_connections.append("") + all_doors.append("") + + all_locations.append("") + all_rooms.append("") + + # Room Connections + for room_con in level["room_connections"]: + source_door_full_name = f"{level['name']}_{room_con['source_room']}_{room_con['source_door']}" + dest_door_full_name = f"{level['name']}_{room_con['dest_room']}_{room_con['dest_door']}" + + room_con_str = (f" \"{source_door_full_name}---{dest_door_full_name}\": RoomConnection(\"{level['name']}\", " + f"all_doors[\"{source_door_full_name}\"], " + f"all_doors[\"{dest_door_full_name}\"])," + ) + + all_room_connections.append(room_con_str) + + all_room_connections.append("") + + + all_levels.append("") + + + import sys + out_file = open("CelesteLevelData.py", "w") + sys.stdout = out_file + + print("# THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MANUALLY EDIT.") + print("") + print("from ..Levels import Level, Room, PreRegion, LevelLocation, RegionConnection, RoomConnection, Door, DoorDirection, LocationType") + print("from ..Names import ItemName") + print("") + print("all_doors: dict[str, Door] = {") + for line in all_doors: + print(line) + print("}") + print("") + print("all_region_connections: dict[str, RegionConnection] = {") + for line in all_region_connections: + print(line) + print("}") + print("") + print("all_locations: dict[str, LevelLocation] = {") + for line in all_locations: + print(line) + print("}") + print("") + print("all_regions: dict[str, PreRegion] = {") + for line in all_regions: + print(line) + print("}") + print("") + print("all_room_connections: dict[str, RoomConnection] = {") + for line in all_room_connections: + print(line) + print("}") + print("") + print("all_rooms: dict[str, Room] = {") + for line in all_rooms: + print(line) + print("}") + print("") + print("all_levels: dict[str, Level] = {") + for line in all_levels: + print(line) + print("}") + print("") + + out_file.close() diff --git a/worlds/celeste_open_world/data/__init__.py b/worlds/celeste_open_world/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/worlds/celeste_open_world/docs/en_Celeste (Open World).md b/worlds/celeste_open_world/docs/en_Celeste (Open World).md new file mode 100644 index 00000000..c27c4d64 --- /dev/null +++ b/worlds/celeste_open_world/docs/en_Celeste (Open World).md @@ -0,0 +1,98 @@ +# Celeste Open World + +## What is this game? + +**Celeste (Open World)** is a Randomizer for the original Celeste. In this acclaimed platformer created by ExOK Games, you control Madeline as she attempts to climb the titular mountain, meeting friends and obstacles along the way. +This randomizer takes an "Open World" approach. All of your active areas are open to you from the start. Progression is found in unlocking the ability to interact with various objects in the areas, such as springs, traffic blocks, feathers, and many more. One area can be selected as your "Goal Area", requiring you to clear that area before you can access the Epilogue and finish the game. Additionally, you can be required to receive a customizable amount of `Strawberry` items to access the Epilogue and optionally to access your Goal Area as well. +There are a variety of progression, location, and aesthetic options available. Please be safe on the climb. + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. + +## What does randomization do to this game? + +By default, the Prologue, the A-Side levels for Chapters 1-7, and the Epilogue are included in the randomizer. Using options, B- and C-Sides can also be included, as can the Core and Farewell chapters. One level is chosen via an option to be the "Goal Area". Obtaining the required amount of Strawberry items from the multiworld and clearing this Goal Area will grant access to the Epilogue and the Credits, which is the goal of the randomizer. + +## What items get shuffled? + +The main collectable in this game is Strawberries, which you must collect to complete the game. + +16 Crystal Heart items are included as filler items (Heart Gates are disabled in this mod). Any additional space in the item pool is filled by Raspberries, which do nothing, and Traps. + +The following interactable items are included in the item pool, so long as any active level includes them: +- Springs +- Dash Refills +- Traffic Blocks +- Pink Cassette Blocks +- Blue Cassette Blocks +- Dream Blocks +- Coins +- Strawberry Seeds +- Sinking Platforms +- Moving Platforms +- Blue Clouds +- Pink Clouds +- Blue Boosters +- Red Boosters +- Move Blocks +- White Block +- Swap Blocks +- Dash Switches +- Torches +- Theo Crystal +- Feathers +- Bumpers +- Kevins +- Badeline Boosters +- Fire and Ice Balls +- Core Toggles +- Core Blocks +- Pufferfish +- Jellyfish +- Double Dash Refills +- Breaker Boxes +- Yellow Cassette Blocks +- Green Cassette Blocks +- Bird + +Additionally, the following items can optionally be included in the Item Pool: +- Keys +- Checkpoints +- Summit Gems +- One Cassette per active level + +Finally, the following Traps can be optionally included in the Item Pool: +- Bald Trap +- Literature Trap +- Stun Trap +- Invisible Trap +- Fast Trap +- Slow Trap +- Ice Trap +- Reverse Trap +- Screen Flip Trap +- Laughter Trap +- Hiccup Trap +- Zoom Trap + +## What locations get shuffled? + +By default, the locations in Celeste (Open World) which can contain items are: +- Level Clears +- Strawberries +- Crystal Hearts +- Cassettes + +Additionally, the following locations can optionally be included in the Location Pool: +- Golden Strawberries +- Keys +- Checkpoints +- Summit Gems +- Cars +- Binoculars +- Rooms + +## How can I get started? + +To get started playing Celeste (Open World) in Archipelago, [go to the setup guide for this game](../../../tutorial/Celeste%20(Open%20World)/guide/en) diff --git a/worlds/celeste_open_world/docs/guide_en.md b/worlds/celeste_open_world/docs/guide_en.md new file mode 100644 index 00000000..eb96d627 --- /dev/null +++ b/worlds/celeste_open_world/docs/guide_en.md @@ -0,0 +1,20 @@ +# Celeste (Open World) Setup Guide + +## Required Software +- The latest version of Celeste (1.4) from any official PC game distributor +- Olympus (Celeste Mod Manager) from: [Olympus Download Page](https://everestapi.github.io/) +- The latest version of the Archipelago Open World mod for Celeste from: [GitHub Release](https://github.com/PoryGoneDev/Celeste-Archipelago-Open-World/releases) + +## Installation Procedures (Windows/Linux) + +1. Install the latest version of Celeste (v1.4) on PC +2. Install `Olympus` (mod manager/launcher) and `Everest` (mod loader) per its instructions: [Olympus Setup Instructions](https://everestapi.github.io/) +3. Place the `Archipelago_Open_World.zip` from the GitHub release into the `mods` folder in your Celeste install +4. (Recommended) From the main menu, enter `Mod Options` and set `Debug Mode` to `Everest` or `Always`. This will give you access to a rudimentary Text Client which can be toggled with the `~` key. + +## Joining a MultiWorld Game + +1. Load Everest from the Olympus Launcher with the Archipelago Open World mod enabled +2. Enter the Connection Menu via the `Connect` button on the main menu +3. Use the keyboard to enter your connection information, then press the Connect button +4. Once connected, you can use the Debug Menu (opened with `~`) as a Text Client, by typing "`!ap `" followed by what you would normally enter into a Text Client From 5fd9570368bb86acbd35c613cb526f24fb36e730 Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 1 Sep 2025 18:53:58 -0500 Subject: [PATCH 033/204] Docs: Add section about adding Components (#5097) * kinda driven by wanting to test the labeling change in prod but also components are a weird part of the ecosystem and could use more documentation. * additional text describing launch/launch_subprocess and their use * Update docs/adding games.md Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --------- Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --- docs/adding games.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/adding games.md b/docs/adding games.md index c3eb0d02..762a908f 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -62,6 +62,24 @@ if possible. * If your client appears in the Archipelago Launcher, you may define an icon for it that differentiates it from other clients. The icon size is 48x48 pixels, but smaller or larger images will scale to that size. +### Launcher Integration + +If you have a python client or want to utilize the integration features of the Archipelago Launcher (ex. Slot links in +webhost) you can define a Component to be a part of the Launcher. `LauncherComponents.components` can be appended to +with additional Components in order to automatically add them to the Launcher. Most Components only need a +`display_name` and `func`, but `supports_uri` and `game_name` can be defined to support launching by webhost links, +`icon` and `description` can be used to customize display in the Launcher UI, and `file_identifier` can be used to +launch by file. + +Additionally, if you use `func` you have access to LauncherComponent.launch or launch_subprocess to run your +function as a subprocesses that can be utilized side by side other clients. +```py +def my_func(*args: str): + from .client import run_client + LauncherComponent.launch(run_client, name="My Client", args=args) +``` + + ## World The world is your game integration for the Archipelago generator, webhost, and multiworld server. It contains all the From 14d65fdf28cd8b03056dc2a967508d383cb29400 Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 1 Sep 2025 18:54:34 -0500 Subject: [PATCH 034/204] Docs: Add doc for shared cache (#5129) * adds doc file describing what the shared cache is, how to use it, and what you can currently expect in it * Update docs/shared_cache.md Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --------- Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com> --- docs/shared_cache.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/shared_cache.md diff --git a/docs/shared_cache.md b/docs/shared_cache.md new file mode 100644 index 00000000..0dd32392 --- /dev/null +++ b/docs/shared_cache.md @@ -0,0 +1,18 @@ +# Shared Cache + +Archipelago maintains a shared folder of information that can be persisted for a machine and reused across Libraries. +It can be found at the User Cache Directory for appname `Archipelago` in the `Cache` subfolder +(ex. `%LOCALAPPDATA%/Archipelago/Cache`). + +## Common Cache + +The Common Cache `common.json` can be used to store any generic data that is expected to be shared across programs +for the same User. + +* `uuid`: A UUID identifier used to identify clients as from the same user/machine, to be sent in the Connect packet + +## Data Package Cache + +The `datapackage` folder in the shared cache folder is used to store datapackages by game and checksum to be reused +in order to save network traffic. The expected structure is `datapackage/Game Name/checksum_value.json` with the +contents of each json file being the no-whitespace datapackage contents. From a0a1c5d4c0453ea367e12966d926c0bbb70eed67 Mon Sep 17 00:00:00 2001 From: Rhenaud Dubois Date: Tue, 2 Sep 2025 01:56:52 +0200 Subject: [PATCH 035/204] Pokemon Emerald: Added Pokemon Gen 3 Adjuster data (#5145) * Added Pokemon Gen 3 Adjuster data * Updated extracted data * Commented out adjuster docs for now * Replace in the docs markers with ** --- worlds/pokemon_emerald/__init__.py | 19 +- worlds/pokemon_emerald/adjuster_constants.py | 240 ++++++++++++++ .../pokemon_emerald/data/extracted_data.json | 2 +- worlds/pokemon_emerald/docs/adjuster_en.md | 293 ++++++++++++++++++ .../pokemon_emerald/docs/icon_palette_0.pal | 19 ++ .../pokemon_emerald/docs/icon_palette_1.pal | 19 ++ .../pokemon_emerald/docs/icon_palette_2.pal | 19 ++ 7 files changed, 608 insertions(+), 3 deletions(-) create mode 100644 worlds/pokemon_emerald/adjuster_constants.py create mode 100644 worlds/pokemon_emerald/docs/adjuster_en.md create mode 100644 worlds/pokemon_emerald/docs/icon_palette_0.pal create mode 100644 worlds/pokemon_emerald/docs/icon_palette_1.pal create mode 100644 worlds/pokemon_emerald/docs/icon_palette_2.pal diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index c1875710..4f2c2ef9 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -26,9 +26,14 @@ from .options import (Goal, DarkCavesRequireFlash, HmRequirements, ItemPoolType, from .pokemon import (get_random_move, get_species_id_by_label, randomize_abilities, randomize_learnsets, randomize_legendary_encounters, randomize_misc_pokemon, randomize_starters, randomize_tm_hm_compatibility,randomize_types, randomize_wild_encounters) -from .rom import PokemonEmeraldProcedurePatch, write_tokens +from .rom import PokemonEmeraldProcedurePatch, write_tokens from .util import get_encounter_type_label +# Try adding the Pokemon Gen 3 Adjuster +try: + from worlds._pokemon_gen3_adjuster import __init__ +except: + pass class PokemonEmeraldWebWorld(WebWorld): """ @@ -53,7 +58,7 @@ class PokemonEmeraldWebWorld(WebWorld): "setup/es", ["nachocua"] ) - + setup_sv = Tutorial( "Multivärld Installations Guide", "En guide för att kunna spela Pokémon Emerald med Archipelago.", @@ -63,6 +68,16 @@ class PokemonEmeraldWebWorld(WebWorld): ["Tsukino"] ) + # Add this doc file when the adjuster is merged + adjuster_en = Tutorial( + "Usage Guide", + "A guide to use the Pokemon Gen 3 Adjuster with Pokemon Emerald.", + "English", + "adjuster_en.md", + "adjuster/en", + ["RhenaudTheLukark"] + ) + tutorials = [setup_en, setup_es, setup_sv] option_groups = OPTION_GROUPS diff --git a/worlds/pokemon_emerald/adjuster_constants.py b/worlds/pokemon_emerald/adjuster_constants.py new file mode 100644 index 00000000..db3eac17 --- /dev/null +++ b/worlds/pokemon_emerald/adjuster_constants.py @@ -0,0 +1,240 @@ +from worlds._pokemon_gen3_adjuster.adjuster_constants import * +from .data import data + +EMERALD_PATCH_EXTENSIONS = ".apemerald" + +EMERALD_POKEMON_SPRITES = ["front_anim", "back", "icon", "footprint"] +EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY = ["front_anim", "back"] +EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY = ["sfront_anim", "sback"] +EMERALD_POKEMON_PALETTES = { + "palette": EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY, + "palette_shiny": EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY +} + +EMERALD_EGG_SPRITES = [*EMERALD_POKEMON_SPRITES, "hatch_anim"] +EMERALD_EGG_PALETTES = {**EMERALD_POKEMON_PALETTES, "palette_hatch": POKEMON_HATCH_PALETTE_EXTRACTION_PRIORITY} + +EMERALD_TRAINER_FOLDERS = ["Brendan", "May"] +EMERALD_TRAINER_SPRITES = ["walking_running", "acro_bike", "mach_bike", "surfing", "field_move", "underwater", + "fishing", "watering", "decorating", "battle_front", "battle_back"] +EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY = ["walking_running", "acro_bike", "mach_bike", "surfing", + "field_move", "fishing", "watering", "decorating"] +EMERALD_TRAINER_PALETTES = { + "palette": EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY, + "palette_reflection": TRAINER_REFLECTION_PALETTE_EXTRACTION_PRIORITY, + "palette_underwater": TRAINER_UNDERWATER_PALETTE_EXTRACTION_PRIORITY, + "palette_battle_back": TRAINER_BATTLE_BACK_PALETTE_EXTRACTION_PRIORITY, + "palette_battle_front": TRAINER_BATTLE_FRONT_PALETTE_EXTRACTION_PRIORITY +} + +EMERALD_SIMPLE_TRAINER_FOLDERS: list[str] = [] + +EMERALD_FOLDER_OBJECT_INFOS: list[dict[str, str | list[str] | dict[str, list[str]]]] = [ + { + "name": "Egg", + "key": "pokemon", + "folders": POKEMON_FOLDERS, + "sprites": EMERALD_EGG_SPRITES, + "palettes": EMERALD_EGG_PALETTES + }, + { + "key": "pokemon", + "folders": POKEMON_FOLDERS, + "sprites": EMERALD_POKEMON_SPRITES, + "palettes": EMERALD_POKEMON_PALETTES + }, + { + "key": "players", + "folders": EMERALD_TRAINER_FOLDERS, + "sprites": EMERALD_TRAINER_SPRITES, + "palettes": EMERALD_TRAINER_PALETTES + }, + { + "key": "trainer", + "folders": EMERALD_SIMPLE_TRAINER_FOLDERS, + "sprites": SIMPLE_TRAINER_SPRITES, + "palettes": SIMPLE_TRAINER_PALETTES + } +] + +EMERALD_INTERNAL_ID_TO_OBJECT_ADDRESS = { + "pokemon_front_anim": ("gMonFrontPicTable", 8, False), + "pokemon_back": ("gMonBackPicTable", 8, False), + "pokemon_icon": ("gMonIconTable", 4, False), + "pokemon_icon_index": ("gMonIconPaletteIndices", 1, False), + "pokemon_footprint": ("gMonFootprintTable", 4, False), + "pokemon_hatch_anim": ("sEggHatchTiles", 0, True), + "pokemon_palette": ("gMonPaletteTable", 8, False), + "pokemon_palette_shiny": ("gMonShinyPaletteTable", 8, False), + "pokemon_palette_hatch": ("sEggPalette", 0, True), + "pokemon_stats": ("gSpeciesInfo", 28, False), + "pokemon_move_pool": ("gLevelUpLearnsets", 4, False), + + "brendan_walking_running": ("gObjectEventGraphicsInfoPointers", 400, False), + "brendan_mach_bike": ("gObjectEventGraphicsInfoPointers", 404, False), + "brendan_acro_bike": ("gObjectEventGraphicsInfoPointers", 408, False), + "brendan_surfing": ("gObjectEventGraphicsInfoPointers", 412, False), + "brendan_field_move": ("gObjectEventGraphicsInfoPointers", 416, False), + "brendan_underwater": ("gObjectEventGraphicsInfoPointers", 444, False), + "brendan_fishing": ("gObjectEventGraphicsInfoPointers", 548, False), + "brendan_watering": ("gObjectEventGraphicsInfoPointers", 764, False), + "brendan_decorating": ("gObjectEventGraphicsInfoPointers", 772, False), + "brendan_battle_front": ("gTrainerFrontPicTable", 568, False), + "brendan_battle_back": ("gTrainerBackPicTable", 0, False), + "brendan_battle_back_throw": ("sTrainerBackSpriteTemplates", 0, False), + "brendan_palette": ("sObjectEventSpritePalettes", 64, False), + "brendan_palette_reflection": ("sObjectEventSpritePalettes", 72, False), + "brendan_palette_underwater": ("sObjectEventSpritePalettes", 88, False), + "brendan_palette_battle_back": ("gTrainerBackPicPaletteTable", 0, False), + "brendan_palette_battle_front": ("gTrainerFrontPicPaletteTable", 568, False), + + "may_walking_running": ("gObjectEventGraphicsInfoPointers", 420, False), + "may_mach_bike": ("gObjectEventGraphicsInfoPointers", 424, False), + "may_acro_bike": ("gObjectEventGraphicsInfoPointers", 428, False), + "may_surfing": ("gObjectEventGraphicsInfoPointers", 432, False), + "may_field_move": ("gObjectEventGraphicsInfoPointers", 436, False), + "may_underwater": ("gObjectEventGraphicsInfoPointers", 448, False), + "may_fishing": ("gObjectEventGraphicsInfoPointers", 552, False), + "may_watering": ("gObjectEventGraphicsInfoPointers", 768, False), + "may_decorating": ("gObjectEventGraphicsInfoPointers", 776, False), + "may_battle_front": ("gTrainerFrontPicTable", 576, False), + "may_battle_back": ("gTrainerBackPicTable", 8, False), + "may_battle_back_throw": ("sTrainerBackSpriteTemplates", 24, False), + "may_palette": ("sObjectEventSpritePalettes", 136, False), + "may_palette_reflection": ("sObjectEventSpritePalettes", 144, False), + "may_palette_underwater": ("sObjectEventSpritePalettes", 88, False), + "may_palette_battle_back": ("gTrainerBackPicPaletteTable", 8, False), + "may_palette_battle_front": ("gTrainerFrontPicPaletteTable", 576, False), + + "brendan_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, False), + "may_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 4, False), + "emerald_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, True), + "frlg_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 8, True), +} + +EMERALD_OVERWORLD_SPRITE_ADDRESSES = { + "brendan_walking_running": [0, 400, 864], + "brendan_mach_bike": [4, 404], + "brendan_acro_bike": [252, 408], + "brendan_surfing": [8, 412], + "brendan_field_move": [12, 416], + "brendan_underwater": [444], + "brendan_fishing": [548], + "brendan_watering": [764], + "brendan_decorating": [772], + "may_walking_running": [356, 420, 868], + "may_mach_bike": [360, 424], + "may_acro_bike": [364, 428], + "may_surfing": [368, 432], + "may_field_move": [372, 436], + "may_underwater": [448], + "may_fishing": [552], + "may_watering": [768], + "may_decorating": [776], +} + +EMERALD_POINTER_REFERENCES = { + "overworld_palette_table": [("LoadObjectEventPalette", 40), ("PatchObjectPalette", 52), + ("FindObjectEventPaletteIndexByTag", 40)] +} + +EMERALD_OVERWORLD_PALETTE_IDS = { + "Brendan": 0x1100, + "May": 0x1110, + "Underwater": 0x1115 +} + +EMERALD_DATA_ADDRESSES_ORIGINAL = { + "LoadObjectEventPalette": 0x08e894, + "PatchObjectPalette": 0x08e91c, + "FindObjectEventPaletteIndexByTag": 0x08e980, + "gSpeciesInfo": 0x3203cc, + "gLevelUpLearnsets": 0x32937c, + "gMonFrontPicTable": 0x30a18c, + "gMonBackPicTable": 0x3028b8, + "gMonIconTable": 0x57bca8, + "gMonFootprintTable": 0x56e694, + "gMonPaletteTable": 0x303678, + "gMonShinyPaletteTable": 0x304438, + "gMonIconPaletteIndices": 0x57c388, + "sEggPalette": 0x32b70c, + "sEggHatchTiles": 0x32b72c, + "gObjectEventGraphicsInfoPointers": 0x505620, + "sObjectEventSpritePalettes": 0x50bbc8, + "gTrainerFrontPicTable": 0x305654, + "gTrainerFrontPicPaletteTable": 0x30593c, + "gTrainerBackPicTable": 0x305d4c, + "gTrainerBackPicPaletteTable": 0x305d8c, + "sTrainerBackSpriteTemplates": 0x329df8, + "gTrainerBackAnimsPtrTable": 0x305d0c, + "sBackAnims_Brendan": 0x305ccc, + "sBackAnims_Red": 0x305cdc, + "gObjectEventBaseOam_16x16": 0x5094fc, + "gObjectEventBaseOam_16x32": 0x509514, + "gObjectEventBaseOam_32x32": 0x50951c, + "sOamTables_16x16": 0x50954c, + "sOamTables_16x32": 0x5095a0, + "sOamTables_32x32": 0x5095f4, + "sEmpty6": 0xe3cf31 +} + +EMERALD_DATA_ADDRESS_BEGINNING = 0x00 +EMERALD_DATA_ADDRESS_END = 0xFFFFFF + +EMERALD_DATA_ADDRESS_INFOS: dict[str, int | dict[str, int]] = { + "Emerald": { + "crc32": 0x1f1c08fb, + "original_addresses": EMERALD_DATA_ADDRESSES_ORIGINAL, + "ap_addresses": data.rom_addresses, + "data_address_beginning": EMERALD_DATA_ADDRESS_BEGINNING, + "data_address_end": EMERALD_DATA_ADDRESS_END + } +} + +EMERALD_VALID_OVERWORLD_SPRITE_SIZES: list[dict[str, int | str]] = [ + {"width": 16, "height": 16, "data": "sOamTables_16x16", "distrib": "gObjectEventBaseOam_16x16"}, + {"width": 16, "height": 32, "data": "sOamTables_16x32", "distrib": "gObjectEventBaseOam_16x32"}, + {"width": 32, "height": 32, "data": "sOamTables_32x32", "distrib": "gObjectEventBaseOam_32x32"}, +] + +EMERALD_SPRITES_REQUIREMENTS: dict[str, dict[str, bool | int | list[int]]] = { + "pokemon_front_anim": {"frames": 2, "width": 64, "height": 64}, + "pokemon_back": {"frames": 1, "width": 64, "height": 64}, + "pokemon_icon": {"frames": 2, "width": 32, "height": 32, "palette": VALID_ICON_PALETTES}, + "pokemon_footprint": {"frames": 1, "width": 16, "height": 16, "palette_size": 2, + "palette": VALID_FOOTPRINT_PALETTE}, + "pokemon_hatch_anim": {"frames": 1, "width": 32, "height": 136}, + "players_walking_running": {"frames": 18, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_reflection": {"frames": 18, "width": 16, "height": 32, "palette": []}, + "players_mach_bike": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_acro_bike": {"frames": 27, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_surfing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_field_move": {"frames": 5, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_underwater": {"frames": 9, "width": 32, "height": 32, + "palette": VALID_OVERWORLD_UNDERWATER_PALETTE}, + "players_fishing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_watering": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_decorating": {"frames": 1, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_battle_front": {"frames": 1, "width": 64, "height": 64}, + "players_battle_back": {"frames": [4, 5], "width": 64, "height": 64}, + "players_battle_back_throw": {"frames": [4, 5], "width": 64, "height": 64}, + "trainer_walking": {"frames": 9, "width": 16, "height": 32, "palette": VALID_WEAK_OVERWORLD_PALETTE}, + "trainer_battle_front": {"frames": 1, "width": 64, "height": 64}, +} + +EMERALD_SPRITES_REQUIREMENTS_EXCEPTIONS: dict[str, dict[str, dict[str, bool | int | list[int]]]] = { + "Castform": { + "pokemon_front_anim": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True}, + "pokemon_back": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True}, + }, + "Deoxys": { + "pokemon_back": {"frames": 2}, + "pokemon_icon": {"frames": 4}, + }, + "Unown A": { + "pokemon_front_anim": {"palette": VALID_UNOWN_PALETTE}, + "pokemon_back": {"palette": VALID_UNOWN_PALETTE}, + "pokemon_sfront_anim": {"palette": VALID_UNOWN_SHINY_PALETTE}, + "pokemon_sback": {"palette": VALID_UNOWN_SHINY_PALETTE}, + } +} \ No newline at end of file diff --git a/worlds/pokemon_emerald/data/extracted_data.json b/worlds/pokemon_emerald/data/extracted_data.json index f2706374..d066e31b 100644 --- a/worlds/pokemon_emerald/data/extracted_data.json +++ b/worlds/pokemon_emerald/data/extracted_data.json @@ -1 +1 @@ -{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainers":3230072,"gTutorMoves":6428060,"sFanfares":5422580,"sNewGamePCItems":6210444,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} +{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"FindObjectEventPaletteIndexByTag":586344,"LoadObjectEventPalette":586116,"PatchObjectPalette":586244,"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gMonBackPicTable":3174912,"gMonFootprintTable":5726932,"gMonFrontPicTable":3205844,"gMonIconPaletteIndices":5784268,"gMonIconTable":5782508,"gMonPaletteTable":3178432,"gMonShinyPaletteTable":3181952,"gObjectEventBaseOam_16x16":5311020,"gObjectEventBaseOam_16x32":5311044,"gObjectEventBaseOam_32x32":5311052,"gObjectEventGraphicsInfoPointers":5294928,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainerBackAnimsPtrTable":3188308,"gTrainerBackPicPaletteTable":3188436,"gTrainerBackPicTable":3188372,"gTrainerFrontPicPaletteTable":3187332,"gTrainerFrontPicTable":3186588,"gTrainers":3230072,"gTutorMoves":6428060,"sBackAnims_Brendan":3188244,"sBackAnims_Red":3188260,"sEggHatchTiles":3344020,"sEggPalette":3343988,"sEmpty6":14929745,"sNewGamePCItems":6210444,"sOamTables_16x16":5311100,"sOamTables_16x32":5311184,"sOamTables_32x32":5311268,"sObjectEventSpritePalettes":5320952,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTrainerBackSpriteTemplates":3337568,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} diff --git a/worlds/pokemon_emerald/docs/adjuster_en.md b/worlds/pokemon_emerald/docs/adjuster_en.md new file mode 100644 index 00000000..adb81b41 --- /dev/null +++ b/worlds/pokemon_emerald/docs/adjuster_en.md @@ -0,0 +1,293 @@ +# Pokémon Gen 3 Adjuster for Pokémon Emerald + +1) [Introduction](#introduction) +2) [Quickstart](#quickstart) +3) [Sprite Pack](#sprite-pack) + 1) [Extracting Resources from the ROM](#extracting-resources-from-the-rom) + 2) [Pokémon Folder Specifications](#pokemon-folder-specifications) + 1) [Pokémon Folder Sprites](#pokemon-folder-sprites) + 2) [Pokémon Folder Exceptions](#pokemon-folder-exceptions) + 3) [Player Folder Specifications](#player-folder-specifications) + 1) [Player Folder Palettes](#player-folder-palettes) + 2) [Player Folder Sprites](#player-folder-sprites) + 3) [Player Folder Sprite Size Override](#player-folder-sprite-size-override) +4) [Pokémon Data Edition](#pokemon-data-edition) +5) [Applying the Sprite Pack](#applying-the-sprite-pack) + +## Introduction + +The Pokémon Gen 3 Adjuster allows anyone to apply a sprite pack to Pokémon Emerald, Pokémon Firered and Pokémon +Leafgreen, in order to personnalize runs made in Archipelago with these games. + +While its main goal is to apply said sprite packs to an AP-patched version of said ROMs, the tool also allows the +patching of vanilla ROMs. + +## Quickstart + +If you want to quickly get into using the adjuster, you can create a sprite pack by +[extracting resources from the ROM](#extracting-resources-from-the-rom). + +Once you have said pack, modify the sprites in it at your leisure, but feel free to check the specifications for each +folder if you encounter any problem. + +Once a ROM (or AP patch) and a sprite pack is given, you just need to [apply the sprite pack](#applying-the-sprite-pack) +and run your adjusted ROM in your emulator of choice, and you're good to go! + +## Sprite Pack + +A sprite pack is a folder containing folders with specific names for the various objects you want to replace. Here +is an example of a valid sprite pack, who replaces some resources from the Pokémon Latios and the Player Brendan: + +``` +Sprite Pack/ + Brendan/ + battle_back.png + battle_front.png + Latios/ + front_anim.png + back.png +``` + +Note: If sprites contain several frames, then said frames must be vertical: a `64x64px` sprite with `2` +frames will require a `64x128px` sprite. + +**Warning:** All sprites used in sprite packs must be Indexed PNG files. Some pixel editing +programs such as Aseprite allow you to make those easily instead of standard PNG files. + +Different types of folder exists: mainly Pokémon folders, and Player folders. + +### Extracting Resources from the ROM + +The Pokémon Gen 3 Adjuster allows you to extract resources from any object handled by the adjuster. In order to +extract a resource, a ROM or .apemerald patch must be given. + +Once a valid ROM or patch is given, a new module will appear within the adjuster named `Sprite Extractor`. In it, +you can either select one specific object to extract the resources of using the field given in it, or you can +extract all resources from the ROM with one button press. + +Once you press any of the `Extract` buttons, you must select a folder in which either all resources from the +currently selected object will be extracted, or in which a complete sprite pack will be extracted. + +Note: If you try to extract resources in a folder that doesn't exist, the adjuster will create said folders +first. + +### Pokémon Folder Specifications + +Pokémon folder names correspond to the name of the 386 Pokémon available within Generation 3 of Pokémon, with some +extras and exceptions. Here is a list of them: + +- Nidoran♂ => Nidoran Male +- Nidoran♀ => Nidoran Female +- Unown => Unown A +- All letter shapes of Unown have been added as Unown B, Unown C... Unown Z +- Unown ! => Unown Exclamation Mark +- Unown ? => Unown Question Mark +- The Egg folder has been added + +#### Pokémon Folder Sprites + +Generally, Pokémon folders will handle these sprites: + +- `front_anim.png`: This sprite replaces the animation used when displaying the enemy's Pokémon sprite in battle, +and the Pokémon sprite used when looking at a Pokémon's status in your team menu + - Required sprite size: `64x64px` sprite with `2` frames (`64x128px`) + - Required palette size: `16` colors max +- `sfront_anim.png`: Shiny variant of the animation used when displaying the enemy's Pokémon sprite in battle, and +the Pokémon sprite used when looking at a Pokémon's status in your team menu + - Same requirements as `front_anim.png` + - Make sure that the sprite's pixel data matches the one from `front_anim.png`, as only the sprite's palette + is used by the adjuster +- `back.png`: This sprite replaces the sprite used when displaying your Pokémon sprite in battle + - Required sprite size: `64x64px` sprite + - Required palette size: `16` colors max +- `sback.png`: Shiny variant of the sprite used when displaying your Pokémon sprite in battle + - Optional if `sfront_anim.png` is given + - Same requirements as `back.png` + - Make sure that the sprite's pixel data matches the one from `back.png`, as only the sprite's palette + is used by the adjuster +- `icon-X.png`: Icon used for the Pokémon in the team menu + - Required sprite size: `32x32px` sprite with `2` frames (`32x64px`) + - X must be a value between 0 and 2: This number will choose which icon palette to use + - Icon palettes: [Palette 0](./icon_palette_0.pal), [Palette 1](./icon_palette_1.pal), + [Palette 2](./icon_palette_2.pal) + - Alternatively, `Venusaur` uses Palette 1, `Charizard` uses Palette 0, and `Blastoise` uses Palette 2. You can + extract those objects to get icon sprites with the right palettes. +- `footprint.png`: Pokémon's footprint in the Pokédex + - Required sprite size: `16x16px` sprite + - Required palette: Exactly 2 colors: black (0, 0, 0) and white (255, 255, 255) + +#### Pokémon Folder Exceptions + +While most Pokémon follow the rules above, some of them have different requirements: + +- Castform: + - `front_anim.png` & `sfront_anim.png`: + - Required sprite size: `64x64px` sprite with `4` frames (`64x256px`) + - Required palette size: Exactly `64` colors + - Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2 + uses colors 17-32 from the palette, etc... + - `back.png` & `sback.png`: + - Required sprite size: `64x64px` sprite with `4` frames (`64x256px`) + - Required palette size: Exactly `64` colors + - Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2 + uses colors 17-32 from the palette, etc... +- Deoxys: + - `back.png` & `sback.png`: + - Required sprite size: `64x64px` sprite with `2` frames (`64x128px`) + - First frame for the Normal Deoxys form, second frame for the Speed Deoxys form + - `icon-X.png`: + - Required sprite size: `32x32` sprite with `4` frames (`32x128px`) + - First two frames for the Normal Deoxys form, last two frames for the Speed Deoxys form +- All Unowns: + - `front_anim.png` & `back.png`: + - Palette: Only Unown A's palette is used for all Unowns, so the existing colors of the palette must be + kept. Extract Unown A's sprites to get its palette, and only edit the pink colors in it + - `sfront_anim.png` & `sback.png`: + - Palette: Only Unown A's shiny palette is used for all Unowns, so the existing colors of the palette must + be kept. Extract Unown A's sprites to get its shiny palette, and only edit the pink colors in it + - `footprint.png`: + - Only Unown A's footprint is used for all Unowns, thus this sprite doesn't exist within the ROM, and will + be ignored by the adjuster +- Egg: + - `hatch_anim.png`: + - Required sprite size: `32x32px` sprite with `4` frames + `8x8px` sprite with `4` frames (`32x136px`) + - Required palette size: `16` colors max + - Extract the Egg sprite from the ROM to see this sprite's shape. It contains 4 frames for the hatching + animation, and 4 frames for eggshells shards flying around after hatching + +### Player Folder Specifications + +Player folder names correspond to the name of the male and female players within Emerald: `Brendan` for the male +trainer, and `May` for the female trainer. + +These sprites are separated in two categories: battle sprites and overworld sprites. The sprites' palettes must be +the same between battle sprites, and between overworld sprites, unless stated otherwise. + +#### Player Folder Palettes + +The palettes used for overworld sprites has some restrictions, as elements other than the player uses said palette: +- The arrow displayed when next to an exit from a sub-area (cave, dungeon) uses the color #10 from the palette, +- The exclamation mark displayed above trainers when they notice you before battling uses colors #15 and #16 from +the palette, +- The Pokémon you surf on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and +color #16 for its dark shade, +- The Pokémon you fly on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and +color #16 for its dark shade, + +For this reason, color #15 of the player's overworld palette must be white (255, 255, 255), and color #16 must be +black (0, 0, 0). + +#### Player Folder Sprites + +- `battle_back.png`: `Battle` sprite. This sprite replaces the animation used when the player is throwing a ball, +whether it's at the beginning of a battle, or in the Safari Zone + - Required sprite size: `64x64px` sprite with `4` OR `5` frames (`64x256px` OR `64x320px`) + - Required palette size: Exactly `16` colors + - If `4` frames are given, the player will use the `Emerald-style` ball throwing animation, and if `5` frames + are given, the player will use the `Firered/Leafgreen-style` ball thowing animation + - `Emerald-style` ball throwing animation: The last frame is the idle frame, the rest is the animation + - `Firered/Leafgreen-style` ball throwing animation: The first frame is the idle frame, the rest is the + animation +- `battle_front.png`: `Battle` sprite. This sprite replaces the sprite used when fighting your rival, at the +beginning and end of a battle, and the sprite used in the Trainer card. + - Required sprite size: `64x64px` sprite + - Required palette size: Exactly `16` colors +- `walking_running.png`: `Overworld` sprite. This sprite replaces the walking and running animations of the player +in the overworld. + - Required sprite size: `16x32px` sprite with `18` frames (`16x576px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `reflection.png`: `Overworld` sprite. This sprite's palette is shown whenever the player stands in front of clear +water, in their reflection. + - Required sprite size: `16x32px` sprite with `18` frames (`16x576px`) + - Required palette size: Exactly `16` colors + - The palette must be a faded version of the overworld palette, to look like a reflection of the player in the + water +- `acro_bike.png`: `Overworld` sprite. This sprite replaces the Acro Bike animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `27` frames (`32x864px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `mach_bike.png`: `Overworld` sprite. This sprite replaces the Mach Bike animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `surfing.png`: `Overworld` sprite. This sprite replaces the surfing animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `12` frames (`32x384px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `field_move.png`: `Overworld` sprite. This sprite replaces the animation used when the player uses an HM move in +the overworld such as Cut, Rock Smash or Strength. + - Required sprite size: `32x32px` sprite with `5` frames (`32x160px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `underwater.png`: `Overworld` sprite. This sprite replaces the animation used when the player is swimming on a +Pokémon's back underwater. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors. Since this palette is shared among both players, the existing + colors of the palette must be kept. Extract the player's sprites to get its palette, and only edit colors #2 + to #5, and colors #11 to #16 +- `fishing.png`: `Overworld` sprite. This sprite replaces the animation used when the player is fishing. + - Required sprite size: `32x32px` sprite with `12` frames (`32x384px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `watering.png`: `Overworld` sprite. This sprite replaces the animation used when the player is watering berries. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `decorating.png`: `Overworld` sprite. This sprite replaces the sprite used when the player is decorating their +secret base. + - Required sprite size: `16x32px` sprite + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) + +#### Player Folder Sprite Size Override + +All overworld sprites frames can have a different size if you wish for your sprite to be bigger or smaller. In +order to change a sprite's size, you must add `-XxY` at the end of their file name, with `X` the width of the +sprite, and `Y` the height of the sprite. + +Currently, only three overworld sprite sizes are allowed: `16x16px`, `16x32px` and `32x32px`. + +For example, if you want the frames of the sprite `walking_running.png` to have a size of `32x32px`, then the +sprite must be named `walking_running-32x32.png`, and its size must be `32x576px`. + +## Pokémon Data Edition + +Once a sprite pack has been loaded into the adjuster, a `Sprite Preview` module will be added to it. It allows you +to preview the various sprites within the sprite pack, as well as their palette. + +If a valid ROM or AP patch have been given, then the `Pokémon Data Editor` module will appear. This module allows +you to edit some data related to the Pokémon in the current sprite pack. + +Here is a list of the values and their specifications: + +- HP: The Pokémon's base HP. Must be a number between 1 and 255. +- Attack: The Pokémon's base attack. Must be a number between 1 and 255. +- Defense: The Pokémon's base defense. Must be a number between 1 and 255. +- Sp. Attack: The Pokémon's base special attack. Must be a number between 1 and 255. +- Sp. Defense: The Pokémon's base special defense. Must be a number between 1 and 255. +- Speed: The Pokémon's base speed. Must be a number between 1 and 255. +- Type 1: The Pokémon's first type. Select a value within the given list. +- Type 2: The Pokémon's second type. Select a value within the given list. Make it match the first type if you want +the Pokémon to only have one type. +- Ability 1: The Pokémon's first ability. Select a value within the given list. +- Ability 2: The Pokémon's second ability. Select a value within the given list. Make it match the first ability if +you want the Pokémon to only have one ability. +- Gender Ratio: The Pokémon's gender ratio. Select a value within the given list. +- Forbid Flip: Dictates whether the Pokémon's sprite can be flipped or not when looking at the Pokémon's status +screen in your team. The sprite can't be flipped if the option is ticked, otherwise it can be flipped. +- Move Pool: The Pokémon's level up learnset. Each line must contain a move. Each move must be written in the +format `: `, with `` a known Pokémon move from this generation, and `` a number between 1 +and 100. + +**Warning:** Some of these values may overwrite randomization options selected in Archipelago: if the +Pokémon's base stats or level up move pool have been randomized, the adjuster will replace the randomized values +with its values. + +Hovering over a field's name will tell you more details about what kind of value it needs. Additionally, if the value's +text is red, blue or in bold, it will tell you exactly why. + +Saving any changes for the Pokémon's data will create a file named `data.txt` in the Pokémon's folder. The contents of +the file should not be modified manually. + +## Applying the Sprite Pack + +Once both a ROM (or AP patch) and a sprite pack have been passed to the adjuster, you can press the `Adjust ROM` +button and a new ROM will be made from the patch application, whih is usable as-is. + +In order to use this ROM instead of the standard AP-patched ROM with Archipelago, once BizHawk or any other +emulator is running, you should open the ROM made from the adjuster instead of the original one. Normally, the ROM +made by the adjuster should have the same name as the ROM or AP patch you passed to it, with `-adjusted` added at +the end of its name. diff --git a/worlds/pokemon_emerald/docs/icon_palette_0.pal b/worlds/pokemon_emerald/docs/icon_palette_0.pal new file mode 100644 index 00000000..48a835b0 --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_0.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +131 131 115 +189 189 189 +255 255 255 +189 164 65 +246 246 41 +213 98 65 +246 148 41 +139 123 255 +98 74 205 +238 115 156 +255 180 164 +164 197 255 +106 172 156 +98 98 90 +65 65 65 diff --git a/worlds/pokemon_emerald/docs/icon_palette_1.pal b/worlds/pokemon_emerald/docs/icon_palette_1.pal new file mode 100644 index 00000000..261ea164 --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +115 115 115 +189 189 189 +255 255 255 +123 156 74 +156 205 74 +148 246 74 +238 115 156 +246 148 246 +189 164 90 +246 230 41 +246 246 172 +213 213 106 +230 74 41 +98 98 90 +65 65 65 diff --git a/worlds/pokemon_emerald/docs/icon_palette_2.pal b/worlds/pokemon_emerald/docs/icon_palette_2.pal new file mode 100644 index 00000000..30463bae --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +123 123 123 +189 189 180 +255 255 255 +115 115 205 +164 172 246 +180 131 90 +238 197 139 +197 172 41 +246 246 41 +246 98 82 +148 123 205 +197 164 205 +189 41 156 +98 98 90 +65 65 65 From 2359cceb64075c684e1c45a5a831aafab8ec63f2 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Mon, 1 Sep 2025 21:29:31 -0600 Subject: [PATCH 036/204] AHiT: Add Death Link amnesty options (#4694) * Add basic death link amnesty option * Add death wish amnesty option --- worlds/ahit/Options.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/worlds/ahit/Options.py b/worlds/ahit/Options.py index ab6ba46f..98148097 100644 --- a/worlds/ahit/Options.py +++ b/worlds/ahit/Options.py @@ -623,6 +623,23 @@ class ParadeTrapWeight(Range): default = 20 +class DeathLinkAmnesty(Range): + """Amount of forgiven deaths before sending a Death Link. + 0 means that every death will send a Death Link.""" + display_name = "Death Link Amnesty" + range_start = 0 + range_end = 20 + default = 0 + + +class DWDeathLinkAmnesty(Range): + """Amount of forgiven deaths before sending a Death Link during Death Wish levels.""" + display_name = "Death Wish Amnesty" + range_start = 0 + range_end = 30 + default = 5 + + @dataclass class AHITOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -700,6 +717,8 @@ class AHITOptions(PerGameCommonOptions): ParadeTrapWeight: ParadeTrapWeight death_link: DeathLink + death_link_amnesty: DeathLinkAmnesty + dw_death_link_amnesty: DWDeathLinkAmnesty ahit_option_groups: Dict[str, List[Any]] = { @@ -769,4 +788,6 @@ slot_data_options: List[str] = [ "MaxPonCost", "death_link", + "death_link_amnesty", + "dw_death_link_amnesty", ] From 5f1835c546be4866370c72f9235c2765ac3cac50 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Tue, 2 Sep 2025 17:40:58 +0200 Subject: [PATCH 037/204] SC2: Content update (#5312) Feature highlights: - Adds many content to the SC2 game - Allows custom mission order - Adds race-swapped missions for build missions (except Epilogue and NCO) - Allows War Council Nerfs (Protoss units can get pre - War Council State, alternative units get another custom nerf to match the power level of base units) - Revamps Predator's upgrade tree (never was considered strategically important) - Adds some units and upgrades - Locked and excluded items can specify quantity - Key mode (if opt-in, missions require keys to be unlocked on top of their regular regular requirements - Victory caches - Victory locations can grant multiple items to the multiworld instead of one - The generator is more resilient for generator failures as it validates logic for item excludes - Fixes the following issues: - https://github.com/ArchipelagoMW/Archipelago/issues/3531 - https://github.com/ArchipelagoMW/Archipelago/issues/3548 --- Starcraft2Client.py | 4 +- WebHostLib/static/assets/sc2Tracker.js | 82 +- WebHostLib/static/styles/sc2Tracker.css | 391 +- WebHostLib/static/styles/sc2TrackerAtlas.css | 3965 +++++ WebHostLib/templates/tracker__Starcraft2.html | 3334 ++-- WebHostLib/tracker.py | 1295 +- worlds/LauncherComponents.py | 2 - worlds/_sc2common/bot/game_data.py | 4 +- worlds/sc2/Client.py | 1630 -- worlds/sc2/ClientGui.py | 306 - worlds/sc2/ItemGroups.py | 100 - worlds/sc2/ItemNames.py | 661 - worlds/sc2/Items.py | 2554 --- worlds/sc2/Locations.py | 1635 -- worlds/sc2/MissionTables.py | 739 - worlds/sc2/Options.py | 908 - worlds/sc2/PoolFilter.py | 661 - worlds/sc2/Regions.py | 691 - worlds/sc2/Rules.py | 952 -- worlds/sc2/Starcraft2.kv | 28 - worlds/sc2/__init__.py | 1231 +- worlds/sc2/client.py | 2352 +++ worlds/sc2/client_gui.py | 655 + worlds/sc2/docs/contributors.md | 53 +- worlds/sc2/docs/custom_mission_orders_en.md | 1092 ++ worlds/sc2/docs/en_Starcraft 2.md | 35 +- worlds/sc2/docs/fr_Starcraft 2.md | 6 +- worlds/sc2/docs/setup_en.md | 132 +- worlds/sc2/docs/setup_fr.md | 2 +- worlds/sc2/gui_config.py | 98 + worlds/sc2/item/__init__.py | 173 + worlds/sc2/item/item_annotations.py | 178 + worlds/sc2/item/item_descriptions.py | 1127 ++ worlds/sc2/item/item_groups.py | 902 + worlds/sc2/item/item_names.py | 957 ++ worlds/sc2/item/item_parents.py | 266 + worlds/sc2/item/item_tables.py | 2415 +++ worlds/sc2/item/parent_names.py | 57 + worlds/sc2/location_groups.py | 40 + worlds/sc2/locations.py | 14175 ++++++++++++++++ worlds/sc2/mission_groups.py | 194 + worlds/sc2/mission_order/__init__.py | 66 + worlds/sc2/mission_order/entry_rules.py | 389 + worlds/sc2/mission_order/generation.py | 702 + worlds/sc2/mission_order/layout_types.py | 620 + worlds/sc2/mission_order/mission_pools.py | 251 + worlds/sc2/mission_order/nodes.py | 606 + worlds/sc2/mission_order/options.py | 472 + worlds/sc2/mission_order/presets_scripted.py | 164 + worlds/sc2/mission_order/presets_static.py | 916 + worlds/sc2/mission_order/slot_data.py | 53 + worlds/sc2/mission_tables.py | 577 + worlds/sc2/options.py | 1746 ++ worlds/sc2/pool_filter.py | 493 + worlds/sc2/regions.py | 532 + worlds/sc2/rules.py | 3582 ++++ worlds/sc2/settings.py | 49 + worlds/sc2/starcraft2.kv | 61 + worlds/sc2/test/test_Regions.py | 41 - worlds/sc2/test/test_base.py | 47 +- worlds/sc2/test/test_custom_mission_orders.py | 216 + worlds/sc2/test/test_generation.py | 1228 ++ worlds/sc2/test/test_item_filtering.py | 88 + worlds/sc2/test/test_itemdescriptions.py | 18 + worlds/sc2/test/test_itemgroups.py | 32 + worlds/sc2/test/test_items.py | 170 + worlds/sc2/test/test_location_groups.py | 37 + worlds/sc2/test/test_mission_groups.py | 9 + worlds/sc2/test/test_options.py | 20 +- worlds/sc2/test/test_regions.py | 40 + worlds/sc2/test/test_rules.py | 186 + worlds/sc2/test/test_usecases.py | 492 + worlds/sc2/transfer_data.py | 38 + 73 files changed, 46368 insertions(+), 13655 deletions(-) create mode 100644 WebHostLib/static/styles/sc2TrackerAtlas.css delete mode 100644 worlds/sc2/Client.py delete mode 100644 worlds/sc2/ClientGui.py delete mode 100644 worlds/sc2/ItemGroups.py delete mode 100644 worlds/sc2/ItemNames.py delete mode 100644 worlds/sc2/Items.py delete mode 100644 worlds/sc2/Locations.py delete mode 100644 worlds/sc2/MissionTables.py delete mode 100644 worlds/sc2/Options.py delete mode 100644 worlds/sc2/PoolFilter.py delete mode 100644 worlds/sc2/Regions.py delete mode 100644 worlds/sc2/Rules.py delete mode 100644 worlds/sc2/Starcraft2.kv create mode 100644 worlds/sc2/client.py create mode 100644 worlds/sc2/client_gui.py create mode 100644 worlds/sc2/docs/custom_mission_orders_en.md create mode 100644 worlds/sc2/gui_config.py create mode 100644 worlds/sc2/item/__init__.py create mode 100644 worlds/sc2/item/item_annotations.py create mode 100644 worlds/sc2/item/item_descriptions.py create mode 100644 worlds/sc2/item/item_groups.py create mode 100644 worlds/sc2/item/item_names.py create mode 100644 worlds/sc2/item/item_parents.py create mode 100644 worlds/sc2/item/item_tables.py create mode 100644 worlds/sc2/item/parent_names.py create mode 100644 worlds/sc2/location_groups.py create mode 100644 worlds/sc2/locations.py create mode 100644 worlds/sc2/mission_groups.py create mode 100644 worlds/sc2/mission_order/__init__.py create mode 100644 worlds/sc2/mission_order/entry_rules.py create mode 100644 worlds/sc2/mission_order/generation.py create mode 100644 worlds/sc2/mission_order/layout_types.py create mode 100644 worlds/sc2/mission_order/mission_pools.py create mode 100644 worlds/sc2/mission_order/nodes.py create mode 100644 worlds/sc2/mission_order/options.py create mode 100644 worlds/sc2/mission_order/presets_scripted.py create mode 100644 worlds/sc2/mission_order/presets_static.py create mode 100644 worlds/sc2/mission_order/slot_data.py create mode 100644 worlds/sc2/mission_tables.py create mode 100644 worlds/sc2/options.py create mode 100644 worlds/sc2/pool_filter.py create mode 100644 worlds/sc2/regions.py create mode 100644 worlds/sc2/rules.py create mode 100644 worlds/sc2/settings.py create mode 100644 worlds/sc2/starcraft2.kv delete mode 100644 worlds/sc2/test/test_Regions.py create mode 100644 worlds/sc2/test/test_custom_mission_orders.py create mode 100644 worlds/sc2/test/test_generation.py create mode 100644 worlds/sc2/test/test_item_filtering.py create mode 100644 worlds/sc2/test/test_itemdescriptions.py create mode 100644 worlds/sc2/test/test_itemgroups.py create mode 100644 worlds/sc2/test/test_items.py create mode 100644 worlds/sc2/test/test_location_groups.py create mode 100644 worlds/sc2/test/test_mission_groups.py create mode 100644 worlds/sc2/test/test_regions.py create mode 100644 worlds/sc2/test/test_rules.py create mode 100644 worlds/sc2/test/test_usecases.py create mode 100644 worlds/sc2/transfer_data.py diff --git a/Starcraft2Client.py b/Starcraft2Client.py index fb219a69..14e18320 100644 --- a/Starcraft2Client.py +++ b/Starcraft2Client.py @@ -3,9 +3,11 @@ from __future__ import annotations import ModuleUpdate ModuleUpdate.update() -from worlds.sc2.Client import launch +from worlds.sc2.client import launch import Utils +# This is deprecated, replaced with the client hooked from the Launcher +# Will be removed in a following release if __name__ == "__main__": Utils.init_logging("Starcraft2Client", exception_logger="Client") launch() diff --git a/WebHostLib/static/assets/sc2Tracker.js b/WebHostLib/static/assets/sc2Tracker.js index 30d4acd6..19cff21c 100644 --- a/WebHostLib/static/assets/sc2Tracker.js +++ b/WebHostLib/static/assets/sc2Tracker.js @@ -1,49 +1,43 @@ +let updateSection = (sectionName, fakeDOM) => { + document.getElementById(sectionName).innerHTML = fakeDOM.getElementById(sectionName).innerHTML; +} + window.addEventListener('load', () => { - // Reload tracker every 15 seconds - const url = window.location; - setInterval(() => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } + // Reload tracker every 60 seconds (sync'd) + const url = window.location; + // Note: This synchronization code is adapted from code in trackerCommon.js + const targetSecond = parseInt(document.getElementById('player-tracker').getAttribute('data-second')) + 3; + console.log("Target second of refresh: " + targetSecond); - // Create a fake DOM using the returned HTML - const domParser = new DOMParser(); - const fakeDOM = domParser.parseFromString(ajax.responseText, 'text/html'); - - // Update item tracker - document.getElementById('inventory-table').innerHTML = fakeDOM.getElementById('inventory-table').innerHTML; - // Update only counters in the location-table - let counters = document.getElementsByClassName('counter'); - const fakeCounters = fakeDOM.getElementsByClassName('counter'); - for (let i = 0; i < counters.length; i++) { - counters[i].innerHTML = fakeCounters[i].innerHTML; - } + let getSleepTimeSeconds = () => { + // -40 % 60 is -40, which is absolutely wrong and should burn + var sleepSeconds = (((targetSecond - new Date().getSeconds()) % 60) + 60) % 60; + return sleepSeconds || 60; }; - ajax.open('GET', url); - ajax.send(); - }, 15000) - // Collapsible advancement sections - const categories = document.getElementsByClassName("location-category"); - for (let category of categories) { - let hide_id = category.id.split('_')[0]; - if (hide_id === 'Total') { - continue; - } - category.addEventListener('click', function() { - // Toggle the advancement list - document.getElementById(hide_id).classList.toggle("hide"); - // Change text of the header - const tab_header = document.getElementById(hide_id+'_header').children[0]; - const orig_text = tab_header.innerHTML; - let new_text; - if (orig_text.includes("▼")) { - new_text = orig_text.replace("▼", "▲"); - } - else { - new_text = orig_text.replace("▲", "▼"); - } - tab_header.innerHTML = new_text; - }); - } + let updateTracker = () => { + const ajax = new XMLHttpRequest(); + ajax.onreadystatechange = () => { + if (ajax.readyState !== 4) { return; } + + // Create a fake DOM using the returned HTML + const domParser = new DOMParser(); + const fakeDOM = domParser.parseFromString(ajax.responseText, 'text/html'); + + // Update dynamic sections + updateSection('player-info', fakeDOM); + updateSection('section-filler', fakeDOM); + updateSection('section-terran', fakeDOM); + updateSection('section-zerg', fakeDOM); + updateSection('section-protoss', fakeDOM); + updateSection('section-nova', fakeDOM); + updateSection('section-kerrigan', fakeDOM); + updateSection('section-keys', fakeDOM); + updateSection('section-locations', fakeDOM); + }; + ajax.open('GET', url); + ajax.send(); + updater = setTimeout(updateTracker, getSleepTimeSeconds() * 1000); + }; + window.updater = setTimeout(updateTracker, getSleepTimeSeconds() * 1000); }); diff --git a/WebHostLib/static/styles/sc2Tracker.css b/WebHostLib/static/styles/sc2Tracker.css index 29a719a1..3048213e 100644 --- a/WebHostLib/static/styles/sc2Tracker.css +++ b/WebHostLib/static/styles/sc2Tracker.css @@ -1,160 +1,279 @@ -#player-tracker-wrapper{ - margin: 0; +*{ + margin: 0; + font-family: "JuraBook", monospace; +} +body{ + --icon-size: 36px; + --item-class-padding: 4px; +} +a{ + color: #1ae; } -#tracker-table td { - vertical-align: top; +/* Section colours */ +#player-info{ + background-color: #37a; +} +.player-tracker{ + max-width: 100%; +} +.tracker-section{ + background-color: grey; +} +#terran-items{ + background-color: #3a7; +} +#zerg-items{ + background-color: #d94; +} +#protoss-items{ + background-color: #37a; +} +#nova-items{ + background-color: #777; +} +#kerrigan-items{ + background-color: #a37; +} +#keys{ + background-color: #aa2; } -.inventory-table-area{ - border: 2px solid #000000; - border-radius: 4px; - padding: 3px 10px 3px 10px; +/* Sections */ +.section-body{ + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: flex-start; + padding-bottom: 3px; +} +.section-body-2{ + display: flex; + flex-direction: column; +} +.tracker-section:has(input.collapse-section[type=checkbox]:checked) .section-body, +.tracker-section:has(input.collapse-section[type=checkbox]:checked) .section-body-2{ + display: none; +} +.section-title{ + position: relative; + border-bottom: 3px solid black; + /* Prevent text selection */ + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +input[type="checkbox"]{ + position: absolute; + cursor: pointer; + opacity: 0; + z-index: 1; + width: 100%; + height: 100%; +} +.section-title:hover h2{ + text-shadow: 0 0 4px #ddd; +} +.f { + display: flex; + overflow: hidden; } -.inventory-table-area:has(.inventory-table-terran) { - width: 690px; - background-color: #525494; +/* Acquire item filters */ +.tracker-section img{ + height: 100%; + width: var(--icon-size); + height: var(--icon-size); + background-color: black; +} +.unacquired, .lvl-0 .f{ + filter: grayscale(100%) contrast(80%) brightness(42%) blur(0.5px); +} +.spacer{ + width: var(--icon-size); + height: var(--icon-size); } -.inventory-table-area:has(.inventory-table-zerg) { - width: 360px; - background-color: #9d60d2; +/* Item groups */ +.item-class{ + display: flex; + flex-flow: column; + justify-content: center; + padding: var(--item-class-padding); +} +.item-class-header{ + display: flex; + flex-flow: row; +} +.item-class-upgrades{ + /* Note: {display: flex; flex-flow: column wrap} */ + /* just breaks on Firefox (width does not scale to content) */ + display: grid; + grid-template-rows: repeat(4, auto); + grid-auto-flow: column; } -.inventory-table-area:has(.inventory-table-protoss) { - width: 400px; - background-color: #d2b260; +/* Subsections */ +.section-toc{ + display: flex; + flex-direction: row; +} +.toc-box{ + position: relative; + padding-left: 15px; + padding-right: 15px; +} +.toc-box:hover{ + text-shadow: 0 0 7px white; +} +.ss-header{ + position: relative; + text-align: center; + writing-mode: sideways-lr; + user-select: none; + padding-top: 5px; + font-size: 115%; +} +.tracker-section:has(input.ss-1-toggle:checked) .ss-1{ + display: none; +} +.tracker-section:has(input.ss-2-toggle:checked) .ss-2{ + display: none; +} +.tracker-section:has(input.ss-3-toggle:checked) .ss-3{ + display: none; +} +.tracker-section:has(input.ss-4-toggle:checked) .ss-4{ + display: none; +} +.tracker-section:has(input.ss-5-toggle:checked) .ss-5{ + display: none; +} +.tracker-section:has(input.ss-6-toggle:checked) .ss-6{ + display: none; +} +.tracker-section:has(input.ss-7-toggle:checked) .ss-7{ + display: none; +} +.tracker-section:has(input.ss-1-toggle:hover) .ss-1{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-2-toggle:hover) .ss-2{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-3-toggle:hover) .ss-3{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-4-toggle:hover) .ss-4{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-5-toggle:hover) .ss-5{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-6-toggle:hover) .ss-6{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-7-toggle:hover) .ss-7{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; } -#tracker-table .inventory-table td{ - width: 40px; - height: 40px; - text-align: center; - vertical-align: middle; +/* Progressive items */ +.progressive{ + max-height: var(--icon-size); + display: contents; } -.inventory-table td.title{ - padding-top: 10px; - height: 20px; - font-family: "JuraBook", monospace; - font-size: 16px; - font-weight: bold; +.lvl-0 > :nth-child(2), +.lvl-0 > :nth-child(3), +.lvl-0 > :nth-child(4), +.lvl-0 > :nth-child(5){ + display: none; +} +.lvl-1 > :nth-child(2), +.lvl-1 > :nth-child(3), +.lvl-1 > :nth-child(4), +.lvl-1 > :nth-child(5){ + display: none; +} +.lvl-2 > :nth-child(1), +.lvl-2 > :nth-child(3), +.lvl-2 > :nth-child(4), +.lvl-2 > :nth-child(5){ + display: none; +} +.lvl-3 > :nth-child(1), +.lvl-3 > :nth-child(2), +.lvl-3 > :nth-child(4), +.lvl-3 > :nth-child(5){ + display: none; +} +.lvl-4 > :nth-child(1), +.lvl-4 > :nth-child(2), +.lvl-4 > :nth-child(3), +.lvl-4 > :nth-child(5){ + display: none; +} +.lvl-5 > :nth-child(1), +.lvl-5 > :nth-child(2), +.lvl-5 > :nth-child(3), +.lvl-5 > :nth-child(4){ + display: none; } -.inventory-table img{ - height: 100%; - max-width: 40px; - max-height: 40px; - border: 1px solid #000000; - filter: grayscale(100%) contrast(75%) brightness(20%); - background-color: black; +/* Filler item counters */ +.item-counter{ + display: table; + text-align: center; + padding: var(--item-class-padding); +} +.item-count{ + display: table-cell; + vertical-align: middle; + padding-left: 3px; + padding-right: 15px; } -.inventory-table img.acquired{ - filter: none; - background-color: black; +/* Hidden items */ +.hidden-class:not(:has(img.acquired)){ + display: none; +} +.hidden-item:not(.acquired){ + display:none; } -.inventory-table .tint-terran img.acquired { - filter: sepia(100%) saturate(300%) brightness(130%) hue-rotate(120deg) +/* Keys */ +#keys ol, #keys ul{ + columns: 3; + -webkit-columns: 3; + -moz-columns: 3; +} +#keys li{ + padding-right: 15pt; } -.inventory-table .tint-protoss img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(180deg) +/* Locations */ +#section-locations{ + padding-left: 5px; +} +@media only screen and (min-width: 120ch){ + #section-locations ul{ + columns: 2; + -webkit-columns: 2; + -moz-columns: 2; + } +} +#locations li.checked{ + list-style-type: "✔ "; } -.inventory-table .tint-level-1 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) -} - -.inventory-table .tint-level-2 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(120deg) -} - -.inventory-table .tint-level-3 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(240deg) -} - -.inventory-table div.counted-item { - position: relative; -} - -.inventory-table div.item-count { - width: 160px; - text-align: left; - color: black; - font-family: "JuraBook", monospace; - font-weight: bold; -} - -#location-table{ - border: 2px solid #000000; - border-radius: 4px; - background-color: #87b678; - padding: 10px 3px 3px; - font-family: "JuraBook", monospace; - font-size: 16px; - font-weight: bold; - cursor: default; -} - -#location-table table{ - width: 100%; -} - -#location-table th{ - vertical-align: middle; - text-align: left; - padding-right: 10px; -} - -#location-table td{ - padding-top: 2px; - padding-bottom: 2px; - line-height: 20px; -} - -#location-table td.counter { - text-align: right; - font-size: 14px; -} - -#location-table td.toggle-arrow { - text-align: right; -} - -#location-table tr#Total-header { - font-weight: bold; -} - -#location-table img{ - height: 100%; - max-width: 30px; - max-height: 30px; -} - -#location-table tbody.locations { - font-size: 16px; -} - -#location-table td.location-name { - padding-left: 16px; -} - -#location-table td:has(.location-column) { - vertical-align: top; -} - -#location-table .location-column { - width: 100%; - height: 100%; -} - -#location-table .location-column .spacer { - min-height: 24px; -} - -.hide { - display: none; -} +/* Allowing scrolling down a little further */ +.bottom-padding{ + min-height: 33vh; +} \ No newline at end of file diff --git a/WebHostLib/static/styles/sc2TrackerAtlas.css b/WebHostLib/static/styles/sc2TrackerAtlas.css new file mode 100644 index 00000000..7fc8746f --- /dev/null +++ b/WebHostLib/static/styles/sc2TrackerAtlas.css @@ -0,0 +1,3965 @@ +.abilityicon_spawnbanelings_square-png{ + clip-path: xywh(0 0.0% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.93694829760403%); +} + +.abilityicon_spawnbroodlings_square-png{ + clip-path: xywh(0 0.12610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.810844892812106%); +} + +.biomassrecovery_coop-png{ + clip-path: xywh(0 0.25220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.68474148802018%); +} + +.btn-ability-dehaka-airbonusdamage-png{ + clip-path: xywh(0 0.37831021437578816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.558638083228246%); +} + +.btn-ability-hornerhan-fleethyperjump-png{ + clip-path: xywh(0 0.5044136191677175% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.43253467843632%); +} + +.btn-ability-hornerhan-raven-analyzetarget-png{ + clip-path: xywh(0 0.6305170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.306431273644385%); +} + +.btn-ability-hornerhan-reaper-flightmode-png{ + clip-path: xywh(0 0.7566204287515763% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.18032786885246%); +} + +.btn-ability-hornerhan-salvagebonus-png{ + clip-path: xywh(0 0.8827238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.05422446406053%); +} + +.btn-ability-hornerhan-viking-missileupgrade-png{ + clip-path: xywh(0 1.008827238335435% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.9281210592686%); +} + +.btn-ability-hornerhan-viking-piercingattacks-png{ + clip-path: xywh(0 1.1349306431273645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.80201765447667%); +} + +.btn-ability-hornerhan-widowmine-attackrange-png{ + clip-path: xywh(0 1.2610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.675914249684745%); +} + +.btn-ability-hornerhan-widowmine-deathblossom-png{ + clip-path: xywh(0 1.3871374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.54981084489281%); +} + +.btn-ability-hornerhan-wraith-attackspeed-png{ + clip-path: xywh(0 1.5132408575031526% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.423707440100884%); +} + +.btn-ability-kerrigan-abilityefficiency-png{ + clip-path: xywh(0 1.639344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.29760403530895%); +} + +.btn-ability-kerrigan-apocalypse-png{ + clip-path: xywh(0 1.7654476670870114% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.17150063051702%); +} + +.btn-ability-kerrigan-automatedextractors-png{ + clip-path: xywh(0 1.8915510718789408% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.0453972257251%); +} + +.btn-ability-kerrigan-broodlingnest-png{ + clip-path: xywh(0 2.01765447667087% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.91929382093316%); +} + +.btn-ability-kerrigan-droppods-png{ + clip-path: xywh(0 2.1437578814627996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.793190416141236%); +} + +.btn-ability-kerrigan-fury-png{ + clip-path: xywh(0 2.269861286254729% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.66708701134931%); +} + +.btn-ability-kerrigan-heroicfortitude-png{ + clip-path: xywh(0 2.3959646910466583% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.540983606557376%); +} + +.btn-ability-kerrigan-improvedoverlords-png{ + clip-path: xywh(0 2.5220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.41488020176545%); +} + +.btn-ability-kerrigan-kineticblast-png{ + clip-path: xywh(0 2.648171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.288776796973515%); +} + +.btn-ability-kerrigan-leapingstrike-png{ + clip-path: xywh(0 2.7742749054224465% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.16267339218159%); +} + +.btn-ability-kerrigan-malignantcreep-png{ + clip-path: xywh(0 2.900378310214376% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.03656998738966%); +} + +.btn-ability-kerrigan-psychicshift-png{ + clip-path: xywh(0 3.0264817150063053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.91046658259773%); +} + +.btn-ability-kerrigan-revive-png{ + clip-path: xywh(0 3.1525851197982346% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.7843631778058%); +} + +.btn-ability-kerrigan-twindrones-png{ + clip-path: xywh(0 3.278688524590164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.658259773013874%); +} + +.btn-ability-kerrigan-vespeneefficiency-png{ + clip-path: xywh(0 3.4047919293820934% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.53215636822194%); +} + +.btn-ability-kerrigan-wildmutation-png{ + clip-path: xywh(0 3.530895334174023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.406052963430014%); +} + +.btn-ability-kerrigan-zerglingreconstitution-png{ + clip-path: xywh(0 3.656998738965952% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.27994955863808%); +} + +.btn-ability-mengsk-battlecruiser-decksights-png{ + clip-path: xywh(0 3.7831021437578816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.15384615384615%); +} + +.btn-ability-mengsk-ghost-pyrokineticimmolation_orange-png{ + clip-path: xywh(0 3.909205548549811% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.02774274905423%); +} + +.btn-ability-mengsk-ghost-staticempblast-png{ + clip-path: xywh(0 4.03530895334174% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.90163934426229%); +} + +.btn-ability-mengsk-ghost-tacticalmissilestrike-png{ + clip-path: xywh(0 4.16141235813367% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.775535939470366%); +} + +.btn-ability-mengsk-medivac-doublehealbeam-png{ + clip-path: xywh(0 4.287515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.64943253467844%); +} + +.btn-ability-mengsk-medivac-igniteafterburners-png{ + clip-path: xywh(0 4.4136191677175285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.523329129886505%); +} + +.btn-ability-mengsk-siegetank-flyingtankarmament-png{ + clip-path: xywh(0 4.539722572509458% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.39722572509458%); +} + +.btn-ability-mengsk-viking-speed-png{ + clip-path: xywh(0 4.665825977301387% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.27112232030265%); +} + +.btn-ability-nova-domination-png{ + clip-path: xywh(0 4.791929382093317% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.14501891551072%); +} + +.btn-ability-protoss-adept-spiritform-png{ + clip-path: xywh(0 4.918032786885246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.01891551071879%); +} + +.btn-ability-protoss-astralwind-png{ + clip-path: xywh(0 5.044136191677175% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.89281210592686%); +} + +.btn-ability-protoss-barrier-upgraded-png{ + clip-path: xywh(0 5.170239596469105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.76670870113493%); +} + +.btn-ability-protoss-blink-color-png{ + clip-path: xywh(0 5.296343001261034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.640605296343004%); +} + +.btn-ability-protoss-blinkshieldrestore-png{ + clip-path: xywh(0 5.422446406052964% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.51450189155107%); +} + +.btn-ability-protoss-carrierrepairdrones-png{ + clip-path: xywh(0 5.548549810844893% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.388398486759144%); +} + +.btn-ability-protoss-chargedblast-png{ + clip-path: xywh(0 5.674653215636822% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.26229508196721%); +} + +.btn-ability-protoss-coronabeam-png{ + clip-path: xywh(0 5.800756620428752% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.13619167717528%); +} + +.btn-ability-protoss-disintegration-png{ + clip-path: xywh(0 5.926860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.010088272383356%); +} + +.btn-ability-protoss-disruptionblast-png{ + clip-path: xywh(0 6.0529634300126105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.88398486759142%); +} + +.btn-ability-protoss-doubleshieldrecharge-png{ + clip-path: xywh(0 6.17906683480454% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.757881462799496%); +} + +.btn-ability-protoss-dragoonchassis-png{ + clip-path: xywh(0 6.305170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.63177805800757%); +} + +.btn-ability-protoss-dualgravitonbeam-png{ + clip-path: xywh(0 6.431273644388399% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.505674653215635%); +} + +.btn-ability-protoss-entomb-png{ + clip-path: xywh(0 6.557377049180328% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.37957124842371%); +} + +.btn-ability-protoss-feedback-color-png{ + clip-path: xywh(0 6.683480453972257% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.25346784363178%); +} + +.btn-ability-protoss-firebeam-png{ + clip-path: xywh(0 6.809583858764187% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.12736443883985%); +} + +.btn-ability-protoss-forcefield-color-png{ + clip-path: xywh(0 6.935687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.00126103404792%); +} + +.btn-ability-protoss-forceofwill-png{ + clip-path: xywh(0 7.061790668348046% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.87515762925599%); +} + +.btn-ability-protoss-gravitonbeam-color-png{ + clip-path: xywh(0 7.187894073139975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.74905422446406%); +} + +.btn-ability-protoss-hallucination-color-png{ + clip-path: xywh(0 7.313997477931904% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.622950819672134%); +} + +.btn-ability-protoss-lightningdash-png{ + clip-path: xywh(0 7.440100882723834% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.4968474148802%); +} + +.btn-ability-protoss-massrecall-png{ + clip-path: xywh(0 7.566204287515763% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.37074401008827%); +} + +.btn-ability-protoss-mindblast-png{ + clip-path: xywh(0 7.6923076923076925% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.24464060529634%); +} + +.btn-ability-protoss-oracle-stasiscalibration-png{ + clip-path: xywh(0 7.818411097099622% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.11853720050441%); +} + +.btn-ability-protoss-oraclepulsarcannonon-png{ + clip-path: xywh(0 7.944514501891551% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.992433795712486%); +} + +.btn-ability-protoss-phantomdash-png{ + clip-path: xywh(0 8.07061790668348% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.86633039092055%); +} + +.btn-ability-protoss-prismaticrange-png{ + clip-path: xywh(0 8.19672131147541% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.740226986128626%); +} + +.btn-ability-protoss-purify-png{ + clip-path: xywh(0 8.32282471626734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.6141235813367%); +} + +.btn-ability-protoss-recallondeath-png{ + clip-path: xywh(0 8.448928121059268% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.488020176544765%); +} + +.btn-ability-protoss-reclamation-png{ + clip-path: xywh(0 8.575031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.36191677175284%); +} + +.btn-ability-protoss-shadowdash-png{ + clip-path: xywh(0 8.701134930643127% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.23581336696091%); +} + +.btn-ability-protoss-shadowfury-png{ + clip-path: xywh(0 8.827238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.10970996216898%); +} + +.btn-ability-protoss-shieldrecharge-png{ + clip-path: xywh(0 8.953341740226985% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.98360655737705%); +} + +.btn-ability-protoss-stasistrap-png{ + clip-path: xywh(0 9.079445145018916% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.85750315258512%); +} + +.btn-ability-protoss-supplicant-sacrificeon-png{ + clip-path: xywh(0 9.205548549810844% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.73139974779319%); +} + +.btn-ability-protoss-veilofshadowsvorazun-png{ + clip-path: xywh(0 9.331651954602775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.60529634300126%); +} + +.btn-ability-protoss-voidstasis-png{ + clip-path: xywh(0 9.457755359394703% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.47919293820933%); +} + +.btn-ability-protoss-vulcanblaster-png{ + clip-path: xywh(0 9.583858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.3530895334174%); +} + +.btn-ability-protoss-warprelocatelvl2-png{ + clip-path: xywh(0 9.709962168978562% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.22698612862547%); +} + +.btn-ability-protoss-whirlwind-png{ + clip-path: xywh(0 9.836065573770492% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.10088272383354%); +} + +.btn-ability-spearofadun-chronomancy-png{ + clip-path: xywh(0 9.96216897856242% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.974779319041616%); +} + +.btn-ability-spearofadun-chronosurge-png{ + clip-path: xywh(0 10.08827238335435% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.84867591424968%); +} + +.btn-ability-spearofadun-deploypylon-png{ + clip-path: xywh(0 10.21437578814628% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.722572509457756%); +} + +.btn-ability-spearofadun-guardianshell-png{ + clip-path: xywh(0 10.34047919293821% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.59646910466583%); +} + +.btn-ability-spearofadun-massrecall-png{ + clip-path: xywh(0 10.466582597730138% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.470365699873895%); +} + +.btn-ability-spearofadun-matrixoverload-png{ + clip-path: xywh(0 10.592686002522068% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.34426229508197%); +} + +.btn-ability-spearofadun-nexusovercharge-png{ + clip-path: xywh(0 10.718789407313997% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.21815889029004%); +} + +.btn-ability-spearofadun-orbitalassimilator-png{ + clip-path: xywh(0 10.844892812105927% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.09205548549811%); +} + +.btn-ability-spearofadun-orbitalstrike-png{ + clip-path: xywh(0 10.970996216897856% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.96595208070618%); +} + +.btn-ability-spearofadun-purifierbeam-png{ + clip-path: xywh(0 11.097099621689786% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.83984867591425%); +} + +.btn-ability-spearofadun-reconstructionbeam-png{ + clip-path: xywh(0 11.223203026481714% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.71374527112232%); +} + +.btn-ability-spearofadun-shieldovercharge-png{ + clip-path: xywh(0 11.349306431273645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.58764186633039%); +} + +.btn-ability-spearofadun-solarbombardment-png{ + clip-path: xywh(0 11.475409836065573% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.46153846153846%); +} + +.btn-ability-spearofadun-solarlance-png{ + clip-path: xywh(0 11.601513240857503% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.33543505674653%); +} + +.btn-ability-spearofadun-temporalfield-png{ + clip-path: xywh(0 11.727616645649432% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.2093316519546%); +} + +.btn-ability-spearofadun-timestop-png{ + clip-path: xywh(0 11.853720050441362% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.08322824716267%); +} + +.btn-ability-spearofadun-warpharmonization-png{ + clip-path: xywh(0 11.97982345523329% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.957124842370746%); +} + +.btn-ability-spearofadun-warpinreinforcements-png{ + clip-path: xywh(0 12.105926860025221% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.83102143757881%); +} + +.btn-ability-stetmann-banelingmanashield-png{ + clip-path: xywh(0 12.23203026481715% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.704918032786885%); +} + +.btn-ability-stetmann-corruptormissilebarrage-png{ + clip-path: xywh(0 12.35813366960908% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.57881462799496%); +} + +.btn-ability-stukov-plaugedmunitions-png{ + clip-path: xywh(0 12.484237074401008% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.452711223203025%); +} + +.btn-ability-swarm-kerrigan-chainreaction-png{ + clip-path: xywh(0 12.610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.3266078184111%); +} + +.btn-ability-swarm-kerrigan-crushinggrip-png{ + clip-path: xywh(0 12.736443883984867% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.20050441361917%); +} + +.btn-ability-terran-calldownextrasupplies-color-png{ + clip-path: xywh(0 12.862547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.07440100882724%); +} + +.btn-ability-terran-cloak-color-png{ + clip-path: xywh(0 12.988650693568726% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.94829760403531%); +} + +.btn-ability-terran-detectionconedebuff-png{ + clip-path: xywh(0 13.114754098360656% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.82219419924338%); +} + +.btn-ability-terran-electricfield-png{ + clip-path: xywh(0 13.240857503152585% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.69609079445145%); +} + +.btn-ability-terran-emergencythrusters-png{ + clip-path: xywh(0 13.366960907944515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.56998738965952%); +} + +.btn-ability-terran-emp-color-png{ + clip-path: xywh(0 13.493064312736443% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.44388398486759%); +} + +.btn-ability-terran-goliath-jetpack-png{ + clip-path: xywh(0 13.619167717528374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.31778058007566%); +} + +.btn-ability-terran-hercules-tacticaljump-png{ + clip-path: xywh(0 13.745271122320302% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.19167717528373%); +} + +.btn-ability-terran-ignorearmor-png{ + clip-path: xywh(0 13.871374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.0655737704918%); +} + +.btn-ability-terran-liftoff-png{ + clip-path: xywh(0 13.997477931904161% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.939470365699876%); +} + +.btn-ability-terran-nuclearstrike-color-png{ + clip-path: xywh(0 14.123581336696091% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.81336696090794%); +} + +.btn-ability-terran-psidisruption-png{ + clip-path: xywh(0 14.24968474148802% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.687263556116015%); +} + +.btn-ability-terran-punishergrenade-color-png{ + clip-path: xywh(0 14.37578814627995% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.56116015132409%); +} + +.btn-ability-terran-restorationscbw-png{ + clip-path: xywh(0 14.501891551071878% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.435056746532155%); +} + +.btn-ability-terran-scannersweep-color-png{ + clip-path: xywh(0 14.627994955863809% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.30895334174023%); +} + +.btn-ability-terran-shreddermissile-color-png{ + clip-path: xywh(0 14.754098360655737% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.1828499369483%); +} + +.btn-ability-terran-spidermine-png{ + clip-path: xywh(0 14.880201765447667% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.05674653215637%); +} + +.btn-ability-terran-stimpack-color-png{ + clip-path: xywh(0 15.006305170239596% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.93064312736444%); +} + +.btn-ability-terran-unloadall-png{ + clip-path: xywh(0 15.132408575031526% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.80453972257251%); +} + +.btn-ability-terran-warpjump-png{ + clip-path: xywh(0 15.258511979823455% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.67843631778058%); +} + +.btn-ability-terran-widowminehidden-png{ + clip-path: xywh(0 15.384615384615385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.552332912988646%); +} + +.btn-ability-thor-330mm-png{ + clip-path: xywh(0 15.510718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.42622950819672%); +} + +.btn-ability-tychus-herc-heavyimpact-png{ + clip-path: xywh(0 15.636822194199244% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.30012610340479%); +} + +.btn-ability-tychus-medivac-png{ + clip-path: xywh(0 15.762925598991172% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.17402269861286%); +} + +.btn-ability-zeratul-avatarofform-psionicblast-png{ + clip-path: xywh(0 15.889029003783103% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.04791929382093%); +} + +.btn-ability-zeratul-chargedcrystal-psionicwinds-png{ + clip-path: xywh(0 16.01513240857503% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.921815889029006%); +} + +.btn-ability-zeratul-darkarchon-maelstrom-png{ + clip-path: xywh(0 16.14123581336696% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.79571248423707%); +} + +.btn-ability-zeratul-immortal-forcecannon-png{ + clip-path: xywh(0 16.26733921815889% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.669609079445145%); +} + +.btn-ability-zeratul-observer-sensorarray-png{ + clip-path: xywh(0 16.39344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.54350567465322%); +} + +.btn-ability-zeratul-topbar-serdathlegion-png{ + clip-path: xywh(0 16.51954602774275% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.417402269861284%); +} + +.btn-ability-zerg-abathur-corrosivebilelarge-png{ + clip-path: xywh(0 16.64564943253468% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.29129886506936%); +} + +.btn-ability-zerg-acidspores-png{ + clip-path: xywh(0 16.77175283732661% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.16519546027743%); +} + +.btn-ability-zerg-burrow-color-png{ + clip-path: xywh(0 16.897856242118536% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.0390920554855%); +} + +.btn-ability-zerg-causticspray-png{ + clip-path: xywh(0 17.023959646910466% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.91298865069357%); +} + +.btn-ability-zerg-corruption-color-png{ + clip-path: xywh(0 17.150063051702396% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.786885245901644%); +} + +.btn-ability-zerg-creepspread-png{ + clip-path: xywh(0 17.276166456494327% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.66078184110971%); +} + +.btn-ability-zerg-creepteleport-png{ + clip-path: xywh(0 17.402269861286253% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.534678436317776%); +} + +.btn-ability-zerg-darkswarm-png{ + clip-path: xywh(0 17.528373266078184% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.40857503152586%); +} + +.btn-ability-zerg-deeptunnel-png{ + clip-path: xywh(0 17.654476670870114% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.28247162673392%); +} + +.btn-ability-zerg-dehaka-essencecollector-png{ + clip-path: xywh(0 17.780580075662044% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.15636822194199%); +} + +.btn-ability-zerg-dehaka-guardian-explosivespores-png{ + clip-path: xywh(0 17.90668348045397% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.03026481715006%); +} + +.btn-ability-zerg-dehaka-guardian-primordialfury-png{ + clip-path: xywh(0 18.0327868852459% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.904161412358135%); +} + +.btn-ability-zerg-dehaka-impaler-tenderize-png{ + clip-path: xywh(0 18.15889029003783% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.778058007566205%); +} + +.btn-ability-zerg-dehaka-tyrannozor-barrageofspikes-png{ + clip-path: xywh(0 18.284993694829762% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.651954602774275%); +} + +.btn-ability-zerg-dehaka-tyrannozor-tyrantprotection-png{ + clip-path: xywh(0 18.41109709962169% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.525851197982345%); +} + +.btn-ability-zerg-dehaka-ultralisk-brutalcharge-png{ + clip-path: xywh(0 18.53720050441362% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.399747793190418%); +} + +.btn-ability-zerg-dehaka-ultralisk-healingadaptation-png{ + clip-path: xywh(0 18.66330390920555% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.273644388398488%); +} + +.btn-ability-zerg-dehaka-ultralisk-impalingstrike-png{ + clip-path: xywh(0 18.78940731399748% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.147540983606557%); +} + +.btn-ability-zerg-fireroach-increasefiredamage-png{ + clip-path: xywh(0 18.915510718789406% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.021437578814627%); +} + +.btn-ability-zerg-fungalgrowth-color-png{ + clip-path: xywh(0 19.041614123581336% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.8953341740227%); +} + +.btn-ability-zerg-genemutation-thornsaura-png{ + clip-path: xywh(0 19.167717528373267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.76923076923077%); +} + +.btn-ability-zerg-generatecreep-color-png{ + clip-path: xywh(0 19.293820933165197% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.64312736443884%); +} + +.btn-ability-zerg-overlord-oversight-off-png{ + clip-path: xywh(0 19.419924337957124% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.51702395964691%); +} + +.btn-ability-zerg-parasiticbomb-png{ + clip-path: xywh(0 19.546027742749054% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.390920554854983%); +} + +.btn-ability-zerg-rapidregeneration-color-png{ + clip-path: xywh(0 19.672131147540984% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.264817150063053%); +} + +.btn-ability-zerg-stukov-ensnare-png{ + clip-path: xywh(0 19.798234552332914% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.138713745271122%); +} + +.btn-ability-zerg-stukov-ensnarecdr-png{ + clip-path: xywh(0 19.92433795712484% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.012610340479192%); +} + +.btn-ability-zerg-transfusion-color-png{ + clip-path: xywh(0 20.05044136191677% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.886506935687265%); +} + +.btn-abilty-terran-lockdownscbw-png{ + clip-path: xywh(0 20.1765447667087% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.760403530895335%); +} + +.btn-accelerated-warp-png{ + clip-path: xywh(0 20.302648171500632% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.634300126103405%); +} + +.btn-adaptive-medpacks-png{ + clip-path: xywh(0 20.42875157629256% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.508196721311474%); +} + +.btn-advanced-construction-png{ + clip-path: xywh(0 20.55485498108449% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.382093316519548%); +} + +.btn-advanced-defensive-matrix-png{ + clip-path: xywh(0 20.68095838587642% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.255989911727617%); +} + +.btn-advanced-photon-blasters-png{ + clip-path: xywh(0 20.80706179066835% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.129886506935687%); +} + +.btn-advanced-targeting-png{ + clip-path: xywh(0 20.933165195460276% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.003783102143757%); +} + +.btn-afterburners-valkyrie-png{ + clip-path: xywh(0 21.059268600252206% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.87767969735183%); +} + +.btn-all-terrain-treads-png{ + clip-path: xywh(0 21.185372005044137% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.7515762925599%); +} + +.btn-amonshardsarmor-png{ + clip-path: xywh(0 21.311475409836067% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.62547288776797%); +} + +.btn-anti-surface-countermeasures-png{ + clip-path: xywh(0 21.437578814627994% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.49936948297604%); +} + +.btn-apial-sensors-png{ + clip-path: xywh(0 21.563682219419924% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.373266078184113%); +} + +.btn-arc-inducers-png{ + clip-path: xywh(0 21.689785624211854% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.247162673392182%); +} + +.btn-argus-talisman-png{ + clip-path: xywh(0 21.815889029003785% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.121059268600252%); +} + +.btn-armor-metling-blasters-png{ + clip-path: xywh(0 21.94199243379571% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.994955863808322%); +} + +.btn-atx-batteries-png{ + clip-path: xywh(0 22.06809583858764% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.868852459016395%); +} + +.btn-automated-mitosis-lvl1-png{ + clip-path: xywh(0 22.194199243379572% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.742749054224465%); +} + +.btn-banshee-cross-spectrum-dampeners-png{ + clip-path: xywh(0 22.320302648171502% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.616645649432535%); +} + +.btn-behemoth-stellarskin-png{ + clip-path: xywh(0 22.44640605296343% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.490542244640604%); +} + +.btn-blood-amulet-png{ + clip-path: xywh(0 22.57250945775536% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.364438839848678%); +} + +.btn-building-protoss-photoncannon-png{ + clip-path: xywh(0 22.69861286254729% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.238335435056747%); +} + +.btn-building-protoss-shieldbattery-png{ + clip-path: xywh(0 22.82471626733922% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.112232030264817%); +} + +.btn-building-stukov-infestedbunker-png{ + clip-path: xywh(0 22.950819672131146% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.986128625472887%); +} + +.btn-building-stukov-infestedturret-png{ + clip-path: xywh(0 23.076923076923077% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.86002522068096%); +} + +.btn-building-terran-autoturret-png{ + clip-path: xywh(0 23.203026481715007% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.73392181588903%); +} + +.btn-building-terran-bunker-png{ + clip-path: xywh(0 23.329129886506937% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.6078184110971%); +} + +.btn-building-terran-bunkerneosteel-png{ + clip-path: xywh(0 23.455233291298864% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.48171500630517%); +} + +.btn-building-terran-hivemindemulator-png{ + clip-path: xywh(0 23.581336696090794% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.355611601513242%); +} + +.btn-building-terran-missileturret-png{ + clip-path: xywh(0 23.707440100882724% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.229508196721312%); +} + +.btn-building-terran-planetaryfortress-png{ + clip-path: xywh(0 23.833543505674655% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.103404791929382%); +} + +.btn-building-terran-refineryautomated-png{ + clip-path: xywh(0 23.95964691046658% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.97730138713745%); +} + +.btn-building-terran-sensordome-png{ + clip-path: xywh(0 24.08575031525851% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.851197982345525%); +} + +.btn-building-terran-sigmaprojector-png{ + clip-path: xywh(0 24.211853720050442% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.725094577553595%); +} + +.btn-building-terran-techreactor-png{ + clip-path: xywh(0 24.337957124842372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.598991172761664%); +} + +.btn-building-zerg-hive-png{ + clip-path: xywh(0 24.4640605296343% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.472887767969734%); +} + +.btn-building-zerg-nydusworm-png{ + clip-path: xywh(0 24.59016393442623% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.346784363177807%); +} + +.btn-building-zerg-spinecrawler-png{ + clip-path: xywh(0 24.71626733921816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.220680958385877%); +} + +.btn-building-zerg-sporecannon-png{ + clip-path: xywh(0 24.84237074401009% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.094577553593947%); +} + +.btn-building-zerg-sporecrawler-png{ + clip-path: xywh(0 24.968474148802017% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.968474148802017%); +} + +.btn-caladrius-structure-png{ + clip-path: xywh(0 25.094577553593947% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.84237074401009%); +} + +.btn-chronostatic-reinforcement-png{ + clip-path: xywh(0 25.220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.71626733921816%); +} + +.btn-command-cancel-png{ + clip-path: xywh(0 25.346784363177807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.59016393442623%); +} + +.btn-concentrated-antimatter-png{ + clip-path: xywh(0 25.472887767969734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.4640605296343%); +} + +.btn-disintegrating-particles-png{ + clip-path: xywh(0 25.598991172761664% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.337957124842372%); +} + +.btn-disruptor-dispersion-png{ + clip-path: xywh(0 25.725094577553595% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.211853720050442%); +} + +.btn-endless-servitude-png{ + clip-path: xywh(0 25.851197982345525% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.08575031525851%); +} + +.btn-enhanced-servo-striders-png{ + clip-path: xywh(0 25.97730138713745% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.95964691046658%); +} + +.btn-enhanced-shield-generator-png{ + clip-path: xywh(0 26.103404791929382% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.833543505674655%); +} + +.btn-eye-of-wrath-png{ + clip-path: xywh(0 26.229508196721312% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.707440100882724%); +} + +.btn-fire-suppression-system-lvl2-png{ + clip-path: xywh(0 26.355611601513242% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.581336696090794%); +} + +.btn-fleshfused-targeting-optics-png{ + clip-path: xywh(0 26.48171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.455233291298864%); +} + +.btn-forged-chassis-png{ + clip-path: xywh(0 26.6078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.329129886506937%); +} + +.btn-gaping-maw-png{ + clip-path: xywh(0 26.73392181588903% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.203026481715007%); +} + +.btn-gravitic-thrusters-png{ + clip-path: xywh(0 26.86002522068096% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.076923076923077%); +} + +.btn-high-explosive-munition-png{ + clip-path: xywh(0 26.986128625472887% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.950819672131146%); +} + +.btn-high-voltage-capacitors-png{ + clip-path: xywh(0 27.112232030264817% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.82471626733922%); +} + +.btn-hostile-environment-adaptation-png{ + clip-path: xywh(0 27.238335435056747% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.69861286254729%); +} + +.btn-hull-of-past-glories-png{ + clip-path: xywh(0 27.364438839848678% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.57250945775536%); +} + +.btn-hunter-seeker-weapon-png{ + clip-path: xywh(0 27.490542244640604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.44640605296343%); +} + +.btn-iconic-wavelength-flux-png{ + clip-path: xywh(0 27.616645649432535% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.320302648171502%); +} + +.btn-improved-osmosis-png{ + clip-path: xywh(0 27.742749054224465% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.194199243379572%); +} + +.btn-infested-liberator-ag-png{ + clip-path: xywh(0 27.868852459016395% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.06809583858764%); +} + +.btn-integrated-power-png{ + clip-path: xywh(0 27.994955863808322% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.94199243379571%); +} + +.btn-jerry-rigged-patchjob-png{ + clip-path: xywh(0 28.121059268600252% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.815889029003785%); +} + +.btn-juggernaut-plating-herc-png{ + clip-path: xywh(0 28.247162673392182% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.689785624211854%); +} + +.btn-juggernaut-plating-marauder-png{ + clip-path: xywh(0 28.373266078184113% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.563682219419924%); +} + +.btn-jump-png{ + clip-path: xywh(0 28.49936948297604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.437578814627994%); +} + +.btn-kryhas-cloak-png{ + clip-path: xywh(0 28.62547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.311475409836067%); +} + +.btn-latticed-shielding-png{ + clip-path: xywh(0 28.7515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.185372005044137%); +} + +.btn-launch-vector-compensator-png{ + clip-path: xywh(0 28.87767969735183% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.059268600252206%); +} + +.btn-lesser-shadow-fury-png{ + clip-path: xywh(0 29.003783102143757% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.933165195460276%); +} + +.btn-magellan-computation-systems-png{ + clip-path: xywh(0 29.129886506935687% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.80706179066835%); +} + +.btn-mobility-protocols-png{ + clip-path: xywh(0 29.255989911727617% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.68095838587642%); +} + +.btn-modernized-servos-png{ + clip-path: xywh(0 29.382093316519548% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.55485498108449%); +} + +.btn-moirai-impulse-drive-png{ + clip-path: xywh(0 29.508196721311474% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.42875157629256%); +} + +.btn-monstrous-resilience-aberration-png{ + clip-path: xywh(0 29.634300126103405% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.302648171500632%); +} + +.btn-monstrous-resilience-corruptor-png{ + clip-path: xywh(0 29.760403530895335% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.1765447667087%); +} + +.btn-neutron-shields-png{ + clip-path: xywh(0 29.886506935687265% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.05044136191677%); +} + +.btn-null-shroud-png{ + clip-path: xywh(0 30.012610340479192% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.92433795712484%); +} + +.btn-obliterate-png{ + clip-path: xywh(0 30.138713745271122% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.798234552332914%); +} + +.btn-orbital-fortress-png{ + clip-path: xywh(0 30.264817150063053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.672131147540984%); +} + +.btn-pacification-protocols-png{ + clip-path: xywh(0 30.390920554854983% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.546027742749054%); +} + +.btn-peer-contempt-png{ + clip-path: xywh(0 30.51702395964691% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.419924337957124%); +} + +.btn-permacloak-banshee-png{ + clip-path: xywh(0 30.64312736443884% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.293820933165197%); +} + +.btn-permacloak-ghost-png{ + clip-path: xywh(0 30.76923076923077% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.167717528373267%); +} + +.btn-permacloak-medivac-png{ + clip-path: xywh(0 30.8953341740227% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.041614123581336%); +} + +.btn-permacloak-reaper-png{ + clip-path: xywh(0 31.021437578814627% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.915510718789406%); +} + +.btn-permacloak-spectre-png{ + clip-path: xywh(0 31.147540983606557% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.78940731399748%); +} + +.btn-permacloak-wraith-png{ + clip-path: xywh(0 31.273644388398488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.66330390920555%); +} + +.btn-phase-blaster-png{ + clip-path: xywh(0 31.399747793190418% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.53720050441362%); +} + +.btn-phase-cloak-png{ + clip-path: xywh(0 31.525851197982345% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.41109709962169%); +} + +.btn-prescient-spores-png{ + clip-path: xywh(0 31.651954602774275% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.284993694829762%); +} + +.btn-progression-hornerhan-6-mirabuildtime-png{ + clip-path: xywh(0 31.778058007566205% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.15889029003783%); +} + +.btn-progression-protoss-fenix-1-zealotsuit-png{ + clip-path: xywh(0 31.904161412358135% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.0327868852459%); +} + +.btn-progression-protoss-fenix-6-forgeresearch-png{ + clip-path: xywh(0 32.03026481715006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.90668348045397%); +} + +.btn-progression-zerg-dehaka-15-genemutation-png{ + clip-path: xywh(0 32.156368221941996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.780580075662044%); +} + +.btn-progression-zerg-dehaka-7-newdehakaabilities-png{ + clip-path: xywh(0 32.28247162673392% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.65447667087011%); +} + +.btn-propellant-sacs-png{ + clip-path: xywh(0 32.40857503152585% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.528373266078184%); +} + +.btn-rapid-metamorph-png{ + clip-path: xywh(0 32.53467843631778% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.402269861286257%); +} + +.btn-regenerativebiosteel-blue-png{ + clip-path: xywh(0 32.66078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.276166456494323%); +} + +.btn-regenerativebiosteel-green-png{ + clip-path: xywh(0 32.78688524590164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.150063051702396%); +} + +.btn-reintigrated-framework-png{ + clip-path: xywh(0 32.91298865069357% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.02395964691047%); +} + +.btn-research-terran-commandcenterreactor-png{ + clip-path: xywh(0 33.0390920554855% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.897856242118536%); +} + +.btn-research-terran-microfiltering-png{ + clip-path: xywh(0 33.16519546027743% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.77175283732661%); +} + +.btn-research-terran-orbitaldepots-png{ + clip-path: xywh(0 33.29129886506936% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.645649432534675%); +} + +.btn-research-terran-orbitalstrikerally-png{ + clip-path: xywh(0 33.417402269861284% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.51954602774275%); +} + +.btn-research-terran-ultracapacitors-png{ + clip-path: xywh(0 33.54350567465322% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.393442622950822%); +} + +.btn-research-terran-vanadiumplating-png{ + clip-path: xywh(0 33.669609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.267339218158888%); +} + +.btn-research-zerg-cellularreactor-png{ + clip-path: xywh(0 33.79571248423707% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.14123581336696%); +} + +.btn-research-zerg-fortifiedbunker-png{ + clip-path: xywh(0 33.921815889029006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.015132408575035%); +} + +.btn-research-zerg-regenerativebio-steel-png{ + clip-path: xywh(0 34.04791929382093% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.8890290037831%); +} + +.btn-rogue-forces-png{ + clip-path: xywh(0 34.17402269861286% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.762925598991174%); +} + +.btn-royalliberator-png{ + clip-path: xywh(0 34.30012610340479% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.63682219419924%); +} + +.btn-scatter-veil-png{ + clip-path: xywh(0 34.42622950819672% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.510718789407314%); +} + +.btn-scv-cliffjump-png{ + clip-path: xywh(0 34.55233291298865% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.384615384615387%); +} + +.btn-seismic-sonar-png{ + clip-path: xywh(0 34.67843631778058% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.258511979823453%); +} + +.btn-shadow-guard-training-png{ + clip-path: xywh(0 34.80453972257251% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.132408575031526%); +} + +.btn-shield-capacity-png{ + clip-path: xywh(0 34.93064312736444% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.0063051702396%); +} + +.btn-side-missiles-png{ + clip-path: xywh(0 35.05674653215637% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.880201765447666%); +} + +.btn-skyward-chronoanomaly-png{ + clip-path: xywh(0 35.182849936948294% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.754098360655739%); +} + +.btn-solarite-lens-png{ + clip-path: xywh(0 35.30895334174023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.627994955863805%); +} + +.btn-solarite-payload-png{ + clip-path: xywh(0 35.435056746532155% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.501891551071878%); +} + +.btn-stabilized-electrodes-png{ + clip-path: xywh(0 35.56116015132409% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.375788146279952%); +} + +.btn-sustaining-disruption-png{ + clip-path: xywh(0 35.687263556116015% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.249684741488018%); +} + +.btn-techupgrade-kinetic-foam-png{ + clip-path: xywh(0 35.81336696090794% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.123581336696091%); +} + +.btn-techupgrade-terran-cloakdistortionfield-color-png{ + clip-path: xywh(0 35.939470365699876% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.997477931904164%); +} + +.btn-techupgrade-terran-combatshield-color-png{ + clip-path: xywh(0 36.0655737704918% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.87137452711223%); +} + +.btn-techupgrade-terran-hellstormbatteries-color-png{ + clip-path: xywh(0 36.19167717528373% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.745271122320304%); +} + +.btn-techupgrade-terran-immortalityprotocol-color-png{ + clip-path: xywh(0 36.31778058007566% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.61916771752837%); +} + +.btn-techupgrade-terran-impalerrounds-color-png{ + clip-path: xywh(0 36.44388398486759% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.493064312736443%); +} + +.btn-techupgrade-terran-missilepods-color-level1-png{ + clip-path: xywh(0 36.569987389659524% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.366960907944517%); +} + +.btn-techupgrade-terran-ocularimplants-png{ + clip-path: xywh(0 36.69609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.240857503152583%); +} + +.btn-techupgrade-terran-psioniclash-color-png{ + clip-path: xywh(0 36.82219419924338% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.114754098360656%); +} + +.btn-techupgrade-terran-rapiddeployment-color-png{ + clip-path: xywh(0 36.94829760403531% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.98865069356873%); +} + +.btn-techupgrade-terran-shapedblast-color-png{ + clip-path: xywh(0 37.07440100882724% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.862547288776796%); +} + +.btn-techupgrade-terran-shapedhull-colored-png{ + clip-path: xywh(0 37.200504413619164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.736443883984869%); +} + +.btn-techupgrade-terran-titaniumhousing-color-png{ + clip-path: xywh(0 37.3266078184111% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.610340479192935%); +} + +.btn-techupgrade-terran-tomahawkpowercell-color-png{ + clip-path: xywh(0 37.452711223203025% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.484237074401008%); +} + +.btn-techupgrade-terran-u238rounds-color-png{ + clip-path: xywh(0 37.57881462799496% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.358133669609082%); +} + +.btn-tips-armory-png{ + clip-path: xywh(0 37.704918032786885% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.232030264817148%); +} + +.btn-tips-flamingbetty-png{ + clip-path: xywh(0 37.83102143757881% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.105926860025221%); +} + +.btn-tips-laserdrillantiair-png{ + clip-path: xywh(0 37.957124842370746% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.979823455233294%); +} + +.btn-tips-terran-energynova-png{ + clip-path: xywh(0 38.08322824716267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.85372005044136%); +} + +.btn-twilight-chassis-png{ + clip-path: xywh(0 38.2093316519546% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.727616645649434%); +} + +.btn-ued-rocketry-technology-png{ + clip-path: xywh(0 38.33543505674653% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.6015132408575%); +} + +.btn-ultrasonic-pulse-color-png{ + clip-path: xywh(0 38.46153846153846% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.475409836065573%); +} + +.btn-unit-biomechanicaldrone-png{ + clip-path: xywh(0 38.587641866330394% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.349306431273646%); +} + +.btn-unit-collection-primal-roachupgrade-png{ + clip-path: xywh(0 38.71374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.223203026481713%); +} + +.btn-unit-collection-primal-tyrannozor-png{ + clip-path: xywh(0 38.83984867591425% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.097099621689786%); +} + +.btn-unit-collection-probe-remastered-png{ + clip-path: xywh(0 38.96595208070618% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.97099621689786%); +} + +.btn-unit-collection-purifier-carrier-png{ + clip-path: xywh(0 39.09205548549811% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.844892812105925%); +} + +.btn-unit-collection-purifier-disruptor-png{ + clip-path: xywh(0 39.218158890290034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.718789407313999%); +} + +.btn-unit-collection-purifier-immortal-png{ + clip-path: xywh(0 39.34426229508197% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.592686002522065%); +} + +.btn-unit-collection-taldarim-carrier-png{ + clip-path: xywh(0 39.470365699873895% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.466582597730138%); +} + +.btn-unit-collection-taldarim-phoenix-png{ + clip-path: xywh(0 39.59646910466583% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.340479192938211%); +} + +.btn-unit-collection-vikingfighter-covertops-png{ + clip-path: xywh(0 39.722572509457756% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.214375788146278%); +} + +.btn-unit-collection-wraith-junker-png{ + clip-path: xywh(0 39.84867591424968% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.08827238335435%); +} + +.btn-unit-hunterling-png{ + clip-path: xywh(0 39.974779319041616% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.962168978562424%); +} + +.btn-unit-infested-infestedmedic-png{ + clip-path: xywh(0 40.10088272383354% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.83606557377049%); +} + +.btn-unit-protoss-adept-purifier-png{ + clip-path: xywh(0 40.22698612862547% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.709962168978564%); +} + +.btn-unit-protoss-alarak-taldarim-supplicant-png{ + clip-path: xywh(0 40.3530895334174% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.58385876418663%); +} + +.btn-unit-protoss-arbiter-png{ + clip-path: xywh(0 40.47919293820933% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.457755359394703%); +} + +.btn-unit-protoss-archon-upgraded-png{ + clip-path: xywh(0 40.605296343001264% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.331651954602776%); +} + +.btn-unit-protoss-archon-png{ + clip-path: xywh(0 40.73139974779319% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.205548549810842%); +} + +.btn-unit-protoss-carrier-png{ + clip-path: xywh(0 40.85750315258512% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.079445145018916%); +} + +.btn-unit-protoss-colossus-taldarim-png{ + clip-path: xywh(0 40.98360655737705% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.953341740226989%); +} + +.btn-unit-protoss-colossus-png{ + clip-path: xywh(0 41.10970996216898% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.827238335435055%); +} + +.btn-unit-protoss-corsair-png{ + clip-path: xywh(0 41.235813366960905% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.701134930643128%); +} + +.btn-unit-protoss-darktemplar-aiur-png{ + clip-path: xywh(0 41.36191677175284% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.575031525851195%); +} + +.btn-unit-protoss-darktemplar-taldarim-png{ + clip-path: xywh(0 41.488020176544765% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.448928121059268%); +} + +.btn-unit-protoss-darktemplar-png{ + clip-path: xywh(0 41.6141235813367% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.322824716267341%); +} + +.btn-unit-protoss-dragoon-void-png{ + clip-path: xywh(0 41.740226986128626% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.196721311475407%); +} + +.btn-unit-protoss-fenix-png{ + clip-path: xywh(0 41.86633039092055% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.07061790668348%); +} + +.btn-unit-protoss-hightemplar-nerazim-png{ + clip-path: xywh(0 41.992433795712486% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.944514501891554%); +} + +.btn-unit-protoss-hightemplar-taldarim-png{ + clip-path: xywh(0 42.11853720050441% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.81841109709962%); +} + +.btn-unit-protoss-hightemplar-png{ + clip-path: xywh(0 42.24464060529634% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.692307692307693%); +} + +.btn-unit-protoss-immortal-nerazim-png{ + clip-path: xywh(0 42.37074401008827% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.56620428751576%); +} + +.btn-unit-protoss-immortal-taldarim-png{ + clip-path: xywh(0 42.4968474148802% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.440100882723833%); +} + +.btn-unit-protoss-immortal-png{ + clip-path: xywh(0 42.622950819672134% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.313997477931906%); +} + +.btn-unit-protoss-khaydarinmonolith-png{ + clip-path: xywh(0 42.74905422446406% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.187894073139972%); +} + +.btn-unit-protoss-mothership-taldarim-png{ + clip-path: xywh(0 42.87515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.061790668348046%); +} + +.btn-unit-protoss-observer-png{ + clip-path: xywh(0 43.00126103404792% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.935687263556119%); +} + +.btn-unit-protoss-oracle-png{ + clip-path: xywh(0 43.12736443883985% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.809583858764185%); +} + +.btn-unit-protoss-phoenix-purifier-png{ + clip-path: xywh(0 43.253467843631775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.683480453972258%); +} + +.btn-unit-protoss-phoenix-png{ + clip-path: xywh(0 43.37957124842371% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.5573770491803245%); +} + +.btn-unit-protoss-probe-warpin-png{ + clip-path: xywh(0 43.505674653215635% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.431273644388398%); +} + +.btn-unit-protoss-probe-png{ + clip-path: xywh(0 43.63177805800757% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.305170239596471%); +} + +.btn-unit-protoss-reaver-png{ + clip-path: xywh(0 43.757881462799496% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.179066834804537%); +} + +.btn-unit-protoss-scout-png{ + clip-path: xywh(0 43.88398486759142% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.0529634300126105%); +} + +.btn-unit-protoss-scoutnerazim-png{ + clip-path: xywh(0 44.010088272383356% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.926860025220684%); +} + +.btn-unit-protoss-scoutpurifier-png{ + clip-path: xywh(0 44.13619167717528% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.80075662042875%); +} + +.btn-unit-protoss-scouttaldarim-png{ + clip-path: xywh(0 44.26229508196721% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.674653215636823%); +} + +.btn-unit-protoss-sentry-purifier-png{ + clip-path: xywh(0 44.388398486759144% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.548549810844889%); +} + +.btn-unit-protoss-sentry-taldarim-png{ + clip-path: xywh(0 44.51450189155107% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.422446406052963%); +} + +.btn-unit-protoss-sentry-png{ + clip-path: xywh(0 44.640605296343004% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.296343001261036%); +} + +.btn-unit-protoss-stalker-purifier-png{ + clip-path: xywh(0 44.76670870113493% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.170239596469102%); +} + +.btn-unit-protoss-stalker-taldarim-collection-ds-png{ + clip-path: xywh(0 44.89281210592686% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.044136191677175%); +} + +.btn-unit-protoss-stalker-png{ + clip-path: xywh(0 45.01891551071879% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.918032786885249%); +} + +.btn-unit-protoss-tempest-purifier-png{ + clip-path: xywh(0 45.14501891551072% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.791929382093315%); +} + +.btn-unit-protoss-voidray-purifier-png{ + clip-path: xywh(0 45.271122320302645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.665825977301388%); +} + +.btn-unit-protoss-voidray-taldarim-png{ + clip-path: xywh(0 45.39722572509458% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.539722572509454%); +} + +.btn-unit-protoss-warpprism-png{ + clip-path: xywh(0 45.523329129886505% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.413619167717528%); +} + +.btn-unit-protoss-warpray-png{ + clip-path: xywh(0 45.64943253467844% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.287515762925601%); +} + +.btn-unit-protoss-zealot-nerazim-png{ + clip-path: xywh(0 45.775535939470366% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.161412358133667%); +} + +.btn-unit-protoss-zealot-purifier-png{ + clip-path: xywh(0 45.90163934426229% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.03530895334174%); +} + +.btn-unit-protoss-zealot-png{ + clip-path: xywh(0 46.02774274905423% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.9092055485498136%); +} + +.btn-unit-terran-autoturretblackops-png{ + clip-path: xywh(0 46.15384615384615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.78310214375788%); +} + +.btn-unit-terran-banshee-mengsk-png{ + clip-path: xywh(0 46.27994955863808% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.656998738965953%); +} + +.btn-unit-terran-banshee-png{ + clip-path: xywh(0 46.406052963430014% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.5308953341740192%); +} + +.btn-unit-terran-bansheemercenary-png{ + clip-path: xywh(0 46.53215636822194% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.4047919293820925%); +} + +.btn-unit-terran-battlecruiser-png{ + clip-path: xywh(0 46.658259773013874% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.278688524590166%); +} + +.btn-unit-terran-battlecruiserloki-png{ + clip-path: xywh(0 46.7843631778058% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.152585119798232%); +} + +.btn-unit-terran-battlecruisermengsk-png{ + clip-path: xywh(0 46.91046658259773% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.0264817150063053%); +} + +.btn-unit-terran-cobra-png{ + clip-path: xywh(0 47.03656998738966% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.9003783102143785%); +} + +.btn-unit-terran-cyclone-png{ + clip-path: xywh(0 47.16267339218159% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.7742749054224447%); +} + +.btn-unit-terran-deathhead-png{ + clip-path: xywh(0 47.288776796973515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.648171500630518%); +} + +.btn-unit-terran-firebat-png{ + clip-path: xywh(0 47.41488020176545% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.522068095838584%); +} + +.btn-unit-terran-firebatmercenary-png{ + clip-path: xywh(0 47.540983606557376% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.3959646910466574%); +} + +.btn-unit-terran-ghost-png{ + clip-path: xywh(0 47.66708701134931% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.2698612862547307%); +} + +.btn-unit-terran-ghostmengsk-png{ + clip-path: xywh(0 47.793190416141236% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.143757881462797%); +} + +.btn-unit-terran-goliath-mengsk-png{ + clip-path: xywh(0 47.91929382093316% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.01765447667087%); +} + +.btn-unit-terran-goliath-png{ + clip-path: xywh(0 48.0453972257251% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.8915510718789434%); +} + +.btn-unit-terran-goliathmercenary-png{ + clip-path: xywh(0 48.17150063051702% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.7654476670870096%); +} + +.btn-unit-terran-hellion-png{ + clip-path: xywh(0 48.29760403530895% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.639344262295083%); +} + +.btn-unit-terran-hellionbattlemode-png{ + clip-path: xywh(0 48.423707440100884% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.513240857503149%); +} + +.btn-unit-terran-herc-png{ + clip-path: xywh(0 48.54981084489281% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.3871374527112224%); +} + +.btn-unit-terran-hercules-png{ + clip-path: xywh(0 48.675914249684745% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.2610340479192956%); +} + +.btn-unit-terran-liberator-png{ + clip-path: xywh(0 48.80201765447667% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.1349306431273618%); +} + +.btn-unit-terran-liberatorblackops-png{ + clip-path: xywh(0 48.9281210592686% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.008827238335435%); +} + +.btn-unit-terran-marauder-png{ + clip-path: xywh(0 49.05422446406053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.8827238335435084%); +} + +.btn-unit-terran-maraudermengsk-png{ + clip-path: xywh(0 49.18032786885246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.7566204287515745%); +} + +.btn-unit-terran-maraudermercenary-png{ + clip-path: xywh(0 49.306431273644385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.6305170239596478%); +} + +.btn-unit-terran-marine-mengsk-png{ + clip-path: xywh(0 49.43253467843632% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.504413619167714%); +} + +.btn-unit-terran-marine-png{ + clip-path: xywh(0 49.558638083228246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.37831021437578727%); +} + +.btn-unit-terran-marinemercenary-png{ + clip-path: xywh(0 49.68474148802018% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.25220680958386055%); +} + +.btn-unit-terran-medic-mengsk-png{ + clip-path: xywh(0 49.810844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.12610340479192672%); +} + +.btn-unit-terran-medic-png{ + clip-path: xywh(0 49.93694829760403% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.0%); +} + +.btn-unit-terran-medicelite-png{ + clip-path: xywh(0 50.06305170239597% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.12610340479192672%); +} + +.btn-unit-terran-medivac-png{ + clip-path: xywh(0 50.189155107187894% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.25220680958386055%); +} + +.btn-unit-terran-merc-thor-png{ + clip-path: xywh(0 50.31525851197982% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.37831021437578727%); +} + +.btn-unit-terran-mule-png{ + clip-path: xywh(0 50.441361916771754% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.504413619167714%); +} + +.btn-unit-terran-perditionturret-png{ + clip-path: xywh(0 50.56746532156368% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.6305170239596478%); +} + +.btn-unit-terran-predator-png{ + clip-path: xywh(0 50.693568726355615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.7566204287515745%); +} + +.btn-unit-terran-raven-png{ + clip-path: xywh(0 50.81967213114754% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.8827238335435084%); +} + +.btn-unit-terran-reaper-png{ + clip-path: xywh(0 50.94577553593947% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.008827238335435%); +} + +.btn-unit-terran-sciencevessel-png{ + clip-path: xywh(0 51.0718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.1349306431273618%); +} + +.btn-unit-terran-siegetank-png{ + clip-path: xywh(0 51.19798234552333% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.2610340479192956%); +} + +.btn-unit-terran-siegetankmengsk-png{ + clip-path: xywh(0 51.324085750315255% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.3871374527112224%); +} + +.btn-unit-terran-siegetankmercenary-tank-png{ + clip-path: xywh(0 51.45018915510719% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.513240857503149%); +} + +.btn-unit-terran-spectre-png{ + clip-path: xywh(0 51.576292559899116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.639344262295083%); +} + +.btn-unit-terran-thor-png{ + clip-path: xywh(0 51.70239596469105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.7654476670870096%); +} + +.btn-unit-terran-thormengsk-png{ + clip-path: xywh(0 51.82849936948298% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.8915510718789434%); +} + +.btn-unit-terran-thorsiegemode-png{ + clip-path: xywh(0 51.9546027742749% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.01765447667087%); +} + +.btn-unit-terran-troopermengsk-png{ + clip-path: xywh(0 52.08070617906684% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.143757881462797%); +} + +.btn-unit-terran-valkyriescbw-png{ + clip-path: xywh(0 52.206809583858764% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.2698612862547307%); +} + +.btn-unit-terran-vikingfighter-png{ + clip-path: xywh(0 52.33291298865069% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.3959646910466574%); +} + +.btn-unit-terran-vikingmengskfighter-png{ + clip-path: xywh(0 52.459016393442624% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.522068095838584%); +} + +.btn-unit-terran-vikingmercenary-fighter-png{ + clip-path: xywh(0 52.58511979823455% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.648171500630518%); +} + +.btn-unit-terran-vulture-png{ + clip-path: xywh(0 52.711223203026485% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.7742749054224447%); +} + +.btn-unit-terran-warhound-png{ + clip-path: xywh(0 52.83732660781841% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.9003783102143785%); +} + +.btn-unit-terran-widowmine-png{ + clip-path: xywh(0 52.96343001261034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.0264817150063053%); +} + +.btn-unit-terran-wraith-mengsk-png{ + clip-path: xywh(0 53.08953341740227% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.152585119798232%); +} + +.btn-unit-terran-wraith-png{ + clip-path: xywh(0 53.2156368221942% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.278688524590166%); +} + +.btn-unit-voidray-aiur-png{ + clip-path: xywh(0 53.341740226986126% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.4047919293820925%); +} + +.btn-unit-zerg-aberration-png{ + clip-path: xywh(0 53.46784363177806% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.5308953341740192%); +} + +.btn-unit-zerg-baneling-hunter-png{ + clip-path: xywh(0 53.593947036569986% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.656998738965953%); +} + +.btn-unit-zerg-baneling-png{ + clip-path: xywh(0 53.72005044136192% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.78310214375788%); +} + +.btn-unit-zerg-broodlord-png{ + clip-path: xywh(0 53.84615384615385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.9092055485498136%); +} + +.btn-unit-zerg-broodqueen-png{ + clip-path: xywh(0 53.97225725094577% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.03530895334174%); +} + +.btn-unit-zerg-bullfrog-png{ + clip-path: xywh(0 54.09836065573771% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.161412358133667%); +} + +.btn-unit-zerg-classicqueen-png{ + clip-path: xywh(0 54.224464060529634% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.287515762925601%); +} + +.btn-unit-zerg-corruptor-png{ + clip-path: xywh(0 54.35056746532156% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.413619167717528%); +} + +.btn-unit-zerg-defilerscbw-png{ + clip-path: xywh(0 54.476670870113495% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.539722572509454%); +} + +.btn-unit-zerg-devourerex3-png{ + clip-path: xywh(0 54.60277427490542% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.665825977301388%); +} + +.btn-unit-zerg-hydralisk-remastered-png{ + clip-path: xywh(0 54.728877679697355% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.791929382093315%); +} + +.btn-unit-zerg-hydralisk-png{ + clip-path: xywh(0 54.85498108448928% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.918032786885249%); +} + +.btn-unit-zerg-impaler-png{ + clip-path: xywh(0 54.98108448928121% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.044136191677175%); +} + +.btn-unit-zerg-infestedbanshee-png{ + clip-path: xywh(0 55.10718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.170239596469102%); +} + +.btn-unit-zerg-infesteddiamondback-png{ + clip-path: xywh(0 55.23329129886507% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.296343001261036%); +} + +.btn-unit-zerg-infestedliberator-png{ + clip-path: xywh(0 55.359394703656996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.422446406052963%); +} + +.btn-unit-zerg-infestedmarine-png{ + clip-path: xywh(0 55.48549810844893% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.548549810844889%); +} + +.btn-unit-zerg-infestedsiegetank-png{ + clip-path: xywh(0 55.611601513240856% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.674653215636823%); +} + +.btn-unit-zerg-infestor-png{ + clip-path: xywh(0 55.73770491803279% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.80075662042875%); +} + +.btn-unit-zerg-kerriganascended-png{ + clip-path: xywh(0 55.86380832282472% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.926860025220684%); +} + +.btn-unit-zerg-kerriganghost-png{ + clip-path: xywh(0 55.989911727616644% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.0529634300126105%); +} + +.btn-unit-zerg-kerriganinfested-png{ + clip-path: xywh(0 56.11601513240858% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.179066834804537%); +} + +.btn-unit-zerg-larva-png{ + clip-path: xywh(0 56.242118537200504% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.305170239596471%); +} + +.btn-unit-zerg-leviathan-png{ + clip-path: xywh(0 56.36822194199243% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.431273644388398%); +} + +.btn-unit-zerg-lurker-png{ + clip-path: xywh(0 56.494325346784365% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.5573770491803245%); +} + +.btn-unit-zerg-mutalisk-png{ + clip-path: xywh(0 56.62042875157629% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.683480453972258%); +} + +.btn-unit-zerg-nydusdragon-png{ + clip-path: xywh(0 56.746532156368225% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.809583858764185%); +} + +.btn-unit-zerg-overlordscbw-png{ + clip-path: xywh(0 56.87263556116015% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.935687263556119%); +} + +.btn-unit-zerg-overseer-png{ + clip-path: xywh(0 56.99873896595208% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.061790668348046%); +} + +.btn-unit-zerg-primalguardian-png{ + clip-path: xywh(0 57.12484237074401% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.187894073139972%); +} + +.btn-unit-zerg-ravager-png{ + clip-path: xywh(0 57.25094577553594% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.313997477931906%); +} + +.btn-unit-zerg-roach-corpser-png{ + clip-path: xywh(0 57.377049180327866% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.440100882723833%); +} + +.btn-unit-zerg-roach-vile-png{ + clip-path: xywh(0 57.5031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.56620428751576%); +} + +.btn-unit-zerg-roach-png{ + clip-path: xywh(0 57.62925598991173% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.692307692307693%); +} + +.btn-unit-zerg-roach_collection-png{ + clip-path: xywh(0 57.75535939470366% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.81841109709962%); +} + +.btn-unit-zerg-scourge-png{ + clip-path: xywh(0 57.88146279949559% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.944514501891554%); +} + +.btn-unit-zerg-swarmhost-carrion-png{ + clip-path: xywh(0 58.007566204287514% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.07061790668348%); +} + +.btn-unit-zerg-swarmhost-creeper-png{ + clip-path: xywh(0 58.13366960907945% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.196721311475407%); +} + +.btn-unit-zerg-swarmhost-png{ + clip-path: xywh(0 58.259773013871374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.322824716267341%); +} + +.btn-unit-zerg-ultralisk-noxious-png{ + clip-path: xywh(0 58.3858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.448928121059268%); +} + +.btn-unit-zerg-ultralisk-rcz-png{ + clip-path: xywh(0 58.511979823455235% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.575031525851195%); +} + +.btn-unit-zerg-ultralisk-remastered-png{ + clip-path: xywh(0 58.63808322824716% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.701134930643128%); +} + +.btn-unit-zerg-ultralisk-torrasque-png{ + clip-path: xywh(0 58.764186633039095% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.827238335435055%); +} + +.btn-unit-zerg-ultralisk-png{ + clip-path: xywh(0 58.89029003783102% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.953341740226989%); +} + +.btn-unit-zerg-viper-png{ + clip-path: xywh(0 59.01639344262295% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.079445145018916%); +} + +.btn-unit-zerg-zergling-raptor-png{ + clip-path: xywh(0 59.14249684741488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.205548549810842%); +} + +.btn-unit-zerg-zergling-scr-png{ + clip-path: xywh(0 59.26860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.331651954602776%); +} + +.btn-unit-zerg-zergling-swarmling-png{ + clip-path: xywh(0 59.394703656998736% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.457755359394703%); +} + +.btn-unit-zerg-zergling-png{ + clip-path: xywh(0 59.52080706179067% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.58385876418663%); +} + +.btn-unshackled-psionic-storm-png{ + clip-path: xywh(0 59.6469104665826% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.709962168978564%); +} + +.btn-upgrade-afaidofthedark-png{ + clip-path: xywh(0 59.77301387137453% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.83606557377049%); +} + +.btn-upgrade-artanis-healingpsionicstorm-png{ + clip-path: xywh(0 59.89911727616646% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.962168978562424%); +} + +.btn-upgrade-artanis-scarabsplashradius-png{ + clip-path: xywh(0 60.025220680958384% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.08827238335435%); +} + +.btn-upgrade-artanis-singularitycharge-png{ + clip-path: xywh(0 60.15132408575032% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.214375788146278%); +} + +.btn-upgrade-custom-triple-scourge-png{ + clip-path: xywh(0 60.277427490542244% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.340479192938211%); +} + +.btn-upgrade-increasedupgraderesearchspeed-png{ + clip-path: xywh(0 60.40353089533417% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.466582597730138%); +} + +.btn-upgrade-karax-energyregen200-png{ + clip-path: xywh(0 60.529634300126105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.592686002522065%); +} + +.btn-upgrade-karax-pylonwarpininstantly-png{ + clip-path: xywh(0 60.65573770491803% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.718789407313999%); +} + +.btn-upgrade-karax-turretattackspeed-png{ + clip-path: xywh(0 60.781841109709966% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.844892812105925%); +} + +.btn-upgrade-karax-turretrange-png{ + clip-path: xywh(0 60.90794451450189% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.97099621689786%); +} + +.btn-upgrade-kerrigan-assimilationaura-png{ + clip-path: xywh(0 61.03404791929382% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.097099621689786%); +} + +.btn-upgrade-kerrigan-broodlordspeed-png{ + clip-path: xywh(0 61.16015132408575% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.223203026481713%); +} + +.btn-upgrade-kerrigan-crushinggripwave-png{ + clip-path: xywh(0 61.28625472887768% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.349306431273646%); +} + +.btn-upgrade-kerrigan-seismicspines-png{ + clip-path: xywh(0 61.412358133669606% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.475409836065573%); +} + +.btn-upgrade-mengsk-engineeringbay-dominionarmorlevel2-png{ + clip-path: xywh(0 61.53846153846154% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.6015132408575%); +} + +.btn-upgrade-mengsk-engineeringbay-dominionweaponslevel0-png{ + clip-path: xywh(0 61.66456494325347% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.727616645649434%); +} + +.btn-upgrade-mengsk-engineeringbay-neosteelfortifiedarmor-png{ + clip-path: xywh(0 61.7906683480454% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.85372005044136%); +} + +.btn-upgrade-mengsk-engineeringbay-orbitaldrop-png{ + clip-path: xywh(0 61.91677175283733% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.979823455233294%); +} + +.btn-upgrade-mengsk-ghostacademy-guidedtacticalstrike-png{ + clip-path: xywh(0 62.042875157629254% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.105926860025221%); +} + +.btn-upgrade-mengsk-trooper-flamethrower-png{ + clip-path: xywh(0 62.16897856242119% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.232030264817148%); +} + +.btn-upgrade-mengsk-trooper-missilelauncher-png{ + clip-path: xywh(0 62.295081967213115% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.358133669609082%); +} + +.btn-upgrade-mengsk-trooper-plasmarifle-png{ + clip-path: xywh(0 62.42118537200504% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.484237074401008%); +} + +.btn-upgrade-nova-blink-png{ + clip-path: xywh(0 62.547288776796975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.610340479192935%); +} + +.btn-upgrade-nova-btn-upgrade-nova-flashgrenade-png{ + clip-path: xywh(0 62.6733921815889% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.736443883984869%); +} + +.btn-upgrade-nova-btn-upgrade-nova-pulsegrenade-png{ + clip-path: xywh(0 62.799495586380836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.862547288776796%); +} + +.btn-upgrade-nova-equipment-apolloinfantrysuit-png{ + clip-path: xywh(0 62.92559899117276% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.98865069356873%); +} + +.btn-upgrade-nova-equipment-blinksuit-png{ + clip-path: xywh(0 63.05170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.114754098360656%); +} + +.btn-upgrade-nova-equipment-canisterrifle-png{ + clip-path: xywh(0 63.17780580075662% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.240857503152583%); +} + +.btn-upgrade-nova-equipment-ghostvisor-png{ + clip-path: xywh(0 63.30390920554855% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.366960907944517%); +} + +.btn-upgrade-nova-equipment-gunblade_sword-png{ + clip-path: xywh(0 63.430012610340476% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.493064312736443%); +} + +.btn-upgrade-nova-equipment-monomolecularblade-png{ + clip-path: xywh(0 63.55611601513241% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.61916771752837%); +} + +.btn-upgrade-nova-equipment-plasmagun-png{ + clip-path: xywh(0 63.68221941992434% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.745271122320304%); +} + +.btn-upgrade-nova-equipment-rangefinderoculus-png{ + clip-path: xywh(0 63.80832282471627% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.87137452711223%); +} + +.btn-upgrade-nova-equipment-shotgun-png{ + clip-path: xywh(0 63.9344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.997477931904164%); +} + +.btn-upgrade-nova-equipment-stealthsuit-png{ + clip-path: xywh(0 64.06052963430012% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.123581336696091%); +} + +.btn-upgrade-nova-holographicdecoy-png{ + clip-path: xywh(0 64.18663303909206% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.249684741488025%); +} + +.btn-upgrade-nova-jetpack-png{ + clip-path: xywh(0 64.31273644388399% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.375788146279945%); +} + +.btn-upgrade-nova-tacticalstealthsuit-png{ + clip-path: xywh(0 64.43883984867591% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.501891551071878%); +} + +.btn-upgrade-protoss-adeptshieldupgrade-png{ + clip-path: xywh(0 64.56494325346785% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.627994955863812%); +} + +.btn-upgrade-protoss-airarmorlevel1-png{ + clip-path: xywh(0 64.69104665825978% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.754098360655732%); +} + +.btn-upgrade-protoss-airarmorlevel2-png{ + clip-path: xywh(0 64.8171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.880201765447666%); +} + +.btn-upgrade-protoss-airarmorlevel3-png{ + clip-path: xywh(0 64.94325346784363% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.0063051702396%); +} + +.btn-upgrade-protoss-airarmorlevel4-png{ + clip-path: xywh(0 65.06935687263557% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.13240857503152%); +} + +.btn-upgrade-protoss-airarmorlevel5-png{ + clip-path: xywh(0 65.19546027742749% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.258511979823453%); +} + +.btn-upgrade-protoss-airweaponslevel1-png{ + clip-path: xywh(0 65.32156368221942% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.384615384615387%); +} + +.btn-upgrade-protoss-airweaponslevel2-png{ + clip-path: xywh(0 65.44766708701135% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.51071878940732%); +} + +.btn-upgrade-protoss-airweaponslevel3-png{ + clip-path: xywh(0 65.57377049180327% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.63682219419924%); +} + +.btn-upgrade-protoss-airweaponslevel4-png{ + clip-path: xywh(0 65.69987389659521% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.762925598991174%); +} + +.btn-upgrade-protoss-airweaponslevel5-png{ + clip-path: xywh(0 65.82597730138714% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.889029003783108%); +} + +.btn-upgrade-protoss-alarak-ascendantspsiorbtravelsfurther-png{ + clip-path: xywh(0 65.95208070617906% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.015132408575028%); +} + +.btn-upgrade-protoss-alarak-ascendantspermanentlybetter-png{ + clip-path: xywh(0 66.078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.14123581336696%); +} + +.btn-upgrade-protoss-alarak-graviticdrive-png{ + clip-path: xywh(0 66.20428751576293% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.267339218158895%); +} + +.btn-upgrade-protoss-alarak-havoctargetlockbuffed-png{ + clip-path: xywh(0 66.33039092055486% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.393442622950815%); +} + +.btn-upgrade-protoss-alarak-melleeweapon-png{ + clip-path: xywh(0 66.45649432534678% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.51954602774275%); +} + +.btn-upgrade-protoss-alarak-permanentcloak-png{ + clip-path: xywh(0 66.58259773013872% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.645649432534682%); +} + +.btn-upgrade-protoss-alarak-rangeincrease-png{ + clip-path: xywh(0 66.70870113493065% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.771752837326602%); +} + +.btn-upgrade-protoss-alarak-rangeweapon-png{ + clip-path: xywh(0 66.83480453972257% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.897856242118536%); +} + +.btn-upgrade-protoss-alarak-supplicantarmor-png{ + clip-path: xywh(0 66.9609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.02395964691047%); +} + +.btn-upgrade-protoss-alarak-supplicantextrashields-png{ + clip-path: xywh(0 67.08701134930644% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.15006305170239%); +} + +.btn-upgrade-protoss-fenix-adept-recochetglaiveupgraded-png{ + clip-path: xywh(0 67.21311475409836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.276166456494323%); +} + +.btn-upgrade-protoss-fenix-adeptchampionbounceattack-png{ + clip-path: xywh(0 67.33921815889029% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.402269861286257%); +} + +.btn-upgrade-protoss-fenix-carrier-solarbeam-png{ + clip-path: xywh(0 67.46532156368222% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.52837326607819%); +} + +.btn-upgrade-protoss-fenix-disruptorpermanentcloak-png{ + clip-path: xywh(0 67.59142496847414% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.65447667087011%); +} + +.btn-upgrade-protoss-fenix-dragoonsolariteflare-png{ + clip-path: xywh(0 67.71752837326608% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.780580075662044%); +} + +.btn-upgrade-protoss-fenix-scoutchampionrange-png{ + clip-path: xywh(0 67.84363177805801% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.906683480453978%); +} + +.btn-upgrade-protoss-fenix-stasisfield-png{ + clip-path: xywh(0 67.96973518284993% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.032786885245898%); +} + +.btn-upgrade-protoss-fenix-zealotsuit-armorplate-png{ + clip-path: xywh(0 68.09583858764186% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.15889029003783%); +} + +.btn-upgrade-protoss-fluxvanes-png{ + clip-path: xywh(0 68.2219419924338% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.284993694829765%); +} + +.btn-upgrade-protoss-graviticbooster-png{ + clip-path: xywh(0 68.34804539722572% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.411097099621685%); +} + +.btn-upgrade-protoss-graviticdrive-png{ + clip-path: xywh(0 68.47414880201765% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.53720050441362%); +} + +.btn-upgrade-protoss-gravitoncatapult-png{ + clip-path: xywh(0 68.60025220680959% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.663303909205553%); +} + +.btn-upgrade-protoss-groundarmorlevel1-png{ + clip-path: xywh(0 68.72635561160152% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.789407313997472%); +} + +.btn-upgrade-protoss-groundarmorlevel2-png{ + clip-path: xywh(0 68.85245901639344% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.915510718789406%); +} + +.btn-upgrade-protoss-groundarmorlevel3-png{ + clip-path: xywh(0 68.97856242118537% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.04161412358134%); +} + +.btn-upgrade-protoss-groundarmorlevel4-png{ + clip-path: xywh(0 69.1046658259773% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.16771752837326%); +} + +.btn-upgrade-protoss-groundarmorlevel5-png{ + clip-path: xywh(0 69.23076923076923% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.293820933165193%); +} + +.btn-upgrade-protoss-groundweaponslevel1-png{ + clip-path: xywh(0 69.35687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.419924337957127%); +} + +.btn-upgrade-protoss-groundweaponslevel2-png{ + clip-path: xywh(0 69.4829760403531% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.54602774274906%); +} + +.btn-upgrade-protoss-groundweaponslevel3-png{ + clip-path: xywh(0 69.60907944514501% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.67213114754098%); +} + +.btn-upgrade-protoss-groundweaponslevel4-png{ + clip-path: xywh(0 69.73518284993695% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.798234552332914%); +} + +.btn-upgrade-protoss-groundweaponslevel5-png{ + clip-path: xywh(0 69.86128625472888% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.92433795712485%); +} + +.btn-upgrade-protoss-increasedscarabcapacityscbw-png{ + clip-path: xywh(0 69.9873896595208% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.050441361916768%); +} + +.btn-upgrade-protoss-khaydarinamulet-png{ + clip-path: xywh(0 70.11349306431273% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.1765447667087%); +} + +.btn-upgrade-protoss-phoenixrange-png{ + clip-path: xywh(0 70.23959646910467% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.302648171500635%); +} + +.btn-upgrade-protoss-researchbosoniccore-png{ + clip-path: xywh(0 70.36569987389659% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.428751576292555%); +} + +.btn-upgrade-protoss-researchgravitysling-png{ + clip-path: xywh(0 70.49180327868852% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.55485498108449%); +} + +.btn-upgrade-protoss-resonatingglaives-png{ + clip-path: xywh(0 70.61790668348046% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.680958385876423%); +} + +.btn-upgrade-protoss-shieldslevel1-png{ + clip-path: xywh(0 70.74401008827239% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.807061790668342%); +} + +.btn-upgrade-protoss-shieldslevel2-png{ + clip-path: xywh(0 70.87011349306431% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.933165195460276%); +} + +.btn-upgrade-protoss-shieldslevel3-png{ + clip-path: xywh(0 70.99621689785624% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.05926860025221%); +} + +.btn-upgrade-protoss-shieldslevel4-png{ + clip-path: xywh(0 71.12232030264818% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.18537200504413%); +} + +.btn-upgrade-protoss-shieldslevel5-png{ + clip-path: xywh(0 71.2484237074401% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.311475409836063%); +} + +.btn-upgrade-protoss-stalkerpurifier-reconstruction-png{ + clip-path: xywh(0 71.37452711223203% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.437578814627997%); +} + +.btn-upgrade-protoss-tectonicdisruptors-png{ + clip-path: xywh(0 71.50063051702396% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.56368221941993%); +} + +.btn-upgrade-protoss-vanguard-aoeradiusincreased-png{ + clip-path: xywh(0 71.62673392181588% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.68978562421185%); +} + +.btn-upgrade-protoss-vanguard-increasedarmordamage-png{ + clip-path: xywh(0 71.75283732660782% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.815889029003785%); +} + +.btn-upgrade-protoss-wrathwalker-cantargetairunits-png{ + clip-path: xywh(0 71.87894073139975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.94199243379572%); +} + +.btn-upgrade-protoss-wrathwalker-chargetimeimproved-png{ + clip-path: xywh(0 72.00504413619167% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.068095838587638%); +} + +.btn-upgrade-psi-indoctrinator-png{ + clip-path: xywh(0 72.1311475409836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.194199243379572%); +} + +.btn-upgrade-raynor-cerberusmines-png{ + clip-path: xywh(0 72.25725094577554% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.320302648171506%); +} + +.btn-upgrade-raynor-improvedsiegemode-png{ + clip-path: xywh(0 72.38335435056746% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.446406052963425%); +} + +.btn-upgrade-raynor-incineratorgauntlets-png{ + clip-path: xywh(0 72.50945775535939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.57250945775536%); +} + +.btn-upgrade-raynor-juggernautplating-png{ + clip-path: xywh(0 72.63556116015133% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.698612862547293%); +} + +.btn-upgrade-raynor-maelstromrounds-png{ + clip-path: xywh(0 72.76166456494326% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.824716267339213%); +} + +.btn-upgrade-raynor-phobosclassweaponssystem-png{ + clip-path: xywh(0 72.88776796973518% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.950819672131146%); +} + +.btn-upgrade-raynor-replenishablemagazine-png{ + clip-path: xywh(0 73.01387137452711% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.07692307692308%); +} + +.btn-upgrade-raynor-ripwavemissiles-png{ + clip-path: xywh(0 73.13997477931905% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.203026481715%); +} + +.btn-upgrade-raynor-shockwavemissilebattery-png{ + clip-path: xywh(0 73.26607818411097% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.329129886506934%); +} + +.btn-upgrade-raynor-stabilizermedpacks-png{ + clip-path: xywh(0 73.3921815889029% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.455233291298867%); +} + +.btn-upgrade-reducedupgraderesearchcost-png{ + clip-path: xywh(0 73.51828499369483% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.5813366960908%); +} + +.btn-upgrade-siegetank-spidermines-png{ + clip-path: xywh(0 73.64438839848675% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.70744010088272%); +} + +.btn-upgrade-stetmann-banelingmanashieldefficiency-png{ + clip-path: xywh(0 73.77049180327869% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.833543505674655%); +} + +.btn-upgrade-stetmann-mechachitinousplating-png{ + clip-path: xywh(0 73.89659520807062% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.95964691046659%); +} + +.btn-upgrade-stetmann-zerglinghardenedshield-png{ + clip-path: xywh(0 74.02269861286254% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.085750315258508%); +} + +.btn-upgrade-swann-aresclasstargetingsystem-png{ + clip-path: xywh(0 74.14880201765448% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.211853720050442%); +} + +.btn-upgrade-swann-defensivematrix-png{ + clip-path: xywh(0 74.27490542244641% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.337957124842376%); +} + +.btn-upgrade-swann-displacementfield-png{ + clip-path: xywh(0 74.40100882723833% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.464060529634295%); +} + +.btn-upgrade-swann-firesuppressionsystem-png{ + clip-path: xywh(0 74.52711223203026% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.59016393442623%); +} + +.btn-upgrade-swann-hellarmor-png{ + clip-path: xywh(0 74.6532156368222% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.716267339218163%); +} + +.btn-upgrade-swann-improvedburstlaser-png{ + clip-path: xywh(0 74.77931904161413% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.842370744010083%); +} + +.btn-upgrade-swann-improvednanorepair-png{ + clip-path: xywh(0 74.90542244640605% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.968474148802017%); +} + +.btn-upgrade-swann-improvedturretattackspeed-png{ + clip-path: xywh(0 75.03152585119798% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.09457755359395%); +} + +.btn-upgrade-swann-multilockweaponsystem-png{ + clip-path: xywh(0 75.15762925598992% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.22068095838587%); +} + +.btn-upgrade-swann-scvdoublerepair-png{ + clip-path: xywh(0 75.28373266078184% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.346784363177804%); +} + +.btn-upgrade-swann-targetingoptics-png{ + clip-path: xywh(0 75.40983606557377% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.472887767969738%); +} + +.btn-upgrade-swann-vehiclerangeincrease-png{ + clip-path: xywh(0 75.5359394703657% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.59899117276167%); +} + +.btn-upgrade-terran-advanceballistics-png{ + clip-path: xywh(0 75.66204287515762% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.72509457755359%); +} + +.btn-upgrade-terran-behemothreactor-png{ + clip-path: xywh(0 75.78814627994956% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.851197982345525%); +} + +.btn-upgrade-terran-buildingarmor-png{ + clip-path: xywh(0 75.91424968474149% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.97730138713746%); +} + +.btn-upgrade-terran-cyclonerangeupgrade-png{ + clip-path: xywh(0 76.04035308953341% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.10340479192938%); +} + +.btn-upgrade-terran-durablematerials-png{ + clip-path: xywh(0 76.16645649432535% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.229508196721312%); +} + +.btn-upgrade-terran-highcapacityfueltanks-png{ + clip-path: xywh(0 76.29255989911728% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.355611601513246%); +} + +.btn-upgrade-terran-hisecautotracking-png{ + clip-path: xywh(0 76.4186633039092% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.481715006305166%); +} + +.btn-upgrade-terran-hyperflightrotors-png{ + clip-path: xywh(0 76.54476670870113% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.6078184110971%); +} + +.btn-upgrade-terran-infantryarmorlevel1-png{ + clip-path: xywh(0 76.67087011349307% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.733921815889033%); +} + +.btn-upgrade-terran-infantryarmorlevel2-png{ + clip-path: xywh(0 76.796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.860025220680953%); +} + +.btn-upgrade-terran-infantryarmorlevel3-png{ + clip-path: xywh(0 76.92307692307692% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.986128625472887%); +} + +.btn-upgrade-terran-infantryarmorlevel4-png{ + clip-path: xywh(0 77.04918032786885% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.11223203026482%); +} + +.btn-upgrade-terran-infantryarmorlevel5-png{ + clip-path: xywh(0 77.17528373266079% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.23833543505674%); +} + +.btn-upgrade-terran-infantryweaponslevel1-png{ + clip-path: xywh(0 77.3013871374527% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.364438839848674%); +} + +.btn-upgrade-terran-infantryweaponslevel2-png{ + clip-path: xywh(0 77.42749054224464% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.490542244640608%); +} + +.btn-upgrade-terran-infantryweaponslevel3-png{ + clip-path: xywh(0 77.55359394703657% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.61664564943254%); +} + +.btn-upgrade-terran-infantryweaponslevel4-png{ + clip-path: xywh(0 77.6796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.74274905422446%); +} + +.btn-upgrade-terran-infantryweaponslevel5-png{ + clip-path: xywh(0 77.80580075662043% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.868852459016395%); +} + +.btn-upgrade-terran-infernalpreigniter-png{ + clip-path: xywh(0 77.93190416141236% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.99495586380833%); +} + +.btn-upgrade-terran-interferencematrix-png{ + clip-path: xywh(0 78.05800756620428% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.12105926860025%); +} + +.btn-upgrade-terran-internalizedtechmodule-png{ + clip-path: xywh(0 78.18411097099622% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.247162673392182%); +} + +.btn-upgrade-terran-jumpjets-png{ + clip-path: xywh(0 78.31021437578815% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.373266078184116%); +} + +.btn-upgrade-terran-kd8chargeex3-png{ + clip-path: xywh(0 78.43631778058007% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.499369482976036%); +} + +.btn-upgrade-terran-lazertargetingsystem-png{ + clip-path: xywh(0 78.562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.62547288776797%); +} + +.btn-upgrade-terran-magfieldaccelerator-png{ + clip-path: xywh(0 78.68852459016394% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.751576292559903%); +} + +.btn-upgrade-terran-magrailmunitions-png{ + clip-path: xywh(0 78.81462799495587% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.877679697351823%); +} + +.btn-upgrade-terran-medivacemergencythrusters-png{ + clip-path: xywh(0 78.94073139974779% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.003783102143757%); +} + +.btn-upgrade-terran-neosteelframe-png{ + clip-path: xywh(0 79.06683480453972% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.12988650693569%); +} + +.btn-upgrade-terran-nova-bansheemissilestrik-png{ + clip-path: xywh(0 79.19293820933166% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.25598991172761%); +} + +.btn-upgrade-terran-nova-hellfiremissiles-png{ + clip-path: xywh(0 79.31904161412358% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.382093316519544%); +} + +.btn-upgrade-terran-nova-personaldefensivematrix-png{ + clip-path: xywh(0 79.44514501891551% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.508196721311478%); +} + +.btn-upgrade-terran-nova-siegetankrange-png{ + clip-path: xywh(0 79.57124842370744% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.634300126103412%); +} + +.btn-upgrade-terran-nova-specialordance-png{ + clip-path: xywh(0 79.69735182849936% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.76040353089533%); +} + +.btn-upgrade-terran-nova-terrandefendermodestructureattack-png{ + clip-path: xywh(0 79.8234552332913% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.886506935687265%); +} + +.btn-upgrade-terran-optimizedlogistics-png{ + clip-path: xywh(0 79.94955863808323% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.0126103404792%); +} + +.btn-upgrade-terran-reapercombatdrugs-png{ + clip-path: xywh(0 80.07566204287515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.13871374527112%); +} + +.btn-upgrade-terran-replenishablemagazinelvl2-png{ + clip-path: xywh(0 80.20176544766709% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.264817150063053%); +} + +.btn-upgrade-terran-researchdrillingclaws-png{ + clip-path: xywh(0 80.32786885245902% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.390920554854986%); +} + +.btn-upgrade-terran-shipplatinglevel1-png{ + clip-path: xywh(0 80.45397225725094% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.517023959646906%); +} + +.btn-upgrade-terran-shipplatinglevel2-png{ + clip-path: xywh(0 80.58007566204287% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.64312736443884%); +} + +.btn-upgrade-terran-shipplatinglevel3-png{ + clip-path: xywh(0 80.7061790668348% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.769230769230774%); +} + +.btn-upgrade-terran-shipplatinglevel4-png{ + clip-path: xywh(0 80.83228247162674% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.895334174022693%); +} + +.btn-upgrade-terran-shipplatinglevel5-png{ + clip-path: xywh(0 80.95838587641866% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.021437578814627%); +} + +.btn-upgrade-terran-shipweaponslevel1-png{ + clip-path: xywh(0 81.0844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.14754098360656%); +} + +.btn-upgrade-terran-shipweaponslevel2-png{ + clip-path: xywh(0 81.21059268600253% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.27364438839848%); +} + +.btn-upgrade-terran-shipweaponslevel3-png{ + clip-path: xywh(0 81.33669609079445% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.399747793190414%); +} + +.btn-upgrade-terran-shipweaponslevel4-png{ + clip-path: xywh(0 81.46279949558638% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.525851197982348%); +} + +.btn-upgrade-terran-shipweaponslevel5-png{ + clip-path: xywh(0 81.58890290037832% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.651954602774282%); +} + +.btn-upgrade-terran-superstimppack-png{ + clip-path: xywh(0 81.71500630517023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.7780580075662%); +} + +.btn-upgrade-terran-transformationservos-png{ + clip-path: xywh(0 81.84110970996217% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.904161412358135%); +} + +.btn-upgrade-terran-trilithium-power-cell-png{ + clip-path: xywh(0 81.9672131147541% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.03026481715007%); +} + +.btn-upgrade-terran-tungsten-spikes-png{ + clip-path: xywh(0 82.09331651954602% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.15636822194199%); +} + +.btn-upgrade-terran-twin-linkedflamethrower-color-png{ + clip-path: xywh(0 82.21941992433796% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.28247162673392%); +} + +.btn-upgrade-terran-vehicleplatinglevel1-png{ + clip-path: xywh(0 82.34552332912989% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.40857503152586%); +} + +.btn-upgrade-terran-vehicleplatinglevel2-png{ + clip-path: xywh(0 82.47162673392181% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.534678436317776%); +} + +.btn-upgrade-terran-vehicleplatinglevel3-png{ + clip-path: xywh(0 82.59773013871374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.66078184110971%); +} + +.btn-upgrade-terran-vehicleplatinglevel4-png{ + clip-path: xywh(0 82.72383354350568% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.786885245901644%); +} + +.btn-upgrade-terran-vehicleplatinglevel5-png{ + clip-path: xywh(0 82.84993694829761% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.91298865069356%); +} + +.btn-upgrade-terran-vehicleweaponslevel1-png{ + clip-path: xywh(0 82.97604035308953% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.0390920554855%); +} + +.btn-upgrade-terran-vehicleweaponslevel2-png{ + clip-path: xywh(0 83.10214375788146% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.16519546027743%); +} + +.btn-upgrade-terran-vehicleweaponslevel3-png{ + clip-path: xywh(0 83.2282471626734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.29129886506935%); +} + +.btn-upgrade-terran-vehicleweaponslevel4-png{ + clip-path: xywh(0 83.35435056746532% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.417402269861284%); +} + +.btn-upgrade-terran-vehicleweaponslevel5-png{ + clip-path: xywh(0 83.48045397225725% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.54350567465322%); +} + +.btn-upgrade-vorazun-corsairpermanentlycloaked-png{ + clip-path: xywh(0 83.60655737704919% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.66960907944514%); +} + +.btn-upgrade-vorazun-oraclepermanentlycloaked-png{ + clip-path: xywh(0 83.7326607818411% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.79571248423707%); +} + +.btn-upgrade-zagara-aberrationarmorcover-png{ + clip-path: xywh(0 83.85876418663304% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.921815889029006%); +} + +.btn-upgrade-zagara-increasebilelauncherrange-png{ + clip-path: xywh(0 83.98486759142497% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.04791929382094%); +} + +.btn-upgrade-zagara-scourgesplashdamage-png{ + clip-path: xywh(0 84.11097099621689% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.17402269861286%); +} + +.btn-upgrade-zerg-abathur-abduct-png{ + clip-path: xywh(0 84.23707440100883% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.30012610340479%); +} + +.btn-upgrade-zerg-abathur-biomass-png{ + clip-path: xywh(0 84.36317780580076% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.42622950819673%); +} + +.btn-upgrade-zerg-abathur-biomechanicaltransfusion-png{ + clip-path: xywh(0 84.48928121059268% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.552332912988646%); +} + +.btn-upgrade-zerg-abathur-castrange-png{ + clip-path: xywh(0 84.61538461538461% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.67843631778058%); +} + +.btn-upgrade-zerg-abathur-devourer-corrosivespray-png{ + clip-path: xywh(0 84.74148802017655% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.804539722572514%); +} + +.btn-upgrade-zerg-abathur-improvedmend-png{ + clip-path: xywh(0 84.86759142496848% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.930643127364434%); +} + +.btn-upgrade-zerg-abathur-incubationchamber-png{ + clip-path: xywh(0 84.9936948297604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.05674653215637%); +} + +.btn-upgrade-zerg-abathur-prolongeddispersion-png{ + clip-path: xywh(0 85.11979823455233% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.1828499369483%); +} + +.btn-upgrade-zerg-adaptivecarapace-png{ + clip-path: xywh(0 85.24590163934427% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.30895334174022%); +} + +.btn-upgrade-zerg-adaptivetalons-png{ + clip-path: xywh(0 85.37200504413619% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.435056746532155%); +} + +.btn-upgrade-zerg-adrenaloverload-png{ + clip-path: xywh(0 85.49810844892812% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.56116015132409%); +} + +.btn-upgrade-zerg-airattacks-level1-png{ + clip-path: xywh(0 85.62421185372006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.68726355611601%); +} + +.btn-upgrade-zerg-airattacks-level2-png{ + clip-path: xywh(0 85.75031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.81336696090794%); +} + +.btn-upgrade-zerg-airattacks-level3-png{ + clip-path: xywh(0 85.87641866330391% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.939470365699876%); +} + +.btn-upgrade-zerg-airattacks-level4-png{ + clip-path: xywh(0 86.00252206809584% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.06557377049181%); +} + +.btn-upgrade-zerg-airattacks-level5-png{ + clip-path: xywh(0 86.12862547288776% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.19167717528373%); +} + +.btn-upgrade-zerg-anabolicsynthesis-png{ + clip-path: xywh(0 86.2547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.31778058007566%); +} + +.btn-upgrade-zerg-ancillaryarmor-png{ + clip-path: xywh(0 86.38083228247163% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.4438839848676%); +} + +.btn-upgrade-zerg-buildingarmor-png{ + clip-path: xywh(0 86.50693568726355% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.56998738965952%); +} + +.btn-upgrade-zerg-burrowcharge-png{ + clip-path: xywh(0 86.63303909205548% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.69609079445145%); +} + +.btn-upgrade-zerg-burrowmove-png{ + clip-path: xywh(0 86.75914249684742% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.822194199243384%); +} + +.btn-upgrade-zerg-celldivisionon-png{ + clip-path: xywh(0 86.88524590163935% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.948297604035304%); +} + +.btn-upgrade-zerg-centrifugalhooks-png{ + clip-path: xywh(0 87.01134930643127% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.07440100882724%); +} + +.btn-upgrade-zerg-chitinousplating-png{ + clip-path: xywh(0 87.1374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.20050441361917%); +} + +.btn-upgrade-zerg-concentrated-spew-png{ + clip-path: xywh(0 87.26355611601514% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.32660781841109%); +} + +.btn-upgrade-zerg-corrosiveacid-png{ + clip-path: xywh(0 87.38965952080706% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.452711223203025%); +} + +.btn-upgrade-zerg-dehaka-tenderize-png{ + clip-path: xywh(0 87.51576292559899% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.57881462799496%); +} + +.btn-upgrade-zerg-demolition-png{ + clip-path: xywh(0 87.64186633039093% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.70491803278688%); +} + +.btn-upgrade-zerg-enduringcorruption-png{ + clip-path: xywh(0 87.76796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.83102143757881%); +} + +.btn-upgrade-zerg-evolveincreasedlocustlifetime-png{ + clip-path: xywh(0 87.89407313997478% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.957124842370746%); +} + +.btn-upgrade-zerg-evolvemuscularaugments-png{ + clip-path: xywh(0 88.02017654476671% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.08322824716268%); +} + +.btn-upgrade-zerg-explosiveglaive-png{ + clip-path: xywh(0 88.14627994955863% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.2093316519546%); +} + +.btn-upgrade-zerg-flyercarapace-level1-png{ + clip-path: xywh(0 88.27238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.33543505674653%); +} + +.btn-upgrade-zerg-flyercarapace-level2-png{ + clip-path: xywh(0 88.3984867591425% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.46153846153847%); +} + +.btn-upgrade-zerg-flyercarapace-level3-png{ + clip-path: xywh(0 88.52459016393442% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.58764186633039%); +} + +.btn-upgrade-zerg-flyercarapace-level4-png{ + clip-path: xywh(0 88.65069356872635% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.71374527112232%); +} + +.btn-upgrade-zerg-flyercarapace-level5-png{ + clip-path: xywh(0 88.77679697351829% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.839848675914254%); +} + +.btn-upgrade-zerg-frenzy-png{ + clip-path: xywh(0 88.90290037831022% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.965952080706174%); +} + +.btn-upgrade-zerg-glialreconstitution-png{ + clip-path: xywh(0 89.02900378310214% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.09205548549811%); +} + +.btn-upgrade-zerg-groovedspines-png{ + clip-path: xywh(0 89.15510718789407% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.21815889029004%); +} + +.btn-upgrade-zerg-groundcarapace-level1-png{ + clip-path: xywh(0 89.28121059268601% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.34426229508196%); +} + +.btn-upgrade-zerg-groundcarapace-level2-png{ + clip-path: xywh(0 89.40731399747793% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.470365699873895%); +} + +.btn-upgrade-zerg-groundcarapace-level3-png{ + clip-path: xywh(0 89.53341740226986% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.59646910466583%); +} + +.btn-upgrade-zerg-groundcarapace-level4-png{ + clip-path: xywh(0 89.6595208070618% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.72257250945775%); +} + +.btn-upgrade-zerg-groundcarapace-level5-png{ + clip-path: xywh(0 89.78562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.84867591424968%); +} + +.btn-upgrade-zerg-hardenedcarapace-png{ + clip-path: xywh(0 89.91172761664565% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.974779319041616%); +} + +.btn-upgrade-zerg-hotsgroovedspines-png{ + clip-path: xywh(0 90.03783102143758% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.10088272383355%); +} + +.btn-upgrade-zerg-hotsmetabolicboost-png{ + clip-path: xywh(0 90.1639344262295% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.22698612862547%); +} + +.btn-upgrade-zerg-hotstunnelingclaws-png{ + clip-path: xywh(0 90.29003783102144% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.3530895334174%); +} + +.btn-upgrade-zerg-hydriaticacid-png{ + clip-path: xywh(0 90.41614123581337% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.47919293820934%); +} + +.btn-upgrade-zerg-meleeattacks-level1-png{ + clip-path: xywh(0 90.54224464060529% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.60529634300126%); +} + +.btn-upgrade-zerg-meleeattacks-level2-png{ + clip-path: xywh(0 90.66834804539722% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.73139974779319%); +} + +.btn-upgrade-zerg-meleeattacks-level3-png{ + clip-path: xywh(0 90.79445145018916% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.857503152585124%); +} + +.btn-upgrade-zerg-meleeattacks-level4-png{ + clip-path: xywh(0 90.92055485498109% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.983606557377044%); +} + +.btn-upgrade-zerg-meleeattacks-level5-png{ + clip-path: xywh(0 91.04665825977301% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.10970996216898%); +} + +.btn-upgrade-zerg-missileattacks-level1-png{ + clip-path: xywh(0 91.17276166456494% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.23581336696091%); +} + +.btn-upgrade-zerg-missileattacks-level2-png{ + clip-path: xywh(0 91.29886506935688% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.36191677175283%); +} + +.btn-upgrade-zerg-missileattacks-level3-png{ + clip-path: xywh(0 91.4249684741488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.488020176544765%); +} + +.btn-upgrade-zerg-missileattacks-level4-png{ + clip-path: xywh(0 91.55107187894073% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.6141235813367%); +} + +.btn-upgrade-zerg-missileattacks-level5-png{ + clip-path: xywh(0 91.67717528373267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.74022698612862%); +} + +.btn-upgrade-zerg-monarchblades-png{ + clip-path: xywh(0 91.80327868852459% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.86633039092055%); +} + +.btn-upgrade-zerg-organiccarapace-png{ + clip-path: xywh(0 91.92938209331652% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.992433795712486%); +} + +.btn-upgrade-zerg-pneumatizedcarapace-png{ + clip-path: xywh(0 92.05548549810845% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.11853720050442%); +} + +.btn-upgrade-zerg-pressurizedglands-png{ + clip-path: xywh(0 92.18158890290037% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.24464060529634%); +} + +.btn-upgrade-zerg-rapidincubation-png{ + clip-path: xywh(0 92.3076923076923% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.37074401008827%); +} + +.btn-upgrade-zerg-rapidregeneration-png{ + clip-path: xywh(0 92.43379571248424% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.49684741488021%); +} + +.btn-upgrade-zerg-regenerativebile-png{ + clip-path: xywh(0 92.55989911727616% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.62295081967213%); +} + +.btn-upgrade-zerg-rupture-png{ + clip-path: xywh(0 92.6860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.74905422446406%); +} + +.btn-upgrade-zerg-stukov-bansheeburrowregeneration-png{ + clip-path: xywh(0 92.81210592686003% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.875157629255995%); +} + +.btn-upgrade-zerg-stukov-bansheemorelife-png{ + clip-path: xywh(0 92.93820933165196% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.001261034047914%); +} + +.btn-upgrade-zerg-stukov-bunkerformliferegenupgraded-png{ + clip-path: xywh(0 93.06431273644388% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.12736443883985%); +} + +.btn-upgrade-zerg-stukov-bunkerresearchbundle_05-png{ + clip-path: xywh(0 93.19041614123581% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.25346784363178%); +} + +.btn-upgrade-zerg-stukov-bunkerupgradeii_14-png{ + clip-path: xywh(0 93.31651954602775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.3795712484237%); +} + +.btn-upgrade-zerg-stukov-diamondbacksnailtrail-png{ + clip-path: xywh(0 93.44262295081967% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.505674653215635%); +} + +.btn-upgrade-zerg-stukov-infestedbunkermorelife-png{ + clip-path: xywh(0 93.5687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.63177805800757%); +} + +.btn-upgrade-zerg-stukov-infestedliberatoraoe-png{ + clip-path: xywh(0 93.69482976040354% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.75788146279949%); +} + +.btn-upgrade-zerg-stukov-infestedliberatorswarmcloud-png{ + clip-path: xywh(0 93.82093316519546% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.88398486759142%); +} + +.btn-upgrade-zerg-stukov-infestedmarinerangeupgrade-png{ + clip-path: xywh(0 93.94703656998739% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.010088272383356%); +} + +.btn-upgrade-zerg-stukov-infestedspawnbroodling-png{ + clip-path: xywh(0 94.07313997477932% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.13619167717529%); +} + +.btn-upgrade-zerg-stukov-queenenergyregen-png{ + clip-path: xywh(0 94.19924337957124% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.26229508196721%); +} + +.btn-upgrade-zerg-stukov-researchqueenfungalgrowth-png{ + clip-path: xywh(0 94.32534678436318% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.388398486759144%); +} + +.btn-upgrade-zerg-stukov-siegetankammoregen-png{ + clip-path: xywh(0 94.45145018915511% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.51450189155108%); +} + +.btn-upgrade-zerg-stukov-siegetankbonusdamage-png{ + clip-path: xywh(0 94.57755359394703% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.640605296343%); +} + +.btn-upgrade-zerg-swarmfrenzy-png{ + clip-path: xywh(0 94.70365699873896% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.76670870113493%); +} + +.btn-upgrade-zerg-tissueassimilation-png{ + clip-path: xywh(0 94.8297604035309% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.892812105926865%); +} + +.btn-upgrade-zerg-tunnelingjaws-png{ + clip-path: xywh(0 94.95586380832283% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.018915510718784%); +} + +.btn-upgrade-zerg-ventralsacs-png{ + clip-path: xywh(0 95.08196721311475% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.14501891551072%); +} + +.btn-upgrade-zerg-viciousglaive-png{ + clip-path: xywh(0 95.20807061790669% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.27112232030265%); +} + +.btn-upgrade-zergling-armorshredding-png{ + clip-path: xywh(0 95.33417402269862% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.39722572509457%); +} + +.btn-veil-of-the-judicator-png{ + clip-path: xywh(0 95.46027742749054% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.523329129886505%); +} + +.btn-warp-refraction-png{ + clip-path: xywh(0 95.58638083228247% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.64943253467844%); +} + +.evolution_coop-png{ + clip-path: xywh(0 95.7124842370744% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.77553593947036%); +} + +.icon-bargain-bin-prices-png{ + clip-path: xywh(0 95.83858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.90163934426229%); +} + +.icon-gas-terran-nobg-png{ + clip-path: xywh(0 95.96469104665826% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.02774274905423%); +} + +.icon-health-nobg-png{ + clip-path: xywh(0 96.0907944514502% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.15384615384616%); +} + +.icon-mineral-nobg-png{ + clip-path: xywh(0 96.21689785624211% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.27994955863808%); +} + +.icon-shields-png{ + clip-path: xywh(0 96.34300126103405% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.406052963430014%); +} + +.icon-supply-protoss_nobg-png{ + clip-path: xywh(0 96.46910466582598% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.53215636822195%); +} + +.icon-supply-terran_nobg-png{ + clip-path: xywh(0 96.5952080706179% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.65825977301387%); +} + +.icon-supply-zerg_nobg-png{ + clip-path: xywh(0 96.72131147540983% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.7843631778058%); +} + +.icon-time-protoss-png{ + clip-path: xywh(0 96.84741488020177% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.910466582597735%); +} + +.potentbile_coop-png{ + clip-path: xywh(0 96.9735182849937% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.036569987389655%); +} + +.predatorcharge-png{ + clip-path: xywh(0 97.09962168978562% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.16267339218159%); +} + +.predatorvespene-png{ + clip-path: xywh(0 97.22572509457756% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.28877679697352%); +} + +.talent-artanis-level03-warpgatecharges-png{ + clip-path: xywh(0 97.35182849936949% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.41488020176544%); +} + +.talent-artanis-level14-startingmaxsupply-png{ + clip-path: xywh(0 97.47793190416141% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.540983606557376%); +} + +.talent-raynor-level03-firebatmedicrange-png{ + clip-path: xywh(0 97.60403530895334% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.66708701134931%); +} + +.talent-raynor-level08-orbitaldroppods-png{ + clip-path: xywh(0 97.73013871374528% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.79319041614123%); +} + +.talent-raynor-level14-infantryattackspeed-png{ + clip-path: xywh(0 97.8562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.91929382093316%); +} + +.talent-swann-level12-immortalityprotocol-png{ + clip-path: xywh(0 97.98234552332913% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.0453972257251%); +} + +.talent-swann-level14-vehiclehealthincrease-png{ + clip-path: xywh(0 98.10844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.17150063051703%); +} + +.talent-tychus-level02-additionaloutlaw-png{ + clip-path: xywh(0 98.23455233291298% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.29760403530895%); +} + +.talent-tychus-level07-firstdiscount-png{ + clip-path: xywh(0 98.36065573770492% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.423707440100884%); +} + +.talent-vorazun-level01-shadowstalk-png{ + clip-path: xywh(0 98.48675914249685% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.54981084489282%); +} + +.talent-vorazun-level05-unlockdarkarchon-png{ + clip-path: xywh(0 98.61286254728877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.67591424968474%); +} + +.talent-zagara-level12-unlockswarmling-png{ + clip-path: xywh(0 98.7389659520807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.80201765447667%); +} + +.talent-zagara-level14-unlocksplitterling-png{ + clip-path: xywh(0 98.86506935687264% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.928121059268605%); +} + +.tip_terrazinefog-png{ + clip-path: xywh(0 98.99117276166457% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.054224464060525%); +} + +.ui_aicommand_build_open_aggressivepush-png{ + clip-path: xywh(0 99.11727616645649% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.18032786885246%); +} + +.ui_btn_generic_exclemation_red-png{ + clip-path: xywh(0 99.24337957124843% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.30643127364439%); +} + +.ui_glues_help_armyicon_protoss-png{ + clip-path: xywh(0 99.36948297604036% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.43253467843631%); +} + +.ui_glues_help_armyicon_terran-png{ + clip-path: xywh(0 99.49558638083228% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.558638083228246%); +} + +.ui_glues_help_armyicon_zerg-png{ + clip-path: xywh(0 99.62168978562421% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.68474148802018%); +} + +.ui_tipicon_evolution_hydralisk-waves-png{ + clip-path: xywh(0 99.74779319041615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.8108448928121%); +} + +.vultureautolaunchers-png{ + clip-path: xywh(0 99.87389659520807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.93694829760403%); +} + diff --git a/WebHostLib/templates/tracker__Starcraft2.html b/WebHostLib/templates/tracker__Starcraft2.html index d365d126..932f2150 100644 --- a/WebHostLib/templates/tracker__Starcraft2.html +++ b/WebHostLib/templates/tracker__Starcraft2.html @@ -1,1092 +1,2254 @@ +{# Most of this file is generated using code from the ap-sc2-tracker-proto repo. #} -{% macro sc2_icon(name) -%} - -{% endmacro -%} -{% macro sc2_progressive_icon(name, url, level) -%} - -{% endmacro -%} -{% macro sc2_progressive_icon_with_custom_name(item_name, url, title) -%} - -{% endmacro -%} -{%+ macro sc2_tint_level(level) %} - tint-level-{{ level }} -{%+ endmacro %} -{% macro sc2_render_area(area) %} - - {{ area }} {{'▼' if area != 'Total'}} - {{ checks_done[area] }} / {{ checks_in_area[area] }} - - - {% for location in location_info[area] %} - - {{ location }} - {{ '✔' if location_info[area][location] else '' }} - - {% endfor %} - -{% endmacro -%} -{% macro sc2_loop_areas(column_index, column_count) %} - {% for area in checks_in_area if checks_in_area[area] > 0 and area != 'Total' %} - {% if loop.index0 < (loop.length / column_count) * (column_index + 1) - and loop.index0 >= (loop.length / column_count) * (column_index) %} - {{ sc2_render_area(area) }} - {% endif %} - {% endfor %} -{% endmacro -%} - {{ player_name }}'s Tracker - - - + {{ player_name }}'s Tracker + + + + - - - {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} -
- Switch To Generic Tracker + + +
+
+

{{ player_name }}'s Starcraft 2 Tracker{{' - Finished' if game_finished}}

- -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - -
-

{{ player_name }}'s Starcraft 2 Tracker

- Starting Resources -
+{{ minerals_count }}
+{{ vespene_count }}
+{{ supply_count }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Terran -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Terran Infantry Weapon', terran_infantry_weapon_url, terran_infantry_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Infantry Armor', terran_infantry_armor_url, terran_infantry_armor_level) }}{{ sc2_progressive_icon('Progressive Terran Vehicle Weapon', terran_vehicle_weapon_url, terran_vehicle_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Vehicle Armor', terran_vehicle_armor_url, terran_vehicle_armor_level) }}{{ sc2_progressive_icon('Progressive Terran Ship Weapon', terran_ship_weapon_url, terran_ship_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Ship Armor', terran_ship_armor_url, terran_ship_armor_level) }}{{ sc2_icon('Ultra-Capacitors') }}{{ sc2_icon('Vanadium Plating') }}
- Base -
{{ sc2_icon('Bunker') }}{{ sc2_icon('Projectile Accelerator (Bunker)') }}{{ sc2_icon('Neosteel Bunker (Bunker)') }}{{ sc2_icon('Shrike Turret (Bunker)') }}{{ sc2_icon('Fortified Bunker (Bunker)') }}{{ sc2_icon('Missile Turret') }}{{ sc2_icon('Titanium Housing (Missile Turret)') }}{{ sc2_icon('Hellstorm Batteries (Missile Turret)') }}{{ sc2_icon('Tech Reactor') }}{{ sc2_icon('Orbital Depots') }}
{{ sc2_icon('Command Center Reactor') }}{{ sc2_progressive_icon_with_custom_name('Progressive Orbital Command', orbital_command_url, orbital_command_name) }}{{ sc2_icon('Planetary Fortress') }}{{ sc2_progressive_icon_with_custom_name('Progressive Augmented Thrusters (Planetary Fortress)', augmented_thrusters_planetary_fortress_url, augmented_thrusters_planetary_fortress_name) }}{{ sc2_icon('Advanced Targeting (Planetary Fortress)') }}{{ sc2_icon('Micro-Filtering') }}{{ sc2_icon('Automated Refinery') }}{{ sc2_icon('Advanced Construction (SCV)') }}{{ sc2_icon('Dual-Fusion Welders (SCV)') }}{{ sc2_icon('Hostile Environment Adaptation (SCV)') }}
{{ sc2_icon('Sensor Tower') }}{{ sc2_icon('Perdition Turret') }}{{ sc2_icon('Hive Mind Emulator') }}{{ sc2_icon('Psi Disrupter') }}
- Infantry - - Vehicles -
{{ sc2_icon('Marine') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marine)', stimpack_marine_url, stimpack_marine_name) }}{{ sc2_icon('Combat Shield (Marine)') }}{{ sc2_icon('Laser Targeting System (Marine)') }}{{ sc2_icon('Magrail Munitions (Marine)') }}{{ sc2_icon('Optimized Logistics (Marine)') }}{{ sc2_icon('Hellion') }}{{ sc2_icon('Twin-Linked Flamethrower (Hellion)') }}{{ sc2_icon('Thermite Filaments (Hellion)') }}{{ sc2_icon('Hellbat Aspect (Hellion)') }}{{ sc2_icon('Smart Servos (Hellion)') }}{{ sc2_icon('Optimized Logistics (Hellion)') }}{{ sc2_icon('Jump Jets (Hellion)') }}
{{ sc2_icon('Medic') }}{{ sc2_icon('Advanced Medic Facilities (Medic)') }}{{ sc2_icon('Stabilizer Medpacks (Medic)') }}{{ sc2_icon('Restoration (Medic)') }}{{ sc2_icon('Optical Flare (Medic)') }}{{ sc2_icon('Resource Efficiency (Medic)') }}{{ sc2_icon('Adaptive Medpacks (Medic)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Hellion)', stimpack_hellion_url, stimpack_hellion_name) }}{{ sc2_icon('Infernal Plating (Hellion)') }}
{{ sc2_icon('Nano Projector (Medic)') }}{{ sc2_icon('Vulture') }}{{ sc2_progressive_icon_with_custom_name('Progressive Replenishable Magazine (Vulture)', replenishable_magazine_vulture_url, replenishable_magazine_vulture_name) }}{{ sc2_icon('Ion Thrusters (Vulture)') }}{{ sc2_icon('Auto Launchers (Vulture)') }}{{ sc2_icon('Auto-Repair (Vulture)') }}
{{ sc2_icon('Firebat') }}{{ sc2_icon('Incinerator Gauntlets (Firebat)') }}{{ sc2_icon('Juggernaut Plating (Firebat)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Firebat)', stimpack_firebat_url, stimpack_firebat_name) }}{{ sc2_icon('Resource Efficiency (Firebat)') }}{{ sc2_icon('Infernal Pre-Igniter (Firebat)') }}{{ sc2_icon('Kinetic Foam (Firebat)') }}{{ sc2_icon('Cerberus Mine (Spider Mine)') }}{{ sc2_icon('High Explosive Munition (Spider Mine)') }}
{{ sc2_icon('Nano Projectors (Firebat)') }}{{ sc2_icon('Goliath') }}{{ sc2_icon('Multi-Lock Weapons System (Goliath)') }}{{ sc2_icon('Ares-Class Targeting System (Goliath)') }}{{ sc2_icon('Jump Jets (Goliath)') }}{{ sc2_icon('Shaped Hull (Goliath)') }}{{ sc2_icon('Optimized Logistics (Goliath)') }}{{ sc2_icon('Resource Efficiency (Goliath)') }}
{{ sc2_icon('Marauder') }}{{ sc2_icon('Concussive Shells (Marauder)') }}{{ sc2_icon('Kinetic Foam (Marauder)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marauder)', stimpack_marauder_url, stimpack_marauder_name) }}{{ sc2_icon('Laser Targeting System (Marauder)') }}{{ sc2_icon('Magrail Munitions (Marauder)') }}{{ sc2_icon('Internal Tech Module (Marauder)') }}{{ sc2_icon('Internal Tech Module (Goliath)') }}
{{ sc2_icon('Juggernaut Plating (Marauder)') }}{{ sc2_icon('Diamondback') }}{{ sc2_progressive_icon_with_custom_name('Progressive Tri-Lithium Power Cell (Diamondback)', trilithium_power_cell_diamondback_url, trilithium_power_cell_diamondback_name) }}{{ sc2_icon('Shaped Hull (Diamondback)') }}{{ sc2_icon('Hyperfluxor (Diamondback)') }}{{ sc2_icon('Burst Capacitors (Diamondback)') }}{{ sc2_icon('Ion Thrusters (Diamondback)') }}{{ sc2_icon('Resource Efficiency (Diamondback)') }}
{{ sc2_icon('Reaper') }}{{ sc2_icon('U-238 Rounds (Reaper)') }}{{ sc2_icon('G-4 Clusterbomb (Reaper)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Reaper)', stimpack_reaper_url, stimpack_reaper_name) }}{{ sc2_icon('Laser Targeting System (Reaper)') }}{{ sc2_icon('Advanced Cloaking Field (Reaper)') }}{{ sc2_icon('Spider Mines (Reaper)') }}{{ sc2_icon('Siege Tank') }}{{ sc2_icon('Maelstrom Rounds (Siege Tank)') }}{{ sc2_icon('Shaped Blast (Siege Tank)') }}{{ sc2_icon('Jump Jets (Siege Tank)') }}{{ sc2_icon('Spider Mines (Siege Tank)') }}{{ sc2_icon('Smart Servos (Siege Tank)') }}{{ sc2_icon('Graduating Range (Siege Tank)') }}
{{ sc2_icon('Combat Drugs (Reaper)') }}{{ sc2_icon('Jet Pack Overdrive (Reaper)') }}{{ sc2_icon('Laser Targeting System (Siege Tank)') }}{{ sc2_icon('Advanced Siege Tech (Siege Tank)') }}{{ sc2_icon('Internal Tech Module (Siege Tank)') }}{{ sc2_icon('Shaped Hull (Siege Tank)') }}{{ sc2_icon('Resource Efficiency (Siege Tank)') }}
{{ sc2_icon('Ghost') }}{{ sc2_icon('Ocular Implants (Ghost)') }}{{ sc2_icon('Crius Suit (Ghost)') }}{{ sc2_icon('EMP Rounds (Ghost)') }}{{ sc2_icon('Lockdown (Ghost)') }}{{ sc2_icon('Resource Efficiency (Ghost)') }}{{ sc2_icon('Thor') }}{{ sc2_icon('330mm Barrage Cannon (Thor)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Immortality Protocol (Thor)', immortality_protocol_thor_url, immortality_protocol_thor_name) }}{{ sc2_progressive_icon_with_custom_name('Progressive High Impact Payload (Thor)', high_impact_payload_thor_url, high_impact_payload_thor_name) }}{{ sc2_icon('Button With a Skull on It (Thor)') }}{{ sc2_icon('Laser Targeting System (Thor)') }}{{ sc2_icon('Large Scale Field Construction (Thor)') }}
{{ sc2_icon('Spectre') }}{{ sc2_icon('Psionic Lash (Spectre)') }}{{ sc2_icon('Nyx-Class Cloaking Module (Spectre)') }}{{ sc2_icon('Impaler Rounds (Spectre)') }}{{ sc2_icon('Resource Efficiency (Spectre)') }}{{ sc2_icon('Predator') }}{{ sc2_icon('Resource Efficiency (Predator)') }}{{ sc2_icon('Cloak (Predator)') }}{{ sc2_icon('Charge (Predator)') }}{{ sc2_icon('Predator\'s Fury (Predator)') }}
{{ sc2_icon('HERC') }}{{ sc2_icon('Juggernaut Plating (HERC)') }}{{ sc2_icon('Kinetic Foam (HERC)') }}{{ sc2_icon('Resource Efficiency (HERC)') }}{{ sc2_icon('Widow Mine') }}{{ sc2_icon('Drilling Claws (Widow Mine)') }}{{ sc2_icon('Concealment (Widow Mine)') }}{{ sc2_icon('Black Market Launchers (Widow Mine)') }}{{ sc2_icon('Executioner Missiles (Widow Mine)') }}
{{ sc2_icon('Cyclone') }}{{ sc2_icon('Mag-Field Accelerators (Cyclone)') }}{{ sc2_icon('Mag-Field Launchers (Cyclone)') }}{{ sc2_icon('Targeting Optics (Cyclone)') }}{{ sc2_icon('Rapid Fire Launchers (Cyclone)') }}{{ sc2_icon('Resource Efficiency (Cyclone)') }}{{ sc2_icon('Internal Tech Module (Cyclone)') }}
{{ sc2_icon('Warhound') }}{{ sc2_icon('Resource Efficiency (Warhound)') }}{{ sc2_icon('Reinforced Plating (Warhound)') }}
- Starships -
{{ sc2_icon('Medivac') }}{{ sc2_icon('Rapid Deployment Tube (Medivac)') }}{{ sc2_icon('Advanced Healing AI (Medivac)') }}{{ sc2_icon('Expanded Hull (Medivac)') }}{{ sc2_icon('Afterburners (Medivac)') }}{{ sc2_icon('Scatter Veil (Medivac)') }}{{ sc2_icon('Advanced Cloaking Field (Medivac)') }}{{ sc2_icon('Raven') }}{{ sc2_icon('Bio Mechanical Repair Drone (Raven)') }}{{ sc2_icon('Spider Mines (Raven)') }}{{ sc2_icon('Railgun Turret (Raven)') }}{{ sc2_icon('Hunter-Seeker Weapon (Raven)') }}{{ sc2_icon('Interference Matrix (Raven)') }}{{ sc2_icon('Anti-Armor Missile (Raven)') }}
{{ sc2_icon('Wraith') }}{{ sc2_progressive_icon_with_custom_name('Progressive Tomahawk Power Cells (Wraith)', tomahawk_power_cells_wraith_url, tomahawk_power_cells_wraith_name) }}{{ sc2_icon('Displacement Field (Wraith)') }}{{ sc2_icon('Advanced Laser Technology (Wraith)') }}{{ sc2_icon('Trigger Override (Wraith)') }}{{ sc2_icon('Internal Tech Module (Wraith)') }}{{ sc2_icon('Resource Efficiency (Wraith)') }}{{ sc2_icon('Internal Tech Module (Raven)') }}{{ sc2_icon('Resource Efficiency (Raven)') }}{{ sc2_icon('Durable Materials (Raven)') }}
{{ sc2_icon('Viking') }}{{ sc2_icon('Ripwave Missiles (Viking)') }}{{ sc2_icon('Phobos-Class Weapons System (Viking)') }}{{ sc2_icon('Smart Servos (Viking)') }}{{ sc2_icon('Anti-Mechanical Munition (Viking)') }}{{ sc2_icon('Shredder Rounds (Viking)') }}{{ sc2_icon('W.I.L.D. Missiles (Viking)') }}{{ sc2_icon('Science Vessel') }}{{ sc2_icon('EMP Shockwave (Science Vessel)') }}{{ sc2_icon('Defensive Matrix (Science Vessel)') }}{{ sc2_icon('Improved Nano-Repair (Science Vessel)') }}{{ sc2_icon('Advanced AI Systems (Science Vessel)') }}
{{ sc2_icon('Banshee') }}{{ sc2_progressive_icon_with_custom_name('Progressive Cross-Spectrum Dampeners (Banshee)', crossspectrum_dampeners_banshee_url, crossspectrum_dampeners_banshee_name) }}{{ sc2_icon('Shockwave Missile Battery (Banshee)') }}{{ sc2_icon('Hyperflight Rotors (Banshee)') }}{{ sc2_icon('Laser Targeting System (Banshee)') }}{{ sc2_icon('Internal Tech Module (Banshee)') }}{{ sc2_icon('Shaped Hull (Banshee)') }}{{ sc2_icon('Hercules') }}{{ sc2_icon('Internal Fusion Module (Hercules)') }}{{ sc2_icon('Tactical Jump (Hercules)') }}
{{ sc2_icon('Advanced Targeting Optics (Banshee)') }}{{ sc2_icon('Distortion Blasters (Banshee)') }}{{ sc2_icon('Rocket Barrage (Banshee)') }}{{ sc2_icon('Liberator') }}{{ sc2_icon('Advanced Ballistics (Liberator)') }}{{ sc2_icon('Raid Artillery (Liberator)') }}{{ sc2_icon('Cloak (Liberator)') }}{{ sc2_icon('Laser Targeting System (Liberator)') }}{{ sc2_icon('Optimized Logistics (Liberator)') }}{{ sc2_icon('Smart Servos (Liberator)') }}
{{ sc2_icon('Battlecruiser') }}{{ sc2_progressive_icon('Progressive Missile Pods (Battlecruiser)', missile_pods_battlecruiser_url, missile_pods_battlecruiser_level) }}{{ sc2_progressive_icon_with_custom_name('Progressive Defensive Matrix (Battlecruiser)', defensive_matrix_battlecruiser_url, defensive_matrix_battlecruiser_name) }}{{ sc2_icon('Tactical Jump (Battlecruiser)') }}{{ sc2_icon('Cloak (Battlecruiser)') }}{{ sc2_icon('ATX Laser Battery (Battlecruiser)') }}{{ sc2_icon('Optimized Logistics (Battlecruiser)') }}{{ sc2_icon('Resource Efficiency (Liberator)') }}
{{ sc2_icon('Internal Tech Module (Battlecruiser)') }}{{ sc2_icon('Behemoth Plating (Battlecruiser)') }}{{ sc2_icon('Covert Ops Engines (Battlecruiser)') }}{{ sc2_icon('Valkyrie') }}{{ sc2_icon('Enhanced Cluster Launchers (Valkyrie)') }}{{ sc2_icon('Shaped Hull (Valkyrie)') }}{{ sc2_icon('Flechette Missiles (Valkyrie)') }}{{ sc2_icon('Afterburners (Valkyrie)') }}{{ sc2_icon('Launching Vector Compensator (Valkyrie)') }}{{ sc2_icon('Resource Efficiency (Valkyrie)') }}
- Mercenaries -
{{ sc2_icon('War Pigs') }}{{ sc2_icon('Devil Dogs') }}{{ sc2_icon('Hammer Securities') }}{{ sc2_icon('Spartan Company') }}{{ sc2_icon('Siege Breakers') }}{{ sc2_icon('Hel\'s Angels') }}{{ sc2_icon('Dusk Wings') }}{{ sc2_icon('Jackson\'s Revenge') }}{{ sc2_icon('Skibi\'s Angels') }}{{ sc2_icon('Death Heads') }}{{ sc2_icon('Winged Nightmares') }}{{ sc2_icon('Midnight Riders') }}{{ sc2_icon('Brynhilds') }}{{ sc2_icon('Jotun') }}
- General Upgrades -
{{ sc2_progressive_icon('Progressive Fire-Suppression System', firesuppression_system_url, firesuppression_system_level) }}{{ sc2_icon('Orbital Strike') }}{{ sc2_icon('Cellular Reactor') }}{{ sc2_progressive_icon('Progressive Regenerative Bio-Steel', regenerative_biosteel_url, regenerative_biosteel_level) }}{{ sc2_icon('Structure Armor') }}{{ sc2_icon('Hi-Sec Auto Tracking') }}{{ sc2_icon('Advanced Optics') }}{{ sc2_icon('Rogue Forces') }}
- Nova Equipment -
{{ sc2_icon('C20A Canister Rifle (Nova Weapon)') }}{{ sc2_icon('Hellfire Shotgun (Nova Weapon)') }}{{ sc2_icon('Plasma Rifle (Nova Weapon)') }}{{ sc2_icon('Monomolecular Blade (Nova Weapon)') }}{{ sc2_icon('Blazefire Gunblade (Nova Weapon)') }}{{ sc2_icon('Stim Infusion (Nova Gadget)') }}{{ sc2_icon('Pulse Grenades (Nova Gadget)') }}{{ sc2_icon('Flashbang Grenades (Nova Gadget)') }}{{ sc2_icon('Ionic Force Field (Nova Gadget)') }}{{ sc2_icon('Holo Decoy (Nova Gadget)') }}
{{ sc2_progressive_icon_with_custom_name('Progressive Stealth Suit Module (Nova Suit Module)', stealth_suit_module_nova_suit_module_url, stealth_suit_module_nova_suit_module_name) }}{{ sc2_icon('Energy Suit Module (Nova Suit Module)') }}{{ sc2_icon('Armored Suit Module (Nova Suit Module)') }}{{ sc2_icon('Jump Suit Module (Nova Suit Module)') }}{{ sc2_icon('Ghost Visor (Nova Equipment)') }}{{ sc2_icon('Rangefinder Oculus (Nova Equipment)') }}{{ sc2_icon('Domination (Nova Ability)') }}{{ sc2_icon('Blink (Nova Ability)') }}{{ sc2_icon('Tac Nuke Strike (Nova Ability)') }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Zerg -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Zerg Melee Attack', zerg_melee_attack_url, zerg_melee_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Missile Attack', zerg_missile_attack_url, zerg_missile_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Ground Carapace', zerg_ground_carapace_url, zerg_ground_carapace_level) }}{{ sc2_progressive_icon('Progressive Zerg Flyer Attack', zerg_flyer_attack_url, zerg_flyer_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Flyer Carapace', zerg_flyer_carapace_url, zerg_flyer_carapace_level) }}
- Base -
{{ sc2_icon('Automated Extractors (Kerrigan Tier 3)') }}{{ sc2_icon('Vespene Efficiency (Kerrigan Tier 5)') }}{{ sc2_icon('Twin Drones (Kerrigan Tier 5)') }}{{ sc2_icon('Improved Overlords (Kerrigan Tier 3)') }}{{ sc2_icon('Ventral Sacs (Overlord)') }}
{{ sc2_icon('Malignant Creep (Kerrigan Tier 5)') }}{{ sc2_icon('Spine Crawler') }}{{ sc2_icon('Spore Crawler') }}
- Units -
{{ sc2_icon('Zergling') }}{{ sc2_icon('Raptor Strain (Zergling)') }}{{ sc2_icon('Swarmling Strain (Zergling)') }}{{ sc2_icon('Hardened Carapace (Zergling)') }}{{ sc2_icon('Adrenal Overload (Zergling)') }}{{ sc2_icon('Metabolic Boost (Zergling)') }}{{ sc2_icon('Shredding Claws (Zergling)') }}{{ sc2_icon('Zergling Reconstitution (Kerrigan Tier 3)') }}
{{ sc2_icon('Baneling Aspect (Zergling)') }}{{ sc2_icon('Splitter Strain (Baneling)') }}{{ sc2_icon('Hunter Strain (Baneling)') }}{{ sc2_icon('Corrosive Acid (Baneling)') }}{{ sc2_icon('Rupture (Baneling)') }}{{ sc2_icon('Regenerative Acid (Baneling)') }}{{ sc2_icon('Centrifugal Hooks (Baneling)') }}
{{ sc2_icon('Tunneling Jaws (Baneling)') }}{{ sc2_icon('Rapid Metamorph (Baneling)') }}
{{ sc2_icon('Swarm Queen') }}{{ sc2_icon('Spawn Larvae (Swarm Queen)') }}{{ sc2_icon('Deep Tunnel (Swarm Queen)') }}{{ sc2_icon('Organic Carapace (Swarm Queen)') }}{{ sc2_icon('Bio-Mechanical Transfusion (Swarm Queen)') }}{{ sc2_icon('Resource Efficiency (Swarm Queen)') }}{{ sc2_icon('Incubator Chamber (Swarm Queen)') }}
{{ sc2_icon('Roach') }}{{ sc2_icon('Vile Strain (Roach)') }}{{ sc2_icon('Corpser Strain (Roach)') }}{{ sc2_icon('Hydriodic Bile (Roach)') }}{{ sc2_icon('Adaptive Plating (Roach)') }}{{ sc2_icon('Tunneling Claws (Roach)') }}{{ sc2_icon('Glial Reconstitution (Roach)') }}{{ sc2_icon('Organic Carapace (Roach)') }}
{{ sc2_icon('Ravager Aspect (Roach)') }}{{ sc2_icon('Potent Bile (Ravager)') }}{{ sc2_icon('Bloated Bile Ducts (Ravager)') }}{{ sc2_icon('Deep Tunnel (Ravager)') }}
{{ sc2_icon('Hydralisk') }}{{ sc2_icon('Frenzy (Hydralisk)') }}{{ sc2_icon('Ancillary Carapace (Hydralisk)') }}{{ sc2_icon('Grooved Spines (Hydralisk)') }}{{ sc2_icon('Muscular Augments (Hydralisk)') }}{{ sc2_icon('Resource Efficiency (Hydralisk)') }}
{{ sc2_icon('Impaler Aspect (Hydralisk)') }}{{ sc2_icon('Adaptive Talons (Impaler)') }}{{ sc2_icon('Secretion Glands (Impaler)') }}{{ sc2_icon('Hardened Tentacle Spines (Impaler)') }}
{{ sc2_icon('Lurker Aspect (Hydralisk)') }}{{ sc2_icon('Seismic Spines (Lurker)') }}{{ sc2_icon('Adapted Spines (Lurker)') }}
{{ sc2_icon('Aberration') }}
{{ sc2_icon('Swarm Host') }}{{ sc2_icon('Carrion Strain (Swarm Host)') }}{{ sc2_icon('Creeper Strain (Swarm Host)') }}{{ sc2_icon('Burrow (Swarm Host)') }}{{ sc2_icon('Rapid Incubation (Swarm Host)') }}{{ sc2_icon('Pressurized Glands (Swarm Host)') }}{{ sc2_icon('Locust Metabolic Boost (Swarm Host)') }}{{ sc2_icon('Enduring Locusts (Swarm Host)') }}
{{ sc2_icon('Organic Carapace (Swarm Host)') }}{{ sc2_icon('Resource Efficiency (Swarm Host)') }}
{{ sc2_icon('Infestor') }}{{ sc2_icon('Infested Terran (Infestor)') }}{{ sc2_icon('Microbial Shroud (Infestor)') }}
{{ sc2_icon('Defiler') }}
{{ sc2_icon('Ultralisk') }}{{ sc2_icon('Noxious Strain (Ultralisk)') }}{{ sc2_icon('Torrasque Strain (Ultralisk)') }}{{ sc2_icon('Burrow Charge (Ultralisk)') }}{{ sc2_icon('Tissue Assimilation (Ultralisk)') }}{{ sc2_icon('Monarch Blades (Ultralisk)') }}{{ sc2_icon('Anabolic Synthesis (Ultralisk)') }}{{ sc2_icon('Chitinous Plating (Ultralisk)') }}
{{ sc2_icon('Organic Carapace (Ultralisk)') }}{{ sc2_icon('Resource Efficiency (Ultralisk)') }}
{{ sc2_icon('Mutalisk') }}{{ sc2_icon('Rapid Regeneration (Mutalisk)') }}{{ sc2_icon('Sundering Glaive (Mutalisk)') }}{{ sc2_icon('Vicious Glaive (Mutalisk)') }}{{ sc2_icon('Severing Glaive (Mutalisk)') }}{{ sc2_icon('Aerodynamic Glaive Shape (Mutalisk)') }}
{{ sc2_icon('Corruptor') }}{{ sc2_icon('Corruption (Corruptor)') }}{{ sc2_icon('Caustic Spray (Corruptor)') }}
{{ sc2_icon('Brood Lord Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Porous Cartilage (Brood Lord)') }}{{ sc2_icon('Evolved Carapace (Brood Lord)') }}{{ sc2_icon('Splitter Mitosis (Brood Lord)') }}{{ sc2_icon('Resource Efficiency (Brood Lord)') }}
{{ sc2_icon('Viper Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Parasitic Bomb (Viper)') }}{{ sc2_icon('Paralytic Barbs (Viper)') }}{{ sc2_icon('Virulent Microbes (Viper)') }}
{{ sc2_icon('Guardian Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Prolonged Dispersion (Guardian)') }}{{ sc2_icon('Primal Adaptation (Guardian)') }}{{ sc2_icon('Soronan Acid (Guardian)') }}
{{ sc2_icon('Devourer Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Corrosive Spray (Devourer)') }}{{ sc2_icon('Gaping Maw (Devourer)') }}{{ sc2_icon('Improved Osmosis (Devourer)') }}{{ sc2_icon('Prescient Spores (Devourer)') }}
{{ sc2_icon('Brood Queen') }}{{ sc2_icon('Fungal Growth (Brood Queen)') }}{{ sc2_icon('Ensnare (Brood Queen)') }}{{ sc2_icon('Enhanced Mitochondria (Brood Queen)') }}
{{ sc2_icon('Scourge') }}{{ sc2_icon('Virulent Spores (Scourge)') }}{{ sc2_icon('Resource Efficiency (Scourge)') }}{{ sc2_icon('Swarm Scourge (Scourge)') }}
- Mercenaries -
{{ sc2_icon('Infested Medics') }}{{ sc2_icon('Infested Siege Tanks') }}{{ sc2_icon('Infested Banshees') }}
- Kerrigan -
Level: {{ kerrigan_level }}
{{ sc2_icon('Primal Form (Kerrigan)') }}
{{ sc2_icon('Kinetic Blast (Kerrigan Tier 1)') }}{{ sc2_icon('Heroic Fortitude (Kerrigan Tier 1)') }}{{ sc2_icon('Leaping Strike (Kerrigan Tier 1)') }}{{ sc2_icon('Crushing Grip (Kerrigan Tier 2)') }}{{ sc2_icon('Chain Reaction (Kerrigan Tier 2)') }}{{ sc2_icon('Psionic Shift (Kerrigan Tier 2)') }}
{{ sc2_icon('Wild Mutation (Kerrigan Tier 4)') }}{{ sc2_icon('Spawn Banelings (Kerrigan Tier 4)') }}{{ sc2_icon('Mend (Kerrigan Tier 4)') }}{{ sc2_icon('Infest Broodlings (Kerrigan Tier 6)') }}{{ sc2_icon('Fury (Kerrigan Tier 6)') }}{{ sc2_icon('Ability Efficiency (Kerrigan Tier 6)') }}
{{ sc2_icon('Apocalypse (Kerrigan Tier 7)') }}{{ sc2_icon('Spawn Leviathan (Kerrigan Tier 7)') }}{{ sc2_icon('Drop-Pods (Kerrigan Tier 7)') }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Protoss -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Protoss Ground Weapon', protoss_ground_weapon_url, protoss_ground_weapon_level) }}{{ sc2_progressive_icon('Progressive Protoss Ground Armor', protoss_ground_armor_url, protoss_ground_armor_level) }}{{ sc2_progressive_icon('Progressive Protoss Air Weapon', protoss_air_weapon_url, protoss_air_weapon_level) }}{{ sc2_progressive_icon('Progressive Protoss Air Armor', protoss_air_armor_url, protoss_air_armor_level) }}{{ sc2_progressive_icon('Progressive Protoss Shields', protoss_shields_url, protoss_shields_level) }}{{ sc2_icon('Quatro') }}
- Base -
{{ sc2_icon('Photon Cannon') }}{{ sc2_icon('Khaydarin Monolith') }}{{ sc2_icon('Shield Battery') }}{{ sc2_icon('Enhanced Targeting') }}{{ sc2_icon('Optimized Ordnance') }}{{ sc2_icon('Khalai Ingenuity') }}{{ sc2_icon('Orbital Assimilators') }}{{ sc2_icon('Amplified Assimilators') }}
{{ sc2_icon('Warp Harmonization') }}{{ sc2_icon('Superior Warp Gates') }}{{ sc2_icon('Nexus Overcharge') }}
- Gateway -
{{ sc2_icon('Zealot') }}{{ sc2_icon('Centurion') }}{{ sc2_icon('Sentinel') }}{{ sc2_icon('Leg Enhancements (Zealot/Sentinel/Centurion)') }}{{ sc2_icon('Shield Capacity (Zealot/Sentinel/Centurion)') }}
{{ sc2_icon('Supplicant') }}{{ sc2_icon('Blood Shield (Supplicant)') }}{{ sc2_icon('Soul Augmentation (Supplicant)') }}{{ sc2_icon('Shield Regeneration (Supplicant)') }}
{{ sc2_icon('Sentry') }}{{ sc2_icon('Force Field (Sentry)') }}{{ sc2_icon('Hallucination (Sentry)') }}
{{ sc2_icon('Energizer') }}{{ sc2_icon('Reclamation (Energizer)') }}{{ sc2_icon('Forged Chassis (Energizer)') }}{{ sc2_icon('Cloaking Module (Sentry/Energizer/Havoc)') }}{{ sc2_icon('Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)') }}
{{ sc2_icon('Havoc') }}{{ sc2_icon('Detect Weakness (Havoc)') }}{{ sc2_icon('Bloodshard Resonance (Havoc)') }}
{{ sc2_icon('Stalker') }}{{ sc2_icon('Instigator') }}{{ sc2_icon('Slayer') }}{{ sc2_icon('Disintegrating Particles (Stalker/Instigator/Slayer)') }}{{ sc2_icon('Particle Reflection (Stalker/Instigator/Slayer)') }}
{{ sc2_icon('Dragoon') }}{{ sc2_icon('High Impact Phase Disruptor (Dragoon)') }}{{ sc2_icon('Trillic Compression System (Dragoon)') }}{{ sc2_icon('Singularity Charge (Dragoon)') }}{{ sc2_icon('Enhanced Strider Servos (Dragoon)') }}
{{ sc2_icon('Adept') }}{{ sc2_icon('Shockwave (Adept)') }}{{ sc2_icon('Resonating Glaives (Adept)') }}{{ sc2_icon('Phase Bulwark (Adept)') }}
{{ sc2_icon('High Templar') }}{{ sc2_icon('Signifier') }}{{ sc2_icon('Unshackled Psionic Storm (High Templar/Signifier)') }}{{ sc2_icon('Hallucination (High Templar/Signifier)') }}{{ sc2_icon('Khaydarin Amulet (High Templar/Signifier)') }}{{ sc2_icon('High Archon (Archon)') }}
{{ sc2_icon('Ascendant') }}{{ sc2_icon('Power Overwhelming (Ascendant)') }}{{ sc2_icon('Chaotic Attunement (Ascendant)') }}{{ sc2_icon('Blood Amulet (Ascendant)') }}
{{ sc2_icon('Dark Archon') }}{{ sc2_icon('Feedback (Dark Archon)') }}{{ sc2_icon('Maelstrom (Dark Archon)') }}{{ sc2_icon('Argus Talisman (Dark Archon)') }}
{{ sc2_icon('Dark Templar') }}{{ sc2_icon('Dark Archon Meld (Dark Templar)') }}
{{ sc2_icon('Avenger') }}{{ sc2_icon('Blood Hunter') }}{{ sc2_icon('Shroud of Adun (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Blink (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Resource Efficiency (Dark Templar/Avenger/Blood Hunter)') }}
- Robotics Facility -
{{ sc2_icon('Warp Prism') }}{{ sc2_icon('Gravitic Drive (Warp Prism)') }}{{ sc2_icon('Phase Blaster (Warp Prism)') }}{{ sc2_icon('War Configuration (Warp Prism)') }}
{{ sc2_icon('Immortal') }}{{ sc2_icon('Annihilator') }}{{ sc2_icon('Singularity Charge (Immortal/Annihilator)') }}{{ sc2_icon('Advanced Targeting Mechanics (Immortal/Annihilator)') }}
{{ sc2_icon('Vanguard') }}{{ sc2_icon('Agony Launchers (Vanguard)') }}{{ sc2_icon('Matter Dispersion (Vanguard)') }}
{{ sc2_icon('Colossus') }}{{ sc2_icon('Pacification Protocol (Colossus)') }}
{{ sc2_icon('Wrathwalker') }}{{ sc2_icon('Rapid Power Cycling (Wrathwalker)') }}{{ sc2_icon('Eye of Wrath (Wrathwalker)') }}
{{ sc2_icon('Observer') }}{{ sc2_icon('Gravitic Boosters (Observer)') }}{{ sc2_icon('Sensor Array (Observer)') }}
{{ sc2_icon('Reaver') }}{{ sc2_icon('Scarab Damage (Reaver)') }}{{ sc2_icon('Solarite Payload (Reaver)') }}{{ sc2_icon('Reaver Capacity (Reaver)') }}{{ sc2_icon('Resource Efficiency (Reaver)') }}
{{ sc2_icon('Disruptor') }}
- Stargate -
{{ sc2_icon('Phoenix') }}{{ sc2_icon('Mirage') }}{{ sc2_icon('Ionic Wavelength Flux (Phoenix/Mirage)') }}{{ sc2_icon('Anion Pulse-Crystals (Phoenix/Mirage)') }}
{{ sc2_icon('Corsair') }}{{ sc2_icon('Stealth Drive (Corsair)') }}{{ sc2_icon('Argus Jewel (Corsair)') }}{{ sc2_icon('Sustaining Disruption (Corsair)') }}{{ sc2_icon('Neutron Shields (Corsair)') }}
{{ sc2_icon('Destroyer') }}{{ sc2_icon('Reforged Bloodshard Core (Destroyer)') }}
{{ sc2_icon('Void Ray') }}{{ sc2_icon('Flux Vanes (Void Ray/Destroyer)') }}
{{ sc2_icon('Carrier') }}{{ sc2_icon('Graviton Catapult (Carrier)') }}{{ sc2_icon('Hull of Past Glories (Carrier)') }}
{{ sc2_icon('Scout') }}{{ sc2_icon('Combat Sensor Array (Scout)') }}{{ sc2_icon('Apial Sensors (Scout)') }}{{ sc2_icon('Gravitic Thrusters (Scout)') }}{{ sc2_icon('Advanced Photon Blasters (Scout)') }}
{{ sc2_icon('Tempest') }}{{ sc2_icon('Tectonic Destabilizers (Tempest)') }}{{ sc2_icon('Quantic Reactor (Tempest)') }}{{ sc2_icon('Gravity Sling (Tempest)') }}
{{ sc2_icon('Mothership') }}
{{ sc2_icon('Arbiter') }}{{ sc2_icon('Chronostatic Reinforcement (Arbiter)') }}{{ sc2_icon('Khaydarin Core (Arbiter)') }}{{ sc2_icon('Spacetime Anchor (Arbiter)') }}{{ sc2_icon('Resource Efficiency (Arbiter)') }}{{ sc2_icon('Enhanced Cloak Field (Arbiter)') }}
{{ sc2_icon('Oracle') }}{{ sc2_icon('Stealth Drive (Oracle)') }}{{ sc2_icon('Stasis Calibration (Oracle)') }}{{ sc2_icon('Temporal Acceleration Beam (Oracle)') }}
- General Upgrades -
{{ sc2_icon('Matrix Overload') }}{{ sc2_icon('Guardian Shell') }}
- Spear of Adun -
{{ sc2_icon('Chrono Surge (Spear of Adun Calldown)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Proxy Pylon (Spear of Adun Calldown)', proxy_pylon_spear_of_adun_calldown_url, proxy_pylon_spear_of_adun_calldown_name) }}{{ sc2_icon('Pylon Overcharge (Spear of Adun Calldown)') }}{{ sc2_icon('Mass Recall (Spear of Adun Calldown)') }}{{ sc2_icon('Shield Overcharge (Spear of Adun Calldown)') }}{{ sc2_icon('Deploy Fenix (Spear of Adun Calldown)') }}{{ sc2_icon('Reconstruction Beam (Spear of Adun Auto-Cast)') }}
{{ sc2_icon('Orbital Strike (Spear of Adun Calldown)') }}{{ sc2_icon('Temporal Field (Spear of Adun Calldown)') }}{{ sc2_icon('Solar Lance (Spear of Adun Calldown)') }}{{ sc2_icon('Purifier Beam (Spear of Adun Calldown)') }}{{ sc2_icon('Time Stop (Spear of Adun Calldown)') }}{{ sc2_icon('Solar Bombardment (Spear of Adun Calldown)') }}{{ sc2_icon('Overwatch (Spear of Adun Auto-Cast)') }}
-
- - - - - - -
- - {{ sc2_loop_areas(0, 3) }} -
-
- - {{ sc2_loop_areas(1, 3) }} -
-
- - {{ sc2_loop_areas(2, 3) }} - - {{ sc2_render_area('Total') }} -
 
-
-
+
+
+ +

Filler Items

+
+
+
+
+ +
+ +{{minerals_count}} +
+
+
+ +
+ +{{vespene_count}} +
+
+
+ +
+ +{{supply_count}} +
+
+
+ +
+ +{{max_supply_count}} +
+
+
+ +
+ -{{reduced_supply_count}} +
+
+
+ +
+ {{construction_speed_count}} +
+
+
+ +
+ {{shield_regen_count}} +
+
+
+ +
+ {{upgrade_speed_count}} +
+
+
+ +
+ {{research_cost_count}} +
+
- - +
+
+ +

Terran Items

+
+
+
+
+ + Barracks +
+
+ + Factory +
+
+ + Starport +
+
+ + Buildings +
+
+ + Mercenaries +
+
+ + Miscellaneous +
+
+
+
+ — Barracks — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Factory — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Starport — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Mercenaries — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Zerg Items

+
+
+
+
+ + Ground +
+
+ + Flyers +
+
+ + Morphs +
+
+ + Infested +
+
+ + Buildings +
+
+ + Mercenaries +
+
+ + Miscellaneous +
+
+
+
+ — Ground — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Flyers — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Morphs — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Infested — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Mercenaries — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Protoss Items

+
+
+
+
+ + Gateway +
+
+ + Robotics Facility +
+
+ + Stargate +
+
+ + Buildings +
+
+ + Miscellaneous +
+
+
+
+ — Gateway — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Robotics Facility — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Stargate — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Nova Items

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Kerrigan Items

+
+
+
+ + {{kerrigan_level}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Keys

+
+
+
    + {% for key_name, key_amount in keys.items() %} +
  • {{key_name}}{{ ' (' + (key_amount | string) + ')' if key_amount > 1}}
  • + {% endfor %} +
+
+
+
+
+ +

Locations

+
+ {{checked_locations | length}} / {{locations | length}} = {{((checked_locations | length) / (locations | length) * 100) | round(3)}}% +
+
    + {% for mission_name, location_info in missions.items() %} +
  1. {{mission_name}}
      + {% for location_name, collected in location_info %} +
    • {{location_name}}
    • + {% endfor %} +
    +
  2. + {% endfor %} +
+
+
+
+
+ \ No newline at end of file diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 4b92f4b4..18145dae 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -1247,1114 +1247,225 @@ if "ChecksFinder" in network_data_package["games"]: if "Starcraft 2" in network_data_package["games"]: def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int) -> str: - SC2WOL_LOC_ID_OFFSET = 1000 - SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda - SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 - SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 - SC2WOL_ITEM_ID_OFFSET = 1000 - SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 - SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 + SC2HOTS_ITEM_ID_OFFSET = 2000 + SC2LOTV_ITEM_ID_OFFSET = 2000 + SC2_KEY_ITEM_ID_OFFSET = 4000 + NCO_LOCATION_ID_LOW = 20004500 + NCO_LOCATION_ID_HIGH = NCO_LOCATION_ID_LOW + 1000 + STARTING_MINERALS_ITEM_ID = 1800 + STARTING_VESPENE_ITEM_ID = 1801 + STARTING_SUPPLY_ITEM_ID = 1802 + # NOTHING_ITEM_ID = 1803 + MAX_SUPPLY_ITEM_ID = 1804 + SHIELD_REGENERATION_ITEM_ID = 1805 + BUILDING_CONSTRUCTION_SPEED_ITEM_ID = 1806 + UPGRADE_RESEARCH_SPEED_ITEM_ID = 1807 + UPGRADE_RESEARCH_COST_ITEM_ID = 1808 + REDUCED_MAX_SUPPLY_ITEM_ID = 1850 slot_data = tracker_data.get_slot_data(team, player) - minerals_per_item = slot_data.get("minerals_per_item", 15) - vespene_per_item = slot_data.get("vespene_per_item", 15) - starting_supply_per_item = slot_data.get("starting_supply_per_item", 2) - - github_icon_base_url = "https://matthewmarinets.github.io/ap_sc2_icons/icons/" - organics_icon_base_url = "https://0rganics.org/archipelago/sc2wol/" - - icons = { - "Starting Minerals": github_icon_base_url + "blizzard/icon-mineral-nobg.png", - "Starting Vespene": github_icon_base_url + "blizzard/icon-gas-terran-nobg.png", - "Starting Supply": github_icon_base_url + "blizzard/icon-supply-terran_nobg.png", - - "Terran Infantry Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel1.png", - "Terran Infantry Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel2.png", - "Terran Infantry Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel3.png", - "Terran Infantry Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel1.png", - "Terran Infantry Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel2.png", - "Terran Infantry Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel3.png", - "Terran Vehicle Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel1.png", - "Terran Vehicle Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel2.png", - "Terran Vehicle Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel3.png", - "Terran Vehicle Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel1.png", - "Terran Vehicle Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel2.png", - "Terran Vehicle Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel3.png", - "Terran Ship Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel1.png", - "Terran Ship Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel2.png", - "Terran Ship Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel3.png", - "Terran Ship Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-shipplatinglevel1.png", - "Terran Ship Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-shipplatinglevel2.png", - "Terran Ship Armor Level 3": github_icon_base_url + "blizzard/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)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-bunkerresearchbundle_05.png", - "Neosteel Bunker (Bunker)": organics_icon_base_url + "NeosteelBunker.png", - "Titanium Housing (Missile Turret)": organics_icon_base_url + "TitaniumHousing.png", - "Hellstorm Batteries (Missile Turret)": github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png", - "Advanced Construction (SCV)": github_icon_base_url + "blizzard/btn-ability-mengsk-trooper-advancedconstruction.png", - "Dual-Fusion Welders (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-scvdoublerepair.png", - "Hostile Environment Adaptation (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png", - "Fire-Suppression System Level 1": organics_icon_base_url + "Fire-SuppressionSystem.png", - "Fire-Suppression System Level 2": github_icon_base_url + "blizzard/btn-upgrade-swann-firesuppressionsystem.png", - - "Orbital Command": organics_icon_base_url + "OrbitalCommandCampaign.png", - "Planetary Command Module": github_icon_base_url + "original/btn-orbital-fortress.png", - "Lift Off (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-terran-liftoff.png", - "Armament Stabilizers (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-mengsk-siegetank-flyingtankarmament.png", - "Advanced Targeting (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - - "Marine": "https://static.wikia.nocookie.net/starcraft/images/4/47/Marine_SC2_Icon1.jpg", - "Medic": github_icon_base_url + "blizzard/btn-unit-terran-medic.png", - "Firebat": github_icon_base_url + "blizzard/btn-unit-terran-firebat.png", - "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", - "Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg", - "Spectre": github_icon_base_url + "original/btn-unit-terran-spectre.png", - "HERC": github_icon_base_url + "blizzard/btn-unit-terran-herc.png", - - "Stimpack (Marine)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Combat Shield (Marine)": github_icon_base_url + "blizzard/btn-techupgrade-terran-combatshield-color.png", - "Laser Targeting System (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Magrail Munitions (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png", - "Optimized Logistics (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Advanced Medic Facilities (Medic)": organics_icon_base_url + "AdvancedMedicFacilities.png", - "Stabilizer Medpacks (Medic)": github_icon_base_url + "blizzard/btn-upgrade-raynor-stabilizermedpacks.png", - "Restoration (Medic)": github_icon_base_url + "original/btn-ability-terran-restoration@scbw.png", - "Optical Flare (Medic)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-dragoonsolariteflare.png", - "Resource Efficiency (Medic)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Adaptive Medpacks (Medic)": github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png", - "Nano Projector (Medic)": github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png", - "Incinerator Gauntlets (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-raynor-incineratorgauntlets.png", - "Juggernaut Plating (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-raynor-juggernautplating.png", - "Stimpack (Firebat)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Resource Efficiency (Firebat)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Infernal Pre-Igniter (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png", - "Kinetic Foam (Firebat)": organics_icon_base_url + "KineticFoam.png", - "Nano Projectors (Firebat)": github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png", - "Concussive Shells (Marauder)": github_icon_base_url + "blizzard/btn-ability-terran-punishergrenade-color.png", - "Kinetic Foam (Marauder)": organics_icon_base_url + "KineticFoam.png", - "Stimpack (Marauder)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Laser Targeting System (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Magrail Munitions (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png", - "Internal Tech Module (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Juggernaut Plating (Marauder)": organics_icon_base_url + "JuggernautPlating.png", - "U-238 Rounds (Reaper)": organics_icon_base_url + "U-238Rounds.png", - "G-4 Clusterbomb (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-kd8chargeex3.png", - "Stimpack (Reaper)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Laser Targeting System (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Advanced Cloaking Field (Reaper)": github_icon_base_url + "original/btn-permacloak-reaper.png", - "Spider Mines (Reaper)": github_icon_base_url + "original/btn-ability-terran-spidermine.png", - "Combat Drugs (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-reapercombatdrugs.png", - "Jet Pack Overdrive (Reaper)": github_icon_base_url + "blizzard/btn-ability-hornerhan-reaper-flightmode.png", - "Ocular Implants (Ghost)": organics_icon_base_url + "OcularImplants.png", - "Crius Suit (Ghost)": github_icon_base_url + "original/btn-permacloak-ghost.png", - "EMP Rounds (Ghost)": github_icon_base_url + "blizzard/btn-ability-terran-emp-color.png", - "Lockdown (Ghost)": github_icon_base_url + "original/btn-abilty-terran-lockdown@scbw.png", - "Resource Efficiency (Ghost)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Psionic Lash (Spectre)": organics_icon_base_url + "PsionicLash.png", - "Nyx-Class Cloaking Module (Spectre)": github_icon_base_url + "original/btn-permacloak-spectre.png", - "Impaler Rounds (Spectre)": github_icon_base_url + "blizzard/btn-techupgrade-terran-impalerrounds.png", - "Resource Efficiency (Spectre)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Juggernaut Plating (HERC)": organics_icon_base_url + "JuggernautPlating.png", - "Kinetic Foam (HERC)": organics_icon_base_url + "KineticFoam.png", - "Resource Efficiency (HERC)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", - "Vulture": github_icon_base_url + "blizzard/btn-unit-terran-vulture.png", - "Goliath": github_icon_base_url + "blizzard/btn-unit-terran-goliath.png", - "Diamondback": github_icon_base_url + "blizzard/btn-unit-terran-cobra.png", - "Siege Tank": "https://static.wikia.nocookie.net/starcraft/images/5/57/SiegeTank_SC2_Icon1.jpg", - "Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg", - "Predator": github_icon_base_url + "original/btn-unit-terran-predator.png", - "Widow Mine": github_icon_base_url + "blizzard/btn-unit-terran-widowmine.png", - "Cyclone": github_icon_base_url + "blizzard/btn-unit-terran-cyclone.png", - "Warhound": github_icon_base_url + "blizzard/btn-unit-terran-warhound.png", - - "Twin-Linked Flamethrower (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-trooper-flamethrower.png", - "Thermite Filaments (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png", - "Hellbat Aspect (Hellion)": github_icon_base_url + "blizzard/btn-unit-terran-hellionbattlemode.png", - "Smart Servos (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Optimized Logistics (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Jump Jets (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Stimpack (Hellion)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Infernal Plating (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png", - "Cerberus Mine (Spider Mine)": github_icon_base_url + "blizzard/btn-upgrade-raynor-cerberusmines.png", - "High Explosive Munition (Spider Mine)": github_icon_base_url + "original/btn-ability-terran-spidermine.png", - "Replenishable Magazine (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png", - "Replenishable Magazine (Free) (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png", - "Ion Thrusters (Vulture)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Auto Launchers (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-terran-jotunboosters.png", - "Auto-Repair (Vulture)": github_icon_base_url + "blizzard/ui_tipicon_campaign_space01-repair.png", - "Multi-Lock Weapons System (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-swann-multilockweaponsystem.png", - "Ares-Class Targeting System (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-swann-aresclasstargetingsystem.png", - "Jump Jets (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Optimized Logistics (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Shaped Hull (Goliath)": organics_icon_base_url + "ShapedHull.png", - "Resource Efficiency (Goliath)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Internal Tech Module (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Tri-Lithium Power Cell (Diamondback)": github_icon_base_url + "original/btn-upgrade-terran-trilithium-power-cell.png", - "Tungsten Spikes (Diamondback)": github_icon_base_url + "original/btn-upgrade-terran-tungsten-spikes.png", - "Shaped Hull (Diamondback)": organics_icon_base_url + "ShapedHull.png", - "Hyperfluxor (Diamondback)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-orbitaldrop.png", - "Burst Capacitors (Diamondback)": github_icon_base_url + "blizzard/btn-ability-terran-electricfield.png", - "Ion Thrusters (Diamondback)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Resource Efficiency (Diamondback)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Maelstrom Rounds (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-raynor-maelstromrounds.png", - "Shaped Blast (Siege Tank)": organics_icon_base_url + "ShapedBlast.png", - "Jump Jets (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Spider Mines (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png", - "Smart Servos (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Graduating Range (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-siegetankrange.png", - "Laser Targeting System (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Advanced Siege Tech (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-raynor-improvedsiegemode.png", - "Internal Tech Module (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Shaped Hull (Siege Tank)": organics_icon_base_url + "ShapedHull.png", - "Resource Efficiency (Siege Tank)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "330mm Barrage Cannon (Thor)": github_icon_base_url + "original/btn-ability-thor-330mm.png", - "Immortality Protocol (Thor)": github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png", - "Immortality Protocol (Free) (Thor)": github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png", - "High Impact Payload (Thor)": github_icon_base_url + "blizzard/btn-unit-terran-thorsiegemode.png", - "Smart Servos (Thor)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Button With a Skull on It (Thor)": github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png", - "Laser Targeting System (Thor)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Large Scale Field Construction (Thor)": github_icon_base_url + "blizzard/talent-swann-level12-immortalityprotocol.png", - "Resource Efficiency (Predator)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Cloak (Predator)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Charge (Predator)": github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png", - "Predator's Fury (Predator)": github_icon_base_url + "blizzard/btn-ability-protoss-shadowfury.png", - "Drilling Claws (Widow Mine)": github_icon_base_url + "blizzard/btn-upgrade-terran-researchdrillingclaws.png", - "Concealment (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-terran-widowminehidden.png", - "Black Market Launchers (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-attackrange.png", - "Executioner Missiles (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-deathblossom.png", - "Mag-Field Accelerators (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-magfieldaccelerator.png", - "Mag-Field Launchers (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-cyclonerangeupgrade.png", - "Targeting Optics (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-swann-targetingoptics.png", - "Rapid Fire Launchers (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png", - "Resource Efficiency (Cyclone)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Internal Tech Module (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Warhound)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Reinforced Plating (Warhound)": github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png", - - "Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg", - "Wraith": github_icon_base_url + "blizzard/btn-unit-terran-wraith.png", - "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", - "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", - "Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png", - "Liberator": github_icon_base_url + "blizzard/btn-unit-terran-liberator.png", - "Valkyrie": github_icon_base_url + "original/btn-unit-terran-valkyrie@scbw.png", - - "Rapid Deployment Tube (Medivac)": organics_icon_base_url + "RapidDeploymentTube.png", - "Advanced Healing AI (Medivac)": github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png", - "Expanded Hull (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-neosteelfortifiedarmor.png", - "Afterburners (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png", - "Scatter Veil (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Advanced Cloaking Field (Medivac)": github_icon_base_url + "original/btn-permacloak-medivac.png", - "Tomahawk Power Cells (Wraith)": organics_icon_base_url + "TomahawkPowerCells.png", - "Unregistered Cloaking Module (Wraith)": github_icon_base_url + "original/btn-permacloak-wraith.png", - "Trigger Override (Wraith)": github_icon_base_url + "blizzard/btn-ability-hornerhan-wraith-attackspeed.png", - "Internal Tech Module (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Wraith)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Displacement Field (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-swann-displacementfield.png", - "Advanced Laser Technology (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-swann-improvedburstlaser.png", - "Ripwave Missiles (Viking)": github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png", - "Phobos-Class Weapons System (Viking)": github_icon_base_url + "blizzard/btn-upgrade-raynor-phobosclassweaponssystem.png", - "Smart Servos (Viking)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Anti-Mechanical Munition (Viking)": github_icon_base_url + "blizzard/btn-ability-terran-ignorearmor.png", - "Shredder Rounds (Viking)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-piercingattacks.png", - "W.I.L.D. Missiles (Viking)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png", - "Cross-Spectrum Dampeners (Banshee)": github_icon_base_url + "original/btn-banshee-cross-spectrum-dampeners.png", - "Advanced Cross-Spectrum Dampeners (Banshee)": github_icon_base_url + "original/btn-permacloak-banshee.png", - "Shockwave Missile Battery (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-raynor-shockwavemissilebattery.png", - "Hyperflight Rotors (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-hyperflightrotors.png", - "Laser Targeting System (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Internal Tech Module (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Shaped Hull (Banshee)": organics_icon_base_url + "ShapedHull.png", - "Advanced Targeting Optics (Banshee)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Distortion Blasters (Banshee)": github_icon_base_url + "blizzard/btn-techupgrade-terran-cloakdistortionfield.png", - "Rocket Barrage (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png", - "Missile Pods (Battlecruiser) Level 1": organics_icon_base_url + "MissilePods.png", - "Missile Pods (Battlecruiser) Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png", - "Defensive Matrix (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Advanced Defensive Matrix (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Tactical Jump (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-warpjump.png", - "Cloak (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "ATX Laser Battery (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png", - "Optimized Logistics (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Internal Tech Module (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Behemoth Plating (Battlecruiser)": github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png", - "Covert Ops Engines (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Bio Mechanical Repair Drone (Raven)": github_icon_base_url + "blizzard/btn-unit-biomechanicaldrone.png", - "Spider Mines (Raven)": github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png", - "Railgun Turret (Raven)": github_icon_base_url + "blizzard/btn-unit-terran-autoturretblackops.png", - "Hunter-Seeker Weapon (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png", - "Interference Matrix (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-interferencematrix.png", - "Anti-Armor Missile (Raven)": github_icon_base_url + "blizzard/btn-ability-terran-shreddermissile-color.png", - "Internal Tech Module (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Raven)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Durable Materials (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-durablematerials.png", - "EMP Shockwave (Science Vessel)": github_icon_base_url + "blizzard/btn-ability-mengsk-ghost-staticempblast.png", - "Defensive Matrix (Science Vessel)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Improved Nano-Repair (Science Vessel)": github_icon_base_url + "blizzard/btn-upgrade-swann-improvednanorepair.png", - "Advanced AI Systems (Science Vessel)": github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png", - "Internal Fusion Module (Hercules)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Tactical Jump (Hercules)": github_icon_base_url + "blizzard/btn-ability-terran-hercules-tacticaljump.png", - "Advanced Ballistics (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-advanceballistics.png", - "Raid Artillery (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-terrandefendermodestructureattack.png", - "Cloak (Liberator)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Laser Targeting System (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Optimized Logistics (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Smart Servos (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Resource Efficiency (Liberator)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Enhanced Cluster Launchers (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png", - "Shaped Hull (Valkyrie)": organics_icon_base_url + "ShapedHull.png", - "Flechette Missiles (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png", - "Afterburners (Valkyrie)": github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png", - "Launching Vector Compensator (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Resource Efficiency (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.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 Angels": "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", - "Skibi's Angels": github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png", - "Death Heads": github_icon_base_url + "blizzard/btn-unit-terran-deathhead.png", - "Winged Nightmares": github_icon_base_url + "blizzard/btn-unit-collection-wraith-junker.png", - "Midnight Riders": github_icon_base_url + "blizzard/btn-unit-terran-liberatorblackops.png", - "Brynhilds": github_icon_base_url + "blizzard/btn-unit-collection-vikingfighter-covertops.png", - "Jotun": github_icon_base_url + "blizzard/btn-unit-terran-thormengsk.png", - - "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", - "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", - "Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png", - "Regenerative Bio-Steel Level 1": github_icon_base_url + "original/btn-regenerativebiosteel-green.png", - "Regenerative Bio-Steel Level 2": github_icon_base_url + "original/btn-regenerativebiosteel-blue.png", - "Regenerative Bio-Steel Level 3": github_icon_base_url + "blizzard/btn-research-zerg-regenerativebio-steel.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", - - "Structure Armor": github_icon_base_url + "blizzard/btn-upgrade-terran-buildingarmor.png", - "Hi-Sec Auto Tracking": github_icon_base_url + "blizzard/btn-upgrade-terran-hisecautotracking.png", - "Advanced Optics": github_icon_base_url + "blizzard/btn-upgrade-swann-vehiclerangeincrease.png", - "Rogue Forces": github_icon_base_url + "blizzard/btn-unit-terran-tosh.png", - - "Ghost Visor (Nova Equipment)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-ghostvisor.png", - "Rangefinder Oculus (Nova Equipment)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-rangefinderoculus.png", - "Domination (Nova Ability)": github_icon_base_url + "blizzard/btn-ability-nova-domination.png", - "Blink (Nova Ability)": github_icon_base_url + "blizzard/btn-upgrade-nova-blink.png", - "Stealth Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-stealthsuit.png", - "Cloak (Nova Suit Module)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Permanently Cloaked (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-tacticalstealthsuit.png", - "Energy Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-apolloinfantrysuit.png", - "Armored Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-blinksuit.png", - "Jump Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-jetpack.png", - "C20A Canister Rifle (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-canisterrifle.png", - "Hellfire Shotgun (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-shotgun.png", - "Plasma Rifle (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-plasmagun.png", - "Monomolecular Blade (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-monomolecularblade.png", - "Blazefire Gunblade (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-gunblade_sword.png", - "Stim Infusion (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Pulse Grenades (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-pulsegrenade.png", - "Flashbang Grenades (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-flashgrenade.png", - "Ionic Force Field (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-personaldefensivematrix.png", - "Holo Decoy (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-holographicdecoy.png", - "Tac Nuke Strike (Nova Ability)": github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png", - - "Zerg Melee Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level1.png", - "Zerg Melee Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level2.png", - "Zerg Melee Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level3.png", - "Zerg Missile Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level1.png", - "Zerg Missile Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level2.png", - "Zerg Missile Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level3.png", - "Zerg Ground Carapace Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level1.png", - "Zerg Ground Carapace Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level2.png", - "Zerg Ground Carapace Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level3.png", - "Zerg Flyer Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level1.png", - "Zerg Flyer Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png", - "Zerg Flyer Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level3.png", - "Zerg Flyer Carapace Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level1.png", - "Zerg Flyer Carapace Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level2.png", - "Zerg Flyer Carapace Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level3.png", - - "Automated Extractors (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-automatedextractors.png", - "Vespene Efficiency (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-vespeneefficiency.png", - "Twin Drones (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-twindrones.png", - "Improved Overlords (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-improvedoverlords.png", - "Ventral Sacs (Overlord)": github_icon_base_url + "blizzard/btn-upgrade-zerg-ventralsacs.png", - "Malignant Creep (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-malignantcreep.png", - - "Spine Crawler": github_icon_base_url + "blizzard/btn-building-zerg-spinecrawler.png", - "Spore Crawler": github_icon_base_url + "blizzard/btn-building-zerg-sporecrawler.png", - - "Zergling": github_icon_base_url + "blizzard/btn-unit-zerg-zergling.png", - "Swarm Queen": github_icon_base_url + "blizzard/btn-unit-zerg-broodqueen.png", - "Roach": github_icon_base_url + "blizzard/btn-unit-zerg-roach.png", - "Hydralisk": github_icon_base_url + "blizzard/btn-unit-zerg-hydralisk.png", - "Aberration": github_icon_base_url + "blizzard/btn-unit-zerg-aberration.png", - "Mutalisk": github_icon_base_url + "blizzard/btn-unit-zerg-mutalisk.png", - "Corruptor": github_icon_base_url + "blizzard/btn-unit-zerg-corruptor.png", - "Swarm Host": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost.png", - "Infestor": github_icon_base_url + "blizzard/btn-unit-zerg-infestor.png", - "Defiler": github_icon_base_url + "original/btn-unit-zerg-defiler@scbw.png", - "Ultralisk": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk.png", - "Brood Queen": github_icon_base_url + "blizzard/btn-unit-zerg-classicqueen.png", - "Scourge": github_icon_base_url + "blizzard/btn-unit-zerg-scourge.png", - - "Baneling Aspect (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-baneling.png", - "Ravager Aspect (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-ravager.png", - "Impaler Aspect (Hydralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-impaler.png", - "Lurker Aspect (Hydralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-lurker.png", - "Brood Lord Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-broodlord.png", - "Viper Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-viper.png", - "Guardian Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-primalguardian.png", - "Devourer Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-devourerex3.png", - - "Raptor Strain (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-zergling-raptor.png", - "Swarmling Strain (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-zergling-swarmling.png", - "Hardened Carapace (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hardenedcarapace.png", - "Adrenal Overload (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adrenaloverload.png", - "Metabolic Boost (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsmetabolicboost.png", - "Shredding Claws (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zergling-armorshredding.png", - "Zergling Reconstitution (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-zerglingreconstitution.png", - "Splitter Strain (Baneling)": github_icon_base_url + "blizzard/talent-zagara-level14-unlocksplitterling.png", - "Hunter Strain (Baneling)": github_icon_base_url + "blizzard/btn-ability-zerg-cliffjump-baneling.png", - "Corrosive Acid (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-corrosiveacid.png", - "Rupture (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rupture.png", - "Regenerative Acid (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-regenerativebile.png", - "Centrifugal Hooks (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-centrifugalhooks.png", - "Tunneling Jaws (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-tunnelingjaws.png", - "Rapid Metamorph (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Spawn Larvae (Swarm Queen)": github_icon_base_url + "blizzard/btn-unit-zerg-larva.png", - "Deep Tunnel (Swarm Queen)": github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png", - "Organic Carapace (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Bio-Mechanical Transfusion (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomechanicaltransfusion.png", - "Resource Efficiency (Swarm Queen)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Incubator Chamber (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-incubationchamber.png", - "Vile Strain (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-roach-vile.png", - "Corpser Strain (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-roach-corpser.png", - "Hydriodic Bile (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hydriaticacid.png", - "Adaptive Plating (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivecarapace.png", - "Tunneling Claws (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotstunnelingclaws.png", - "Glial Reconstitution (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png", - "Organic Carapace (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Potent Bile (Ravager)": github_icon_base_url + "blizzard/potentbile_coop.png", - "Bloated Bile Ducts (Ravager)": github_icon_base_url + "blizzard/btn-ability-zerg-abathur-corrosivebilelarge.png", - "Deep Tunnel (Ravager)": github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png", - "Frenzy (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-frenzy.png", - "Ancillary Carapace (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-ancillaryarmor.png", - "Grooved Spines (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsgroovedspines.png", - "Muscular Augments (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-evolvemuscularaugments.png", - "Resource Efficiency (Hydralisk)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Adaptive Talons (Impaler)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivetalons.png", - "Secretion Glands (Impaler)": github_icon_base_url + "blizzard/btn-ability-zerg-creepspread.png", - "Hardened Tentacle Spines (Impaler)": github_icon_base_url + "blizzard/btn-ability-zerg-dehaka-impaler-tenderize.png", - "Seismic Spines (Lurker)": github_icon_base_url + "blizzard/btn-upgrade-kerrigan-seismicspines.png", - "Adapted Spines (Lurker)": github_icon_base_url + "blizzard/btn-upgrade-zerg-groovedspines.png", - "Vicious Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-viciousglaive.png", - "Rapid Regeneration (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidregeneration.png", - "Sundering Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png", - "Severing Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png", - "Aerodynamic Glaive Shape (Mutalisk)": github_icon_base_url + "blizzard/btn-ability-dehaka-airbonusdamage.png", - "Corruption (Corruptor)": github_icon_base_url + "blizzard/btn-ability-zerg-causticspray.png", - "Caustic Spray (Corruptor)": github_icon_base_url + "blizzard/btn-ability-zerg-corruption-color.png", - "Porous Cartilage (Brood Lord)": github_icon_base_url + "blizzard/btn-upgrade-kerrigan-broodlordspeed.png", - "Evolved Carapace (Brood Lord)": github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png", - "Splitter Mitosis (Brood Lord)": github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png", - "Resource Efficiency (Brood Lord)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Parasitic Bomb (Viper)": github_icon_base_url + "blizzard/btn-ability-zerg-parasiticbomb.png", - "Paralytic Barbs (Viper)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-abduct.png", - "Virulent Microbes (Viper)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-castrange.png", - "Prolonged Dispersion (Guardian)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-prolongeddispersion.png", - "Primal Adaptation (Guardian)": github_icon_base_url + "blizzard/biomassrecovery_coop.png", - "Soronan Acid (Guardian)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomass.png", - "Corrosive Spray (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-devourer-corrosivespray.png", - "Gaping Maw (Devourer)": github_icon_base_url + "blizzard/btn-ability-zerg-explode-color.png", - "Improved Osmosis (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-pneumatizedcarapace.png", - "Prescient Spores (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png", - "Carrion Strain (Swarm Host)": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-carrion.png", - "Creeper Strain (Swarm Host)": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-creeper.png", - "Burrow (Swarm Host)": github_icon_base_url + "blizzard/btn-ability-zerg-burrow-color.png", - "Rapid Incubation (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidincubation.png", - "Pressurized Glands (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-pressurizedglands.png", - "Locust Metabolic Boost (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png", - "Enduring Locusts (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-evolveincreasedlocustlifetime.png", - "Organic Carapace (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Resource Efficiency (Swarm Host)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Infested Terran (Infestor)": github_icon_base_url + "blizzard/btn-unit-zerg-infestedmarine.png", - "Microbial Shroud (Infestor)": github_icon_base_url + "blizzard/btn-ability-zerg-darkswarm.png", - "Noxious Strain (Ultralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-noxious.png", - "Torrasque Strain (Ultralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-torrasque.png", - "Burrow Charge (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-burrowcharge.png", - "Tissue Assimilation (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-tissueassimilation.png", - "Monarch Blades (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-monarchblades.png", - "Anabolic Synthesis (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-anabolicsynthesis.png", - "Chitinous Plating (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png", - "Organic Carapace (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Resource Efficiency (Ultralisk)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Fungal Growth (Brood Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-researchqueenfungalgrowth.png", - "Ensnare (Brood Queen)": github_icon_base_url + "blizzard/btn-ability-zerg-fungalgrowth-color.png", - "Enhanced Mitochondria (Brood Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-queenenergyregen.png", - "Virulent Spores (Scourge)": github_icon_base_url + "blizzard/btn-upgrade-zagara-scourgesplashdamage.png", - "Resource Efficiency (Scourge)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Swarm Scourge (Scourge)": github_icon_base_url + "original/btn-upgrade-custom-triple-scourge.png", - - "Infested Medics": github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png", - "Infested Siege Tanks": github_icon_base_url + "original/btn-unit-terran-siegetankmercenary-tank.png", - "Infested Banshees": github_icon_base_url + "original/btn-unit-terran-bansheemercenary.png", - - "Primal Form (Kerrigan)": github_icon_base_url + "blizzard/btn-unit-zerg-kerriganinfested.png", - "Kinetic Blast (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-kineticblast.png", - "Heroic Fortitude (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-heroicfortitude.png", - "Leaping Strike (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-leapingstrike.png", - "Crushing Grip (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-crushinggrip.png", - "Chain Reaction (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-chainreaction.png", - "Psionic Shift (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-kerrigan-psychicshift.png", - "Wild Mutation (Kerrigan Tier 4)": github_icon_base_url + "blizzard/btn-ability-kerrigan-wildmutation.png", - "Spawn Banelings (Kerrigan Tier 4)": github_icon_base_url + "blizzard/abilityicon_spawnbanelings_square.png", - "Mend (Kerrigan Tier 4)": github_icon_base_url + "blizzard/btn-ability-zerg-transfusion-color.png", - "Infest Broodlings (Kerrigan Tier 6)": github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png", - "Fury (Kerrigan Tier 6)": github_icon_base_url + "blizzard/btn-ability-kerrigan-fury.png", - "Ability Efficiency (Kerrigan Tier 6)": github_icon_base_url + "blizzard/btn-ability-kerrigan-abilityefficiency.png", - "Apocalypse (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-ability-kerrigan-apocalypse.png", - "Spawn Leviathan (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-unit-zerg-leviathan.png", - "Drop-Pods (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-ability-kerrigan-droppods.png", - - "Protoss Ground Weapon Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel1.png", - "Protoss Ground Weapon Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel2.png", - "Protoss Ground Weapon Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel3.png", - "Protoss Ground Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel1.png", - "Protoss Ground Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel2.png", - "Protoss Ground Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel3.png", - "Protoss Shields Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Protoss Shields Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel2.png", - "Protoss Shields Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel3.png", - "Protoss Air Weapon Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel1.png", - "Protoss Air Weapon Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel2.png", - "Protoss Air Weapon Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png", - "Protoss Air Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel1.png", - "Protoss Air Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png", - "Protoss Air Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel3.png", - - "Quatro": github_icon_base_url + "blizzard/btn-progression-protoss-fenix-6-forgeresearch.png", - - "Photon Cannon": github_icon_base_url + "blizzard/btn-building-protoss-photoncannon.png", - "Khaydarin Monolith": github_icon_base_url + "blizzard/btn-unit-protoss-khaydarinmonolith.png", - "Shield Battery": github_icon_base_url + "blizzard/btn-building-protoss-shieldbattery.png", - - "Enhanced Targeting": github_icon_base_url + "blizzard/btn-upgrade-karax-turretrange.png", - "Optimized Ordnance": github_icon_base_url + "blizzard/btn-upgrade-karax-turretattackspeed.png", - "Khalai Ingenuity": github_icon_base_url + "blizzard/btn-upgrade-karax-pylonwarpininstantly.png", - "Orbital Assimilators": github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalassimilator.png", - "Amplified Assimilators": github_icon_base_url + "original/btn-research-terran-microfiltering.png", - "Warp Harmonization": github_icon_base_url + "blizzard/btn-ability-spearofadun-warpharmonization.png", - "Superior Warp Gates": github_icon_base_url + "blizzard/talent-artanis-level03-warpgatecharges.png", - "Nexus Overcharge": github_icon_base_url + "blizzard/btn-ability-spearofadun-nexusovercharge.png", - - "Zealot": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-aiur.png", - "Centurion": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-nerazim.png", - "Sentinel": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-purifier.png", - "Supplicant": github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-supplicant.png", - "Sentry": github_icon_base_url + "blizzard/btn-unit-protoss-sentry.png", - "Energizer": github_icon_base_url + "blizzard/btn-unit-protoss-sentry-purifier.png", - "Havoc": github_icon_base_url + "blizzard/btn-unit-protoss-sentry-taldarim.png", - "Stalker": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Icon_Protoss_Stalker.jpg", - "Instigator": github_icon_base_url + "blizzard/btn-unit-protoss-stalker-purifier.png", - "Slayer": github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-stalker.png", - "Dragoon": github_icon_base_url + "blizzard/btn-unit-protoss-dragoon-void.png", - "Adept": github_icon_base_url + "blizzard/btn-unit-protoss-adept-purifier.png", - "High Templar": "https://static.wikia.nocookie.net/starcraft/images/a/a0/Icon_Protoss_High_Templar.jpg", - "Signifier": github_icon_base_url + "original/btn-unit-protoss-hightemplar-nerazim.png", - "Ascendant": github_icon_base_url + "blizzard/btn-unit-protoss-hightemplar-taldarim.png", - "Dark Archon": github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png", - "Dark Templar": "https://static.wikia.nocookie.net/starcraft/images/9/90/Icon_Protoss_Dark_Templar.jpg", - "Avenger": github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-aiur.png", - "Blood Hunter": github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-taldarim.png", - - "Leg Enhancements (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png", - "Shield Capacity (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Blood Shield (Supplicant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantarmor.png", - "Soul Augmentation (Supplicant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantextrashields.png", - "Shield Regeneration (Supplicant)": github_icon_base_url + "blizzard/btn-ability-protoss-voidarmor.png", - "Force Field (Sentry)": github_icon_base_url + "blizzard/btn-ability-protoss-forcefield-color.png", - "Hallucination (Sentry)": github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png", - "Reclamation (Energizer)": github_icon_base_url + "blizzard/btn-ability-protoss-reclamation.png", - "Forged Chassis (Energizer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel0.png", - "Detect Weakness (Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-havoctargetlockbuffed.png", - "Bloodshard Resonance (Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-rangeincrease.png", - "Cloaking Module (Sentry/Energizer/Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-permanentcloak.png", - "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)": github_icon_base_url + "blizzard/btn-upgrade-karax-energyregen200.png", - "Disintegrating Particles (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png", - "Particle Reflection (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adeptchampionbounceattack.png", - "High Impact Phase Disruptor (Dragoon)": github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png", - "Trillic Compression System (Dragoon)": github_icon_base_url + "blizzard/btn-ability-protoss-dragoonchassis.png", - "Singularity Charge (Dragoon)": github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png", - "Enhanced Strider Servos (Dragoon)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Shockwave (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adept-recochetglaiveupgraded.png", - "Resonating Glaives (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-resonatingglaives.png", - "Phase Bulwark (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png", - "Unshackled Psionic Storm (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-ability-protoss-psistorm.png", - "Hallucination (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png", - "Khaydarin Amulet (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-upgrade-protoss-khaydarinamulet.png", - "High Archon (Archon)": github_icon_base_url + "blizzard/btn-upgrade-artanis-healingpsionicstorm.png", - "Power Overwhelming (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendantspermanentlybetter.png", - "Chaotic Attunement (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendant'spsiorbtravelsfurther.png", - "Blood Amulet (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png", - "Feedback (Dark Archon)": github_icon_base_url + "blizzard/btn-ability-protoss-feedback-color.png", - "Maelstrom (Dark Archon)": github_icon_base_url + "blizzard/btn-ability-protoss-voidstasis.png", - "Argus Talisman (Dark Archon)": github_icon_base_url + "original/btn-upgrade-protoss-argustalisman@scbw.png", - "Dark Archon Meld (Dark Templar)": github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png", - "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/talent-vorazun-level01-shadowstalk.png", - "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png", - "Blink (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-protoss-shadowdash.png", - "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Warp Prism": github_icon_base_url + "blizzard/btn-unit-protoss-warpprism.png", - "Immortal": "https://static.wikia.nocookie.net/starcraft/images/c/c1/Icon_Protoss_Immortal.jpg", - "Annihilator": github_icon_base_url + "blizzard/btn-unit-protoss-immortal-nerazim.png", - "Vanguard": github_icon_base_url + "blizzard/btn-unit-protoss-immortal-taldarim.png", - "Colossus": github_icon_base_url + "blizzard/btn-unit-protoss-colossus-purifier.png", - "Wrathwalker": github_icon_base_url + "blizzard/btn-unit-protoss-colossus-taldarim.png", - "Observer": github_icon_base_url + "blizzard/btn-unit-protoss-observer.png", - "Reaver": github_icon_base_url + "blizzard/btn-unit-protoss-reaver.png", - "Disruptor": github_icon_base_url + "blizzard/btn-unit-protoss-disruptor.png", - - "Gravitic Drive (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticdrive.png", - "Phase Blaster (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png", - "War Configuration (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-graviticdrive.png", - "Singularity Charge (Immortal/Annihilator)": github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png", - "Advanced Targeting Mechanics (Immortal/Annihilator)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Agony Launchers (Vanguard)": github_icon_base_url + "blizzard/btn-upgrade-protoss-vanguard-aoeradiusincreased.png", - "Matter Dispersion (Vanguard)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Pacification Protocol (Colossus)": github_icon_base_url + "blizzard/btn-ability-protoss-chargedblast.png", - "Rapid Power Cycling (Wrathwalker)": github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png", - "Eye of Wrath (Wrathwalker)": github_icon_base_url + "blizzard/btn-upgrade-protoss-extendedthermallance.png", - "Gravitic Boosters (Observer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png", - "Sensor Array (Observer)": github_icon_base_url + "blizzard/btn-ability-zeratul-observer-sensorarray.png", - "Scarab Damage (Reaver)": github_icon_base_url + "blizzard/btn-ability-protoss-scarabshot.png", - "Solarite Payload (Reaver)": github_icon_base_url + "blizzard/btn-upgrade-artanis-scarabsplashradius.png", - "Reaver Capacity (Reaver)": github_icon_base_url + "original/btn-upgrade-protoss-increasedscarabcapacity@scbw.png", - "Resource Efficiency (Reaver)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Phoenix": "https://static.wikia.nocookie.net/starcraft/images/b/b1/Icon_Protoss_Phoenix.jpg", - "Mirage": github_icon_base_url + "blizzard/btn-unit-protoss-phoenix-purifier.png", - "Corsair": github_icon_base_url + "blizzard/btn-unit-protoss-corsair.png", - "Destroyer": github_icon_base_url + "blizzard/btn-unit-protoss-voidray-taldarim.png", - "Void Ray": github_icon_base_url + "blizzard/btn-unit-protoss-voidray-nerazim.png", - "Carrier": "https://static.wikia.nocookie.net/starcraft/images/2/2c/Icon_Protoss_Carrier.jpg", - "Scout": github_icon_base_url + "original/btn-unit-protoss-scout.png", - "Tempest": github_icon_base_url + "blizzard/btn-unit-protoss-tempest-purifier.png", - "Mothership": github_icon_base_url + "blizzard/btn-unit-protoss-mothership-taldarim.png", - "Arbiter": github_icon_base_url + "blizzard/btn-unit-protoss-arbiter.png", - "Oracle": github_icon_base_url + "blizzard/btn-unit-protoss-oracle.png", - - "Ionic Wavelength Flux (Phoenix/Mirage)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png", - "Anion Pulse-Crystals (Phoenix/Mirage)": github_icon_base_url + "blizzard/btn-upgrade-protoss-phoenixrange.png", - "Stealth Drive (Corsair)": github_icon_base_url + "blizzard/btn-upgrade-vorazun-corsairpermanentlycloaked.png", - "Argus Jewel (Corsair)": github_icon_base_url + "blizzard/btn-ability-protoss-stasistrap.png", - "Sustaining Disruption (Corsair)": github_icon_base_url + "blizzard/btn-ability-protoss-disruptionweb.png", - "Neutron Shields (Corsair)": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Reforged Bloodshard Core (Destroyer)": github_icon_base_url + "blizzard/btn-amonshardsarmor.png", - "Flux Vanes (Void Ray/Destroyer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fluxvanes.png", - "Graviton Catapult (Carrier)": github_icon_base_url + "blizzard/btn-upgrade-protoss-gravitoncatapult.png", - "Hull of Past Glories (Carrier)": github_icon_base_url + "blizzard/btn-progression-protoss-fenix-14-colossusandcarrierchampionsresearch.png", - "Combat Sensor Array (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-scoutchampionrange.png", - "Apial Sensors (Scout)": github_icon_base_url + "blizzard/btn-upgrade-tychus-detection.png", - "Gravitic Thrusters (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png", - "Advanced Photon Blasters (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png", - "Tectonic Destabilizers (Tempest)": github_icon_base_url + "blizzard/btn-ability-protoss-disruptionblast.png", - "Quantic Reactor (Tempest)": github_icon_base_url + "blizzard/btn-upgrade-protoss-researchgravitysling.png", - "Gravity Sling (Tempest)": github_icon_base_url + "blizzard/btn-upgrade-protoss-tectonicdisruptors.png", - "Chronostatic Reinforcement (Arbiter)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png", - "Khaydarin Core (Arbiter)": github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png", - "Spacetime Anchor (Arbiter)": github_icon_base_url + "blizzard/btn-ability-protoss-stasisfield.png", - "Resource Efficiency (Arbiter)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Enhanced Cloak Field (Arbiter)": github_icon_base_url + "blizzard/btn-ability-stetmann-stetzonegenerator-speed.png", - "Stealth Drive (Oracle)": github_icon_base_url + "blizzard/btn-upgrade-vorazun-oraclepermanentlycloaked.png", - "Stasis Calibration (Oracle)": github_icon_base_url + "blizzard/btn-ability-protoss-oracle-stasiscalibration.png", - "Temporal Acceleration Beam (Oracle)": github_icon_base_url + "blizzard/btn-ability-protoss-oraclepulsarcannonon.png", - - "Matrix Overload": github_icon_base_url + "blizzard/btn-ability-spearofadun-matrixoverload.png", - "Guardian Shell": github_icon_base_url + "blizzard/btn-ability-spearofadun-guardianshell.png", - - "Chrono Surge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-chronosurge.png", - "Proxy Pylon (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-deploypylon.png", - "Warp In Reinforcements (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-warpinreinforcements.png", - "Pylon Overcharge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-protoss-purify.png", - "Orbital Strike (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalstrike.png", - "Temporal Field (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-temporalfield.png", - "Solar Lance (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-solarlance.png", - "Mass Recall (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-massrecall.png", - "Shield Overcharge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-shieldovercharge.png", - "Deploy Fenix (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-unit-protoss-fenix.png", - "Purifier Beam (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-purifierbeam.png", - "Time Stop (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-timestop.png", - "Solar Bombardment (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-solarbombardment.png", - - "Reconstruction Beam (Spear of Adun Auto-Cast)": github_icon_base_url + "blizzard/btn-ability-spearofadun-reconstructionbeam.png", - "Overwatch (Spear of Adun Auto-Cast)": github_icon_base_url + "blizzard/btn-ability-zeratul-chargedcrystal-psionicwinds.png", - - "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), - "All-In": range(SC2WOL_LOC_ID_OFFSET + 2900, SC2WOL_LOC_ID_OFFSET + 3000), - - "Lab Rat": range(SC2HOTS_LOC_ID_OFFSET + 100, SC2HOTS_LOC_ID_OFFSET + 200), - "Back in the Saddle": range(SC2HOTS_LOC_ID_OFFSET + 200, SC2HOTS_LOC_ID_OFFSET + 300), - "Rendezvous": range(SC2HOTS_LOC_ID_OFFSET + 300, SC2HOTS_LOC_ID_OFFSET + 400), - "Harvest of Screams": range(SC2HOTS_LOC_ID_OFFSET + 400, SC2HOTS_LOC_ID_OFFSET + 500), - "Shoot the Messenger": range(SC2HOTS_LOC_ID_OFFSET + 500, SC2HOTS_LOC_ID_OFFSET + 600), - "Enemy Within": range(SC2HOTS_LOC_ID_OFFSET + 600, SC2HOTS_LOC_ID_OFFSET + 700), - "Domination": range(SC2HOTS_LOC_ID_OFFSET + 700, SC2HOTS_LOC_ID_OFFSET + 800), - "Fire in the Sky": range(SC2HOTS_LOC_ID_OFFSET + 800, SC2HOTS_LOC_ID_OFFSET + 900), - "Old Soldiers": range(SC2HOTS_LOC_ID_OFFSET + 900, SC2HOTS_LOC_ID_OFFSET + 1000), - "Waking the Ancient": range(SC2HOTS_LOC_ID_OFFSET + 1000, SC2HOTS_LOC_ID_OFFSET + 1100), - "The Crucible": range(SC2HOTS_LOC_ID_OFFSET + 1100, SC2HOTS_LOC_ID_OFFSET + 1200), - "Supreme": range(SC2HOTS_LOC_ID_OFFSET + 1200, SC2HOTS_LOC_ID_OFFSET + 1300), - "Infested": range(SC2HOTS_LOC_ID_OFFSET + 1300, SC2HOTS_LOC_ID_OFFSET + 1400), - "Hand of Darkness": range(SC2HOTS_LOC_ID_OFFSET + 1400, SC2HOTS_LOC_ID_OFFSET + 1500), - "Phantoms of the Void": range(SC2HOTS_LOC_ID_OFFSET + 1500, SC2HOTS_LOC_ID_OFFSET + 1600), - "With Friends Like These": range(SC2HOTS_LOC_ID_OFFSET + 1600, SC2HOTS_LOC_ID_OFFSET + 1700), - "Conviction": range(SC2HOTS_LOC_ID_OFFSET + 1700, SC2HOTS_LOC_ID_OFFSET + 1800), - "Planetfall": range(SC2HOTS_LOC_ID_OFFSET + 1800, SC2HOTS_LOC_ID_OFFSET + 1900), - "Death From Above": range(SC2HOTS_LOC_ID_OFFSET + 1900, SC2HOTS_LOC_ID_OFFSET + 2000), - "The Reckoning": range(SC2HOTS_LOC_ID_OFFSET + 2000, SC2HOTS_LOC_ID_OFFSET + 2100), - - "Dark Whispers": range(SC2LOTV_LOC_ID_OFFSET + 100, SC2LOTV_LOC_ID_OFFSET + 200), - "Ghosts in the Fog": range(SC2LOTV_LOC_ID_OFFSET + 200, SC2LOTV_LOC_ID_OFFSET + 300), - "Evil Awoken": range(SC2LOTV_LOC_ID_OFFSET + 300, SC2LOTV_LOC_ID_OFFSET + 400), - - "For Aiur!": range(SC2LOTV_LOC_ID_OFFSET + 400, SC2LOTV_LOC_ID_OFFSET + 500), - "The Growing Shadow": range(SC2LOTV_LOC_ID_OFFSET + 500, SC2LOTV_LOC_ID_OFFSET + 600), - "The Spear of Adun": range(SC2LOTV_LOC_ID_OFFSET + 600, SC2LOTV_LOC_ID_OFFSET + 700), - "Sky Shield": range(SC2LOTV_LOC_ID_OFFSET + 700, SC2LOTV_LOC_ID_OFFSET + 800), - "Brothers in Arms": range(SC2LOTV_LOC_ID_OFFSET + 800, SC2LOTV_LOC_ID_OFFSET + 900), - "Amon's Reach": range(SC2LOTV_LOC_ID_OFFSET + 900, SC2LOTV_LOC_ID_OFFSET + 1000), - "Last Stand": range(SC2LOTV_LOC_ID_OFFSET + 1000, SC2LOTV_LOC_ID_OFFSET + 1100), - "Forbidden Weapon": range(SC2LOTV_LOC_ID_OFFSET + 1100, SC2LOTV_LOC_ID_OFFSET + 1200), - "Temple of Unification": range(SC2LOTV_LOC_ID_OFFSET + 1200, SC2LOTV_LOC_ID_OFFSET + 1300), - "The Infinite Cycle": range(SC2LOTV_LOC_ID_OFFSET + 1300, SC2LOTV_LOC_ID_OFFSET + 1400), - "Harbinger of Oblivion": range(SC2LOTV_LOC_ID_OFFSET + 1400, SC2LOTV_LOC_ID_OFFSET + 1500), - "Unsealing the Past": range(SC2LOTV_LOC_ID_OFFSET + 1500, SC2LOTV_LOC_ID_OFFSET + 1600), - "Purification": range(SC2LOTV_LOC_ID_OFFSET + 1600, SC2LOTV_LOC_ID_OFFSET + 1700), - "Steps of the Rite": range(SC2LOTV_LOC_ID_OFFSET + 1700, SC2LOTV_LOC_ID_OFFSET + 1800), - "Rak'Shir": range(SC2LOTV_LOC_ID_OFFSET + 1800, SC2LOTV_LOC_ID_OFFSET + 1900), - "Templar's Charge": range(SC2LOTV_LOC_ID_OFFSET + 1900, SC2LOTV_LOC_ID_OFFSET + 2000), - "Templar's Return": range(SC2LOTV_LOC_ID_OFFSET + 2000, SC2LOTV_LOC_ID_OFFSET + 2100), - "The Host": range(SC2LOTV_LOC_ID_OFFSET + 2100, SC2LOTV_LOC_ID_OFFSET + 2200), - "Salvation": range(SC2LOTV_LOC_ID_OFFSET + 2200, SC2LOTV_LOC_ID_OFFSET + 2300), - - "Into the Void": range(SC2LOTV_LOC_ID_OFFSET + 2300, SC2LOTV_LOC_ID_OFFSET + 2400), - "The Essence of Eternity": range(SC2LOTV_LOC_ID_OFFSET + 2400, SC2LOTV_LOC_ID_OFFSET + 2500), - "Amon's Fall": range(SC2LOTV_LOC_ID_OFFSET + 2500, SC2LOTV_LOC_ID_OFFSET + 2600), - - "The Escape": range(SC2NCO_LOC_ID_OFFSET + 100, SC2NCO_LOC_ID_OFFSET + 200), - "Sudden Strike": range(SC2NCO_LOC_ID_OFFSET + 200, SC2NCO_LOC_ID_OFFSET + 300), - "Enemy Intelligence": range(SC2NCO_LOC_ID_OFFSET + 300, SC2NCO_LOC_ID_OFFSET + 400), - "Trouble In Paradise": range(SC2NCO_LOC_ID_OFFSET + 400, SC2NCO_LOC_ID_OFFSET + 500), - "Night Terrors": range(SC2NCO_LOC_ID_OFFSET + 500, SC2NCO_LOC_ID_OFFSET + 600), - "Flashpoint": range(SC2NCO_LOC_ID_OFFSET + 600, SC2NCO_LOC_ID_OFFSET + 700), - "In the Enemy's Shadow": range(SC2NCO_LOC_ID_OFFSET + 700, SC2NCO_LOC_ID_OFFSET + 800), - "Dark Skies": range(SC2NCO_LOC_ID_OFFSET + 800, SC2NCO_LOC_ID_OFFSET + 900), - "End Game": range(SC2NCO_LOC_ID_OFFSET + 900, SC2NCO_LOC_ID_OFFSET + 1000), - } + inventory: collections.Counter[int] = tracker_data.get_player_inventory_counts(team, player) + item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"] + location_id_to_name = tracker_data.location_id_to_name["Starcraft 2"] + # Filler item counters display_data = {} - - # Grouped Items - grouped_item_ids = { - "Progressive Terran Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Weapon Upgrade": 105 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Armor Upgrade": 106 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Upgrade": 107 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Upgrade": 108 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Weapon/Armor Upgrade": 109 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Weapon Upgrade": 105 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Armor Upgrade": 106 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Upgrade": 107 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Upgrade": 108 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Weapon/Armor Upgrade": 109 + SC2LOTV_ITEM_ID_OFFSET, - } - grouped_item_replacements = { - "Progressive Terran Weapon Upgrade": ["Progressive Terran Infantry Weapon", - "Progressive Terran Vehicle Weapon", - "Progressive Terran Ship Weapon"], - "Progressive Terran Armor Upgrade": ["Progressive Terran Infantry Armor", - "Progressive Terran Vehicle Armor", - "Progressive Terran Ship Armor"], - "Progressive Terran Infantry Upgrade": ["Progressive Terran Infantry Weapon", - "Progressive Terran Infantry Armor"], - "Progressive Terran Vehicle Upgrade": ["Progressive Terran Vehicle Weapon", - "Progressive Terran Vehicle Armor"], - "Progressive Terran Ship Upgrade": ["Progressive Terran Ship Weapon", "Progressive Terran Ship Armor"], - "Progressive Zerg Weapon Upgrade": ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack", - "Progressive Zerg Flyer Attack"], - "Progressive Zerg Armor Upgrade": ["Progressive Zerg Ground Carapace", - "Progressive Zerg Flyer Carapace"], - "Progressive Zerg Ground Upgrade": ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack", - "Progressive Zerg Ground Carapace"], - "Progressive Zerg Flyer Upgrade": ["Progressive Zerg Flyer Attack", "Progressive Zerg Flyer Carapace"], - "Progressive Protoss Weapon Upgrade": ["Progressive Protoss Ground Weapon", - "Progressive Protoss Air Weapon"], - "Progressive Protoss Armor Upgrade": ["Progressive Protoss Ground Armor", "Progressive Protoss Shields", - "Progressive Protoss Air Armor"], - "Progressive Protoss Ground Upgrade": ["Progressive Protoss Ground Weapon", - "Progressive Protoss Ground Armor", - "Progressive Protoss Shields"], - "Progressive Protoss Air Upgrade": ["Progressive Protoss Air Weapon", "Progressive Protoss Air Armor", - "Progressive Protoss Shields"] - } - grouped_item_replacements["Progressive Terran Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Terran Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Terran Armor Upgrade"] - grouped_item_replacements["Progressive Zerg Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Zerg Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Zerg Armor Upgrade"] - grouped_item_replacements["Progressive Protoss Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Protoss Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Protoss Armor Upgrade"] - replacement_item_ids = { - "Progressive Terran Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Melee Attack": 100 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Missile Attack": 101 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Carapace": 102 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Attack": 103 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Carapace": 104 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Ground Weapon": 100 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Armor": 101 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Shields": 102 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Weapon": 103 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Armor": 104 + SC2LOTV_ITEM_ID_OFFSET, - } - - inventory: collections.Counter = 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] - if replacement_id not in inventory or count > inventory[replacement_id]: - # If two groups provide the same individual item, maximum is used - # (this behavior is used for Protoss Shields) - inventory[replacement_id] = count - - # Determine display for progressive items - progressive_items = { - "Progressive Terran Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Fire-Suppression System": 206 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Orbital Command": 207 + 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 Replenishable Magazine (Vulture)": 303 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Tri-Lithium Power Cell (Diamondback)": 306 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Tomahawk Power Cells (Wraith)": 312 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Missile Pods (Battlecruiser)": 318 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Defensive Matrix (Battlecruiser)": 319 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Immortality Protocol (Thor)": 325 + SC2WOL_ITEM_ID_OFFSET, - "Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Augmented Thrusters (Planetary Fortress)": 388 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stealth Suit Module (Nova Suit Module)": 904 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Melee Attack": 100 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Missile Attack": 101 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Carapace": 102 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Attack": 103 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Carapace": 104 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Ground Weapon": 100 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Armor": 101 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Shields": 102 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Weapon": 103 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Armor": 104 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Proxy Pylon (Spear of Adun Calldown)": 701 + SC2LOTV_ITEM_ID_OFFSET, - } - # Format: L0, L1, L2, L3 - progressive_names = { - "Progressive Terran Infantry Weapon": ["Terran Infantry Weapons Level 1", - "Terran Infantry Weapons Level 1", - "Terran Infantry Weapons Level 2", - "Terran Infantry Weapons Level 3"], - "Progressive Terran Infantry Armor": ["Terran Infantry Armor Level 1", - "Terran Infantry Armor Level 1", - "Terran Infantry Armor Level 2", - "Terran Infantry Armor Level 3"], - "Progressive Terran Vehicle Weapon": ["Terran Vehicle Weapons Level 1", - "Terran Vehicle Weapons Level 1", - "Terran Vehicle Weapons Level 2", - "Terran Vehicle Weapons Level 3"], - "Progressive Terran Vehicle Armor": ["Terran Vehicle Armor Level 1", - "Terran Vehicle Armor Level 1", - "Terran Vehicle Armor Level 2", - "Terran Vehicle Armor Level 3"], - "Progressive Terran Ship Weapon": ["Terran Ship Weapons Level 1", - "Terran Ship Weapons Level 1", - "Terran Ship Weapons Level 2", - "Terran Ship Weapons Level 3"], - "Progressive Terran Ship Armor": ["Terran Ship Armor Level 1", - "Terran Ship Armor Level 1", - "Terran Ship Armor Level 2", - "Terran Ship Armor Level 3"], - "Progressive Fire-Suppression System": ["Fire-Suppression System Level 1", - "Fire-Suppression System Level 1", - "Fire-Suppression System Level 2"], - "Progressive Orbital Command": ["Orbital Command", "Orbital Command", - "Planetary Command Module"], - "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 Replenishable Magazine (Vulture)": ["Replenishable Magazine (Vulture)", - "Replenishable Magazine (Vulture)", - "Replenishable Magazine (Free) (Vulture)"], - "Progressive Tri-Lithium Power Cell (Diamondback)": ["Tri-Lithium Power Cell (Diamondback)", - "Tri-Lithium Power Cell (Diamondback)", - "Tungsten Spikes (Diamondback)"], - "Progressive Tomahawk Power Cells (Wraith)": ["Tomahawk Power Cells (Wraith)", - "Tomahawk Power Cells (Wraith)", - "Unregistered Cloaking Module (Wraith)"], - "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", - "Cross-Spectrum Dampeners (Banshee)", - "Advanced Cross-Spectrum Dampeners (Banshee)"], - "Progressive Missile Pods (Battlecruiser)": ["Missile Pods (Battlecruiser) Level 1", - "Missile Pods (Battlecruiser) Level 1", - "Missile Pods (Battlecruiser) Level 2"], - "Progressive Defensive Matrix (Battlecruiser)": ["Defensive Matrix (Battlecruiser)", - "Defensive Matrix (Battlecruiser)", - "Advanced Defensive Matrix (Battlecruiser)"], - "Progressive Immortality Protocol (Thor)": ["Immortality Protocol (Thor)", - "Immortality Protocol (Thor)", - "Immortality Protocol (Free) (Thor)"], - "Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", - "High Impact Payload (Thor)", "Smart Servos (Thor)"], - "Progressive Augmented Thrusters (Planetary Fortress)": ["Lift Off (Planetary Fortress)", - "Lift Off (Planetary Fortress)", - "Armament Stabilizers (Planetary Fortress)"], - "Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", - "Regenerative Bio-Steel Level 1", - "Regenerative Bio-Steel Level 2", - "Regenerative Bio-Steel Level 3"], - "Progressive Stealth Suit Module (Nova Suit Module)": ["Stealth Suit Module (Nova Suit Module)", - "Cloak (Nova Suit Module)", - "Permanently Cloaked (Nova Suit Module)"], - "Progressive Zerg Melee Attack": ["Zerg Melee Attack Level 1", - "Zerg Melee Attack Level 1", - "Zerg Melee Attack Level 2", - "Zerg Melee Attack Level 3"], - "Progressive Zerg Missile Attack": ["Zerg Missile Attack Level 1", - "Zerg Missile Attack Level 1", - "Zerg Missile Attack Level 2", - "Zerg Missile Attack Level 3"], - "Progressive Zerg Ground Carapace": ["Zerg Ground Carapace Level 1", - "Zerg Ground Carapace Level 1", - "Zerg Ground Carapace Level 2", - "Zerg Ground Carapace Level 3"], - "Progressive Zerg Flyer Attack": ["Zerg Flyer Attack Level 1", - "Zerg Flyer Attack Level 1", - "Zerg Flyer Attack Level 2", - "Zerg Flyer Attack Level 3"], - "Progressive Zerg Flyer Carapace": ["Zerg Flyer Carapace Level 1", - "Zerg Flyer Carapace Level 1", - "Zerg Flyer Carapace Level 2", - "Zerg Flyer Carapace Level 3"], - "Progressive Protoss Ground Weapon": ["Protoss Ground Weapon Level 1", - "Protoss Ground Weapon Level 1", - "Protoss Ground Weapon Level 2", - "Protoss Ground Weapon Level 3"], - "Progressive Protoss Ground Armor": ["Protoss Ground Armor Level 1", - "Protoss Ground Armor Level 1", - "Protoss Ground Armor Level 2", - "Protoss Ground Armor Level 3"], - "Progressive Protoss Shields": ["Protoss Shields Level 1", "Protoss Shields Level 1", - "Protoss Shields Level 2", "Protoss Shields Level 3"], - "Progressive Protoss Air Weapon": ["Protoss Air Weapon Level 1", - "Protoss Air Weapon Level 1", - "Protoss Air Weapon Level 2", - "Protoss Air Weapon Level 3"], - "Progressive Protoss Air Armor": ["Protoss Air Armor Level 1", - "Protoss Air Armor Level 1", - "Protoss Air Armor Level 2", - "Protoss Air Armor Level 3"], - "Progressive Proxy Pylon (Spear of Adun Calldown)": ["Proxy Pylon (Spear of Adun Calldown)", - "Proxy Pylon (Spear of Adun Calldown)", - "Warp In Reinforcements (Spear of Adun Calldown)"] - } - 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] if display_name in icons else "FIXME" - display_data[base_name + "_name"] = display_name - - # Multi-items - multi_items = { - "Additional Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET, - "Additional Starting Vespene": 801 + SC2WOL_ITEM_ID_OFFSET, - "Additional 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 * starting_supply_per_item - elif base_name == "minerals": - count = count * minerals_per_item - elif base_name == "vespene": - count = count * vespene_per_item - display_data[base_name + "_count"] = count - # Kerrigan level - level_items = { - "1 Kerrigan Level": 509 + SC2HOTS_ITEM_ID_OFFSET, - "2 Kerrigan Levels": 508 + SC2HOTS_ITEM_ID_OFFSET, - "3 Kerrigan Levels": 507 + SC2HOTS_ITEM_ID_OFFSET, - "4 Kerrigan Levels": 506 + SC2HOTS_ITEM_ID_OFFSET, - "5 Kerrigan Levels": 505 + SC2HOTS_ITEM_ID_OFFSET, - "6 Kerrigan Levels": 504 + SC2HOTS_ITEM_ID_OFFSET, - "7 Kerrigan Levels": 503 + SC2HOTS_ITEM_ID_OFFSET, - "8 Kerrigan Levels": 502 + SC2HOTS_ITEM_ID_OFFSET, - "9 Kerrigan Levels": 501 + SC2HOTS_ITEM_ID_OFFSET, - "10 Kerrigan Levels": 500 + SC2HOTS_ITEM_ID_OFFSET, - "14 Kerrigan Levels": 510 + SC2HOTS_ITEM_ID_OFFSET, - "35 Kerrigan Levels": 511 + SC2HOTS_ITEM_ID_OFFSET, - "70 Kerrigan Levels": 512 + SC2HOTS_ITEM_ID_OFFSET, - } - level_amounts = { - "1 Kerrigan Level": 1, - "2 Kerrigan Levels": 2, - "3 Kerrigan Levels": 3, - "4 Kerrigan Levels": 4, - "5 Kerrigan Levels": 5, - "6 Kerrigan Levels": 6, - "7 Kerrigan Levels": 7, - "8 Kerrigan Levels": 8, - "9 Kerrigan Levels": 9, - "10 Kerrigan Levels": 10, - "14 Kerrigan Levels": 14, - "35 Kerrigan Levels": 35, - "70 Kerrigan Levels": 70, - } - kerrigan_level = 0 - for item_name, item_id in level_items.items(): - count = inventory[item_id] - amount = level_amounts[item_name] - kerrigan_level += count * amount - display_data["kerrigan_level"] = kerrigan_level - - # 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 + display_data["minerals_count"] = slot_data.get("minerals_per_item", 15) * inventory.get(STARTING_MINERALS_ITEM_ID, 0) + display_data["vespene_count"] = slot_data.get("vespene_per_item", 15) * inventory.get(STARTING_VESPENE_ITEM_ID, 0) + display_data["supply_count"] = slot_data.get("starting_supply_per_item", 2) * inventory.get(STARTING_SUPPLY_ITEM_ID, 0) + display_data["max_supply_count"] = slot_data.get("maximum_supply_per_item", 1) * inventory.get(MAX_SUPPLY_ITEM_ID, 0) + display_data["reduced_supply_count"] = slot_data.get("maximum_supply_reduction_per_item", 1) * inventory.get(REDUCED_MAX_SUPPLY_ITEM_ID, 0) + display_data["construction_speed_count"] = inventory.get(BUILDING_CONSTRUCTION_SPEED_ITEM_ID, 0) + display_data["shield_regen_count"] = inventory.get(SHIELD_REGENERATION_ITEM_ID, 0) + display_data["upgrade_speed_count"] = inventory.get(UPGRADE_RESEARCH_SPEED_ITEM_ID, 0) + display_data["research_cost_count"] = inventory.get(UPGRADE_RESEARCH_COST_ITEM_ID, 0) + + # Locations + have_nco_locations = False 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"][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()) + missions: dict[str, list[tuple[str, bool]]] = {} + for location_id in locations: + location_name = location_id_to_name.get(location_id, "") + if ":" not in location_name: + continue + mission_name = location_name.split(":", 1)[0] + missions.setdefault(mission_name, []).append((location_name, location_id in checked_locations)) + if location_id >= NCO_LOCATION_ID_LOW and location_id < NCO_LOCATION_ID_HIGH: + have_nco_locations = True + missions = {mission: missions[mission] for mission in sorted(missions)} + + # Kerrigan level + level_item_id_to_amount = ( + (509 + SC2HOTS_ITEM_ID_OFFSET, 1,), + (508 + SC2HOTS_ITEM_ID_OFFSET, 2,), + (507 + SC2HOTS_ITEM_ID_OFFSET, 3,), + (506 + SC2HOTS_ITEM_ID_OFFSET, 4,), + (505 + SC2HOTS_ITEM_ID_OFFSET, 5,), + (504 + SC2HOTS_ITEM_ID_OFFSET, 6,), + (503 + SC2HOTS_ITEM_ID_OFFSET, 7,), + (502 + SC2HOTS_ITEM_ID_OFFSET, 8,), + (501 + SC2HOTS_ITEM_ID_OFFSET, 9,), + (500 + SC2HOTS_ITEM_ID_OFFSET, 10,), + (510 + SC2HOTS_ITEM_ID_OFFSET, 14,), + (511 + SC2HOTS_ITEM_ID_OFFSET, 35,), + (512 + SC2HOTS_ITEM_ID_OFFSET, 70,), + ) + kerrigan_level = 0 + for item_id, levels_per_item in level_item_id_to_amount: + kerrigan_level += levels_per_item * inventory[item_id] + display_data["kerrigan_level"] = kerrigan_level + + # Hero presence + display_data["kerrigan_present"] = slot_data.get("kerrigan_presence", 0) == 0 + display_data["nova_present"] = have_nco_locations + + # Upgrades + TERRAN_INFANTRY_WEAPON_ID = 100 + SC2WOL_ITEM_ID_OFFSET + TERRAN_INFANTRY_ARMOR_ID = 102 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_WEAPON_ID = 103 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_ARMOR_ID = 104 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_WEAPON_ID = 105 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_ARMOR_ID = 106 + SC2WOL_ITEM_ID_OFFSET + ZERG_MELEE_ATTACK_ID = 100 + SC2HOTS_ITEM_ID_OFFSET + ZERG_MISSILE_ATTACK_ID = 101 + SC2HOTS_ITEM_ID_OFFSET + ZERG_GROUND_CARAPACE_ID = 102 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_ATTACK_ID = 103 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_CARAPACE_ID = 104 + SC2HOTS_ITEM_ID_OFFSET + PROTOSS_GROUND_WEAPON_ID = 100 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_GROUND_ARMOR_ID = 101 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_SHIELDS_ID = 102 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_WEAPON_ID = 103 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_ARMOR_ID = 104 + SC2LOTV_ITEM_ID_OFFSET + + # Bundles + TERRAN_WEAPON_UPGRADE_ID = 107 + SC2WOL_ITEM_ID_OFFSET + TERRAN_ARMOR_UPGRADE_ID = 108 + SC2WOL_ITEM_ID_OFFSET + TERRAN_INFANTRY_UPGRADE_ID = 109 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_UPGRADE_ID = 110 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_UPGRADE_ID = 111 + SC2WOL_ITEM_ID_OFFSET + TERRAN_WEAPON_ARMOR_UPGRADE_ID = 112 + SC2WOL_ITEM_ID_OFFSET + ZERG_WEAPON_UPGRADE_ID = 105 + SC2HOTS_ITEM_ID_OFFSET + ZERG_ARMOR_UPGRADE_ID = 106 + SC2HOTS_ITEM_ID_OFFSET + ZERG_GROUND_UPGRADE_ID = 107 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_UPGRADE_ID = 108 + SC2HOTS_ITEM_ID_OFFSET + ZERG_WEAPON_ARMOR_UPGRADE_ID = 109 + SC2HOTS_ITEM_ID_OFFSET + PROTOSS_WEAPON_UPGRADE_ID = 105 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_ARMOR_UPGRADE_ID = 106 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_GROUND_UPGRADE_ID = 107 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_UPGRADE_ID = 108 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_WEAPON_ARMOR_UPGRADE_ID = 109 + SC2LOTV_ITEM_ID_OFFSET + grouped_item_replacements = { + TERRAN_WEAPON_UPGRADE_ID: [ + TERRAN_INFANTRY_WEAPON_ID, + TERRAN_VEHICLE_WEAPON_ID, + TERRAN_SHIP_WEAPON_ID, + ], + TERRAN_ARMOR_UPGRADE_ID: [ + TERRAN_INFANTRY_ARMOR_ID, + TERRAN_VEHICLE_ARMOR_ID, + TERRAN_SHIP_ARMOR_ID, + ], + TERRAN_INFANTRY_UPGRADE_ID: [ + TERRAN_INFANTRY_WEAPON_ID, + TERRAN_INFANTRY_ARMOR_ID, + ], + TERRAN_VEHICLE_UPGRADE_ID: [ + TERRAN_VEHICLE_WEAPON_ID, + TERRAN_VEHICLE_ARMOR_ID, + ], + TERRAN_SHIP_UPGRADE_ID: [ + TERRAN_SHIP_WEAPON_ID, + TERRAN_SHIP_ARMOR_ID + ], + ZERG_WEAPON_UPGRADE_ID: [ + ZERG_MELEE_ATTACK_ID, + ZERG_MISSILE_ATTACK_ID, + ZERG_FLYER_ATTACK_ID, + ], + ZERG_ARMOR_UPGRADE_ID: [ + ZERG_GROUND_CARAPACE_ID, + ZERG_FLYER_CARAPACE_ID, + ], + ZERG_GROUND_UPGRADE_ID: [ + ZERG_MELEE_ATTACK_ID, + ZERG_MISSILE_ATTACK_ID, + ZERG_GROUND_CARAPACE_ID, + ], + ZERG_FLYER_UPGRADE_ID: [ + ZERG_FLYER_ATTACK_ID, + ZERG_FLYER_CARAPACE_ID, + ], + PROTOSS_WEAPON_UPGRADE_ID: [ + PROTOSS_GROUND_WEAPON_ID, + PROTOSS_AIR_WEAPON_ID, + ], + PROTOSS_ARMOR_UPGRADE_ID: [ + PROTOSS_GROUND_ARMOR_ID, + PROTOSS_SHIELDS_ID, + PROTOSS_AIR_ARMOR_ID, + ], + PROTOSS_GROUND_UPGRADE_ID: [ + PROTOSS_GROUND_WEAPON_ID, + PROTOSS_GROUND_ARMOR_ID, + PROTOSS_SHIELDS_ID, + ], + PROTOSS_AIR_UPGRADE_ID: [ + PROTOSS_AIR_WEAPON_ID, + PROTOSS_AIR_ARMOR_ID, + PROTOSS_SHIELDS_ID, + ] + } + grouped_item_replacements[TERRAN_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[TERRAN_WEAPON_UPGRADE_ID] + + grouped_item_replacements[TERRAN_ARMOR_UPGRADE_ID] + ) + grouped_item_replacements[ZERG_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[ZERG_WEAPON_UPGRADE_ID] + + grouped_item_replacements[ZERG_ARMOR_UPGRADE_ID] + ) + grouped_item_replacements[PROTOSS_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[PROTOSS_WEAPON_UPGRADE_ID] + + grouped_item_replacements[PROTOSS_ARMOR_UPGRADE_ID] + ) + for bundle_id, upgrade_ids in grouped_item_replacements.items(): + bundle_amount = inventory[bundle_id] + for upgrade_id in upgrade_ids: + if bundle_amount > inventory[upgrade_id]: + # Only assign, don't add. + # This behaviour mimics protoss shields, where the output is + # the maximum bundle contribution, not the sum + inventory[upgrade_id] = bundle_amount + + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == ClientStatus.CLIENT_GOAL + + # Keys + keys: dict[str, int] = {} + for item_id, item_count in inventory.items(): + if item_id < SC2_KEY_ITEM_ID_OFFSET: + continue + keys[item_id_to_name[item_id]] = item_count - lookup_any_item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"] return render_template( "tracker__Starcraft2.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, + missions=missions, + locations=locations, + checked_locations=checked_locations, + location_id_to_name=location_id_to_name, + item_id_to_name=item_id_to_name, + keys=keys, + saving_second=tracker_data.get_room_saving_second(), **display_data, ) + _player_trackers["Starcraft 2"] = render_Starcraft2_tracker diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 06c77ab0..7bd47d0b 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -229,8 +229,6 @@ components: List[Component] = [ Component('Zelda 1 Client', 'Zelda1Client', file_identifier=SuffixIdentifier('.aptloz')), # ChecksFinder Component('ChecksFinder Client', 'ChecksFinderClient'), - # Starcraft 2 - Component('Starcraft 2 Client', 'Starcraft2Client'), # Zillion Component('Zillion Client', 'ZillionClient', file_identifier=SuffixIdentifier('.apzl')), diff --git a/worlds/_sc2common/bot/game_data.py b/worlds/_sc2common/bot/game_data.py index 50f10bd6..ed0edf0b 100644 --- a/worlds/_sc2common/bot/game_data.py +++ b/worlds/_sc2common/bot/game_data.py @@ -19,7 +19,7 @@ class GameData: """ :param data: """ - self.abilities: Dict[int, AbilityData] = {} + self.abilities: Dict[int, AbilityData] = {a.ability_id: AbilityData(self, a) for a in data.abilities if a.available} self.units: Dict[int, UnitTypeData] = {u.unit_id: UnitTypeData(self, u) for u in data.units if u.available} self.upgrades: Dict[int, UpgradeData] = {u.upgrade_id: UpgradeData(self, u) for u in data.upgrades} # Cached UnitTypeIds so that conversion does not take long. This needs to be moved elsewhere if a new GameData object is created multiple times per game @@ -40,7 +40,7 @@ class AbilityData: self._proto = proto # What happens if we comment this out? Should this not be commented out? What is its purpose? - assert self.id != 0 + # assert self.id != 0 # let the world burn def __repr__(self) -> str: return f"AbilityData(name={self._proto.button_name})" diff --git a/worlds/sc2/Client.py b/worlds/sc2/Client.py deleted file mode 100644 index 77b13a5a..00000000 --- a/worlds/sc2/Client.py +++ /dev/null @@ -1,1630 +0,0 @@ -from __future__ import annotations - -import asyncio -import copy -import ctypes -import enum -import inspect -import logging -import multiprocessing -import os.path -import re -import sys -import tempfile -import typing -import queue -import zipfile -import io -import random -import concurrent.futures -from pathlib import Path - -# CommonClient import first to trigger ModuleUpdater -from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser -from Utils import init_logging, is_windows, async_start -from . import ItemNames, Options -from .ItemGroups import item_name_groups -from .Options import ( - MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence, - GameSpeed, GenericUpgradeItems, GenericUpgradeResearch, ColorChoice, GenericUpgradeMissions, - LocationInclusion, ExtraLocations, MasteryLocations, ChallengeLocations, VanillaLocations, - DisableForcedCamera, SkipCutscenes, GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, RequiredTactics, - SpearOfAdunPresence, SpearOfAdunPresentInNoBuild, SpearOfAdunAutonomouslyCastAbilityPresence, - SpearOfAdunAutonomouslyCastPresentInNoBuild -) - - -if __name__ == "__main__": - init_logging("SC2Client", exception_logger="Client") - -logger = logging.getLogger("Client") -sc2_logger = logging.getLogger("Starcraft2") - -import nest_asyncio -from worlds._sc2common import bot -from worlds._sc2common.bot.data import Race -from worlds._sc2common.bot.main import run_game -from worlds._sc2common.bot.player import Bot -from .Items import (lookup_id_to_name, get_full_item_list, ItemData, type_flaggroups, upgrade_numbers, - upgrade_numbers_all) -from .Locations import SC2WOL_LOC_ID_OFFSET, LocationType, SC2HOTS_LOC_ID_OFFSET -from .MissionTables import (lookup_id_to_mission, SC2Campaign, lookup_name_to_mission, - lookup_id_to_campaign, MissionConnection, SC2Mission, campaign_mission_table, SC2Race) -from .Regions import MissionInfo - -import colorama -from Options import Option -from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart, add_json_item, add_json_location, add_json_text, JSONTypes -from MultiServer import mark_raw - -pool = concurrent.futures.ThreadPoolExecutor(1) -loop = asyncio.get_event_loop_policy().new_event_loop() -nest_asyncio.apply(loop) -MAX_BONUS: int = 28 -VICTORY_MODULO: int = 100 - -# GitHub repo where the Map/mod data is hosted for /download_data command -DATA_REPO_OWNER = "Ziktofel" -DATA_REPO_NAME = "Archipelago-SC2-data" -DATA_API_VERSION = "API3" - -# Bot controller -CONTROLLER_HEALTH: int = 38281 -CONTROLLER2_HEALTH: int = 38282 - -# Games -STARCRAFT2 = "Starcraft 2" -STARCRAFT2_WOL = "Starcraft 2 Wings of Liberty" - - -# Data version file path. -# This file is used to tell if the downloaded data are outdated -# Associated with /download_data command -def get_metadata_file() -> str: - return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt" - - -class ConfigurableOptionType(enum.Enum): - INTEGER = enum.auto() - ENUM = enum.auto() - -class ConfigurableOptionInfo(typing.NamedTuple): - name: str - variable_name: str - option_class: typing.Type[Option] - option_type: ConfigurableOptionType = ConfigurableOptionType.ENUM - can_break_logic: bool = False - - -class ColouredMessage: - def __init__(self, text: str = '', *, keep_markup: bool = False) -> None: - self.parts: typing.List[dict] = [] - if text: - self(text, keep_markup=keep_markup) - def __call__(self, text: str, *, keep_markup: bool = False) -> 'ColouredMessage': - add_json_text(self.parts, text, keep_markup=keep_markup) - return self - def coloured(self, text: str, colour: str) -> 'ColouredMessage': - add_json_text(self.parts, text, type="color", color=colour) - return self - def location(self, location_id: int, player_id: int) -> 'ColouredMessage': - add_json_location(self.parts, location_id, player_id) - return self - def item(self, item_id: int, player_id: int, flags: int = 0) -> 'ColouredMessage': - add_json_item(self.parts, item_id, player_id, flags) - return self - def player(self, player_id: int) -> 'ColouredMessage': - add_json_text(self.parts, str(player_id), type=JSONTypes.player_id) - return self - def send(self, ctx: SC2Context) -> None: - ctx.on_print_json({"data": self.parts, "cmd": "PrintJSON"}) - - -class StarcraftClientProcessor(ClientCommandProcessor): - ctx: SC2Context - - def formatted_print(self, text: str) -> None: - """Prints with kivy formatting to the GUI, and also prints to command-line and to all logs""" - # Note(mm): Bold/underline can help readability, but unfortunately the CommonClient does not filter bold tags from command-line output. - # Regardless, using `on_print_json` to get formatted text in the GUI and output in the command-line and in the logs, - # without having to branch code from CommonClient - self.ctx.on_print_json({"data": [{"text": text, "keep_markup": True}]}) - - def _cmd_difficulty(self, difficulty: str = "") -> bool: - """Overrides the current difficulty set for the world. Takes the argument casual, normal, hard, or brutal""" - options = difficulty.split() - num_options = len(options) - - if num_options > 0: - difficulty_choice = options[0].lower() - if difficulty_choice == "casual": - self.ctx.difficulty_override = 0 - elif difficulty_choice == "normal": - self.ctx.difficulty_override = 1 - elif difficulty_choice == "hard": - self.ctx.difficulty_override = 2 - elif difficulty_choice == "brutal": - self.ctx.difficulty_override = 3 - else: - self.output("Unable to parse difficulty '" + options[0] + "'") - return False - - self.output("Difficulty set to " + options[0]) - return True - - else: - if self.ctx.difficulty == -1: - self.output("Please connect to a seed before checking difficulty.") - else: - current_difficulty = self.ctx.difficulty - if self.ctx.difficulty_override >= 0: - current_difficulty = self.ctx.difficulty_override - self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty]) - self.output("To change the difficulty, add the name of the difficulty after the command.") - return False - - - def _cmd_game_speed(self, game_speed: str = "") -> bool: - """Overrides the current game speed for the world. - Takes the arguments default, slower, slow, normal, fast, faster""" - options = game_speed.split() - num_options = len(options) - - if num_options > 0: - speed_choice = options[0].lower() - if speed_choice == "default": - self.ctx.game_speed_override = 0 - elif speed_choice == "slower": - self.ctx.game_speed_override = 1 - elif speed_choice == "slow": - self.ctx.game_speed_override = 2 - elif speed_choice == "normal": - self.ctx.game_speed_override = 3 - elif speed_choice == "fast": - self.ctx.game_speed_override = 4 - elif speed_choice == "faster": - self.ctx.game_speed_override = 5 - else: - self.output("Unable to parse game speed '" + options[0] + "'") - return False - - self.output("Game speed set to " + options[0]) - return True - - else: - if self.ctx.game_speed == -1: - self.output("Please connect to a seed before checking game speed.") - else: - current_speed = self.ctx.game_speed - if self.ctx.game_speed_override >= 0: - current_speed = self.ctx.game_speed_override - self.output("Current game speed: " - + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed]) - self.output("To change the game speed, add the name of the speed after the command," - " or Default to select based on difficulty.") - return False - - @mark_raw - def _cmd_received(self, filter_search: str = "") -> bool: - """List received items. - Pass in a parameter to filter the search by partial item name or exact item group.""" - # Groups must be matched case-sensitively, so we properly capitalize the search term - # eg. "Spear of Adun" over "Spear Of Adun" or "spear of adun" - # This fails a lot of item name matches, but those should be found by partial name match - formatted_filter_search = " ".join([(part.lower() if len(part) <= 3 else part.lower().capitalize()) for part in filter_search.split()]) - - def item_matches_filter(item_name: str) -> bool: - # The filter can be an exact group name or a partial item name - # Partial item name can be matched case-insensitively - if filter_search.lower() in item_name.lower(): - return True - # The search term should already be formatted as a group name - if formatted_filter_search in item_name_groups and item_name in item_name_groups[formatted_filter_search]: - return True - return False - - items = get_full_item_list() - categorized_items: typing.Dict[SC2Race, typing.List[int]] = {} - parent_to_child: typing.Dict[int, typing.List[int]] = {} - items_received: typing.Dict[int, typing.List[NetworkItem]] = {} - filter_match_count = 0 - for item in self.ctx.items_received: - items_received.setdefault(item.item, []).append(item) - items_received_set = set(items_received) - for item_data in items.values(): - if item_data.parent_item: - parent_to_child.setdefault(items[item_data.parent_item].code, []).append(item_data.code) - else: - categorized_items.setdefault(item_data.race, []).append(item_data.code) - for faction in SC2Race: - has_printed_faction_title = False - def print_faction_title(): - if not has_printed_faction_title: - self.formatted_print(f" [u]{faction.name}[/u] ") - - for item_id in categorized_items[faction]: - item_name = self.ctx.item_names.lookup_in_game(item_id) - received_child_items = items_received_set.intersection(parent_to_child.get(item_id, [])) - matching_children = [child for child in received_child_items - if item_matches_filter(self.ctx.item_names.lookup_in_game(child))] - received_items_of_this_type = items_received.get(item_id, []) - item_is_match = item_matches_filter(item_name) - if item_is_match or len(matching_children) > 0: - # Print found item if it or its children match the filter - if item_is_match: - filter_match_count += len(received_items_of_this_type) - for item in received_items_of_this_type: - print_faction_title() - has_printed_faction_title = True - (ColouredMessage('* ').item(item.item, self.ctx.slot, flags=item.flags) - (" from ").location(item.location, item.player) - (" by ").player(item.player) - ).send(self.ctx) - - if received_child_items: - # We have this item's children - if len(matching_children) == 0: - # ...but none of them match the filter - continue - - if not received_items_of_this_type: - # We didn't receive the item itself - print_faction_title() - has_printed_faction_title = True - ColouredMessage("- ").coloured(item_name, "black")(" - not obtained").send(self.ctx) - - for child_item in matching_children: - received_items_of_this_type = items_received.get(child_item, []) - for item in received_items_of_this_type: - filter_match_count += len(received_items_of_this_type) - (ColouredMessage(' * ').item(item.item, self.ctx.slot, flags=item.flags) - (" from ").location(item.location, item.player) - (" by ").player(item.player) - ).send(self.ctx) - - non_matching_children = len(received_child_items) - len(matching_children) - if non_matching_children > 0: - self.formatted_print(f" + {non_matching_children} child items that don't match the filter") - if filter_search == "": - self.formatted_print(f"[b]Obtained: {len(self.ctx.items_received)} items[/b]") - else: - self.formatted_print(f"[b]Filter \"{filter_search}\" found {filter_match_count} out of {len(self.ctx.items_received)} obtained items[/b]") - return True - - def _cmd_option(self, option_name: str = "", option_value: str = "") -> None: - """Sets a Starcraft game option that can be changed after generation. Use "/option list" to see all options.""" - - LOGIC_WARNING = f" *Note changing this may result in logically unbeatable games*\n" - - options = ( - ConfigurableOptionInfo('kerrigan_presence', 'kerrigan_presence', Options.KerriganPresence, can_break_logic=True), - ConfigurableOptionInfo('soa_presence', 'spear_of_adun_presence', Options.SpearOfAdunPresence, can_break_logic=True), - ConfigurableOptionInfo('soa_in_nobuilds', 'spear_of_adun_present_in_no_build', Options.SpearOfAdunPresentInNoBuild, can_break_logic=True), - ConfigurableOptionInfo('control_ally', 'take_over_ai_allies', Options.TakeOverAIAllies, can_break_logic=True), - ConfigurableOptionInfo('minerals_per_item', 'minerals_per_item', Options.MineralsPerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('gas_per_item', 'vespene_per_item', Options.VespenePerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('supply_per_item', 'starting_supply_per_item', Options.StartingSupplyPerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('no_forced_camera', 'disable_forced_camera', Options.DisableForcedCamera), - ConfigurableOptionInfo('skip_cutscenes', 'skip_cutscenes', Options.SkipCutscenes), - ) - - WARNING_COLOUR = "salmon" - CMD_COLOUR = "slateblue" - boolean_option_map = { - 'y': 'true', 'yes': 'true', 'n': 'false', 'no': 'false', - } - - help_message = ColouredMessage(inspect.cleandoc(""" - Options - -------------------- - """))('\n') - for option in options: - option_help_text = inspect.cleandoc(option.option_class.__doc__ or "No description provided.").split('\n', 1)[0] - help_message.coloured(option.name, CMD_COLOUR)(": " + " | ".join(option.option_class.options) - + f" -- {option_help_text}\n") - if option.can_break_logic: - help_message.coloured(LOGIC_WARNING, WARNING_COLOUR) - help_message("--------------------\nEnter an option without arguments to see its current value.\n") - - if not option_name or option_name == 'list' or option_name == 'help': - help_message.send(self.ctx) - return - for option in options: - if option_name == option.name: - option_value = boolean_option_map.get(option_value, option_value) - if not option_value: - pass - elif option.option_type == ConfigurableOptionType.ENUM and option_value in option.option_class.options: - self.ctx.__dict__[option.variable_name] = option.option_class.options[option_value] - elif option.option_type == ConfigurableOptionType.INTEGER: - try: - self.ctx.__dict__[option.variable_name] = int(option_value, base=0) - except: - self.output(f"{option_value} is not a valid integer") - else: - self.output(f"Unknown option value '{option_value}'") - ColouredMessage(f"{option.name} is '{option.option_class.get_option_name(self.ctx.__dict__[option.variable_name])}'").send(self.ctx) - break - else: - self.output(f"Unknown option '{option_name}'") - help_message.send(self.ctx) - - def _cmd_color(self, faction: str = "", color: str = "") -> None: - """Changes the player color for a given faction.""" - player_colors = [ - "White", "Red", "Blue", "Teal", - "Purple", "Yellow", "Orange", "Green", - "LightPink", "Violet", "LightGrey", "DarkGreen", - "Brown", "LightGreen", "DarkGrey", "Pink", - "Rainbow", "Random", "Default" - ] - var_names = { - 'raynor': 'player_color_raynor', - 'kerrigan': 'player_color_zerg', - 'primal': 'player_color_zerg_primal', - 'protoss': 'player_color_protoss', - 'nova': 'player_color_nova', - } - faction = faction.lower() - if not faction: - for faction_name, key in var_names.items(): - self.output(f"Current player color for {faction_name}: {player_colors[self.ctx.__dict__[key]]}") - self.output("To change your color, add the faction name and color after the command.") - self.output("Available factions: " + ', '.join(var_names)) - self.output("Available colors: " + ', '.join(player_colors)) - return - elif faction not in var_names: - self.output(f"Unknown faction '{faction}'.") - self.output("Available factions: " + ', '.join(var_names)) - return - match_colors = [player_color.lower() for player_color in player_colors] - if not color: - self.output(f"Current player color for {faction}: {player_colors[self.ctx.__dict__[var_names[faction]]]}") - self.output("To change this faction's colors, add the name of the color after the command.") - self.output("Available colors: " + ', '.join(player_colors)) - else: - if color.lower() not in match_colors: - self.output(color + " is not a valid color. Available colors: " + ', '.join(player_colors)) - return - if color.lower() == "random": - color = random.choice(player_colors[:16]) - self.ctx.__dict__[var_names[faction]] = match_colors.index(color.lower()) - self.ctx.pending_color_update = True - self.output(f"Color for {faction} set to " + player_colors[self.ctx.__dict__[var_names[faction]]]) - - def _cmd_disable_mission_check(self) -> bool: - """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play - the next mission in a chain the other player is doing.""" - self.ctx.missions_unlocked = True - sc2_logger.info("Mission check has been disabled") - return True - - def _cmd_play(self, mission_id: str = "") -> bool: - """Start a Starcraft 2 mission""" - - options = mission_id.split() - num_options = len(options) - - if num_options > 0: - mission_number = int(options[0]) - - self.ctx.play_mission(mission_number) - - else: - sc2_logger.info( - "Mission ID needs to be specified. Use /unfinished or /available to view ids for available missions.") - return False - - return True - - def _cmd_available(self) -> bool: - """Get what missions are currently available to play""" - - request_available_missions(self.ctx) - return True - - def _cmd_unfinished(self) -> bool: - """Get what missions are currently available to play and have not had all locations checked""" - - request_unfinished_missions(self.ctx) - return True - - @mark_raw - def _cmd_set_path(self, path: str = '') -> bool: - """Manually set the SC2 install directory (if the automatic detection fails).""" - if path: - os.environ["SC2PATH"] = path - is_mod_installed_correctly() - return True - else: - sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") - return False - - def _cmd_download_data(self) -> bool: - """Download the most recent release of the necessary files for playing SC2 with - Archipelago. Will overwrite existing files.""" - pool.submit(self._download_data) - return True - - @staticmethod - def _download_data() -> bool: - if "SC2PATH" not in os.environ: - check_game_install_path() - - if os.path.exists(get_metadata_file()): - with open(get_metadata_file(), "r") as f: - metadata = f.read() - else: - metadata = None - - tempzip, metadata = download_latest_release_zip( - DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, metadata=metadata, force_download=True) - - if tempzip: - try: - zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) - sc2_logger.info(f"Download complete. Package installed.") - if metadata is not None: - with open(get_metadata_file(), "w") as f: - f.write(metadata) - finally: - os.remove(tempzip) - else: - sc2_logger.warning("Download aborted/failed. Read the log for more information.") - return False - return True - - -class SC2JSONtoTextParser(JSONtoTextParser): - def __init__(self, ctx) -> None: - self.handlers = { - "ItemSend": self._handle_color, - "ItemCheat": self._handle_color, - "Hint": self._handle_color, - } - super().__init__(ctx) - - def _handle_color(self, node: JSONMessagePart) -> str: - codes = node["color"].split(";") - buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes) - return buffer + self._handle_text(node) + '' - - def color_code(self, code: str) -> str: - return '' - - -class SC2Context(CommonContext): - command_processor = StarcraftClientProcessor - game = STARCRAFT2 - items_handling = 0b111 - - def __init__(self, *args, **kwargs) -> None: - super(SC2Context, self).__init__(*args, **kwargs) - self.raw_text_parser = SC2JSONtoTextParser(self) - - self.difficulty = -1 - self.game_speed = -1 - self.disable_forced_camera = 0 - self.skip_cutscenes = 0 - self.all_in_choice = 0 - self.mission_order = 0 - self.player_color_raynor = ColorChoice.option_blue - self.player_color_zerg = ColorChoice.option_orange - self.player_color_zerg_primal = ColorChoice.option_purple - self.player_color_protoss = ColorChoice.option_blue - self.player_color_nova = ColorChoice.option_dark_grey - self.pending_color_update = False - self.kerrigan_presence = 0 - self.kerrigan_primal_status = 0 - self.levels_per_check = 0 - self.checks_per_level = 1 - self.mission_req_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]] = {} - self.final_mission: int = 29 - self.announcements: queue.Queue = queue.Queue() - self.sc2_run_task: typing.Optional[asyncio.Task] = None - self.missions_unlocked: bool = False # allow launching missions ignoring requirements - self.generic_upgrade_missions = 0 - self.generic_upgrade_research = 0 - self.generic_upgrade_items = 0 - self.location_inclusions: typing.Dict[LocationType, int] = {} - self.plando_locations: typing.List[str] = [] - self.current_tooltip = None - self.last_loc_list = None - self.difficulty_override = -1 - self.game_speed_override = -1 - self.mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} - self.last_bot: typing.Optional[ArchipelagoBot] = None - self.slot_data_version = 2 - self.grant_story_tech = 0 - self.required_tactics = RequiredTactics.option_standard - self.take_over_ai_allies = TakeOverAIAllies.option_false - self.spear_of_adun_presence = SpearOfAdunPresence.option_not_present - self.spear_of_adun_present_in_no_build = SpearOfAdunPresentInNoBuild.option_false - self.spear_of_adun_autonomously_cast_ability_presence = SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present - self.spear_of_adun_autonomously_cast_present_in_no_build = SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false - self.minerals_per_item = 15 - self.vespene_per_item = 15 - self.starting_supply_per_item = 2 - self.nova_covert_ops_only = False - self.kerrigan_levels_per_mission_completed = 0 - - async def server_auth(self, password_requested: bool = False) -> None: - self.game = STARCRAFT2 - if password_requested and not self.password: - await super(SC2Context, self).server_auth(password_requested) - await self.get_username() - await self.send_connect() - if self.ui: - self.ui.first_check = True - - def is_legacy_game(self): - return self.game == STARCRAFT2_WOL - - def event_invalid_game(self): - if self.is_legacy_game(): - self.game = STARCRAFT2 - super().event_invalid_game() - else: - self.game = STARCRAFT2_WOL - async_start(self.send_connect()) - - def on_package(self, cmd: str, args: dict) -> None: - if cmd == "Connected": - self.difficulty = args["slot_data"]["game_difficulty"] - self.game_speed = args["slot_data"].get("game_speed", GameSpeed.option_default) - self.disable_forced_camera = args["slot_data"].get("disable_forced_camera", DisableForcedCamera.default) - self.skip_cutscenes = args["slot_data"].get("skip_cutscenes", SkipCutscenes.default) - self.all_in_choice = args["slot_data"]["all_in_map"] - self.slot_data_version = args["slot_data"].get("version", 2) - slot_req_table: dict = args["slot_data"]["mission_req"] - - first_item = list(slot_req_table.keys())[0] - # Maintaining backwards compatibility with older slot data - if first_item in [str(campaign.id) for campaign in SC2Campaign]: - # Multi-campaign - self.mission_req_table = {} - for campaign_id in slot_req_table: - campaign = lookup_id_to_campaign[int(campaign_id)] - self.mission_req_table[campaign] = { - mission: self.parse_mission_info(mission_info) - for mission, mission_info in slot_req_table[campaign_id].items() - } - else: - # Old format - self.mission_req_table = {SC2Campaign.GLOBAL: { - mission: self.parse_mission_info(mission_info) - for mission, mission_info in slot_req_table.items() - } - } - - self.mission_order = args["slot_data"].get("mission_order", MissionOrder.option_vanilla) - self.final_mission = args["slot_data"].get("final_mission", SC2Mission.ALL_IN.id) - self.player_color_raynor = args["slot_data"].get("player_color_terran_raynor", ColorChoice.option_blue) - self.player_color_zerg = args["slot_data"].get("player_color_zerg", ColorChoice.option_orange) - self.player_color_zerg_primal = args["slot_data"].get("player_color_zerg_primal", ColorChoice.option_purple) - self.player_color_protoss = args["slot_data"].get("player_color_protoss", ColorChoice.option_blue) - self.player_color_nova = args["slot_data"].get("player_color_nova", ColorChoice.option_dark_grey) - self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", GenericUpgradeMissions.default) - self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", GenericUpgradeItems.option_individual_items) - self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", GenericUpgradeResearch.option_vanilla) - self.kerrigan_presence = args["slot_data"].get("kerrigan_presence", KerriganPresence.option_vanilla) - self.kerrigan_primal_status = args["slot_data"].get("kerrigan_primal_status", KerriganPrimalStatus.option_vanilla) - self.kerrigan_levels_per_mission_completed = args["slot_data"].get("kerrigan_levels_per_mission_completed", 0) - self.kerrigan_levels_per_mission_completed_cap = args["slot_data"].get("kerrigan_levels_per_mission_completed_cap", -1) - self.kerrigan_total_level_cap = args["slot_data"].get("kerrigan_total_level_cap", -1) - self.grant_story_tech = args["slot_data"].get("grant_story_tech", GrantStoryTech.option_false) - self.grant_story_levels = args["slot_data"].get("grant_story_levels", GrantStoryLevels.option_additive) - self.required_tactics = args["slot_data"].get("required_tactics", RequiredTactics.option_standard) - self.take_over_ai_allies = args["slot_data"].get("take_over_ai_allies", TakeOverAIAllies.option_false) - self.spear_of_adun_presence = args["slot_data"].get("spear_of_adun_presence", SpearOfAdunPresence.option_not_present) - self.spear_of_adun_present_in_no_build = args["slot_data"].get("spear_of_adun_present_in_no_build", SpearOfAdunPresentInNoBuild.option_false) - self.spear_of_adun_autonomously_cast_ability_presence = args["slot_data"].get("spear_of_adun_autonomously_cast_ability_presence", SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present) - self.spear_of_adun_autonomously_cast_present_in_no_build = args["slot_data"].get("spear_of_adun_autonomously_cast_present_in_no_build", SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false) - self.minerals_per_item = args["slot_data"].get("minerals_per_item", 15) - self.vespene_per_item = args["slot_data"].get("vespene_per_item", 15) - self.starting_supply_per_item = args["slot_data"].get("starting_supply_per_item", 2) - self.nova_covert_ops_only = args["slot_data"].get("nova_covert_ops_only", False) - - if self.required_tactics == RequiredTactics.option_no_logic: - # Locking Grant Story Tech/Levels if no logic - self.grant_story_tech = GrantStoryTech.option_true - self.grant_story_levels = GrantStoryLevels.option_minimum - - self.location_inclusions = { - LocationType.VICTORY: LocationInclusion.option_enabled, # Victory checks are always enabled - LocationType.VANILLA: args["slot_data"].get("vanilla_locations", VanillaLocations.default), - LocationType.EXTRA: args["slot_data"].get("extra_locations", ExtraLocations.default), - LocationType.CHALLENGE: args["slot_data"].get("challenge_locations", ChallengeLocations.default), - LocationType.MASTERY: args["slot_data"].get("mastery_locations", MasteryLocations.default), - } - self.plando_locations = args["slot_data"].get("plando_locations", []) - - self.build_location_to_mission_mapping() - - # Looks for the required maps and mods for SC2. Runs check_game_install_path. - maps_present = is_mod_installed_correctly() - if os.path.exists(get_metadata_file()): - with open(get_metadata_file(), "r") as f: - current_ver = f.read() - sc2_logger.debug(f"Current version: {current_ver}") - if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver): - sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.") - elif maps_present: - sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). " - "Run /download_data to update them.") - - @staticmethod - def parse_mission_info(mission_info: dict[str, typing.Any]) -> MissionInfo: - if mission_info.get("id") is not None: - mission_info["mission"] = lookup_id_to_mission[mission_info["id"]] - elif isinstance(mission_info["mission"], int): - mission_info["mission"] = lookup_id_to_mission[mission_info["mission"]] - - return MissionInfo( - **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} - ) - - def find_campaign(self, mission_name: str) -> SC2Campaign: - data = self.mission_req_table - for campaign in data.keys(): - if mission_name in data[campaign].keys(): - return campaign - sc2_logger.info(f"Attempted to find campaign of unknown mission '{mission_name}'; defaulting to GLOBAL") - return SC2Campaign.GLOBAL - - - - def on_print_json(self, args: dict) -> None: - # goes to this world - if "receiving" in args and self.slot_concerns_self(args["receiving"]): - relevant = True - # found in this world - elif "item" in args and self.slot_concerns_self(args["item"].player): - relevant = True - # not related - else: - relevant = False - - if relevant: - self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) - - super(SC2Context, self).on_print_json(args) - - def run_gui(self) -> None: - from .ClientGui import start_gui - start_gui(self) - - - async def shutdown(self) -> None: - await super(SC2Context, self).shutdown() - if self.last_bot: - self.last_bot.want_close = True - if self.sc2_run_task: - self.sc2_run_task.cancel() - - def play_mission(self, mission_id: int) -> bool: - if self.missions_unlocked or is_mission_available(self, mission_id): - if self.sc2_run_task: - if not self.sc2_run_task.done(): - sc2_logger.warning("Starcraft 2 Client is still running!") - self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task - if self.slot is None: - sc2_logger.warning("Launching Mission without Archipelago authentication, " - "checks will not be registered to server.") - self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), - name="Starcraft 2 Launch") - return True - else: - sc2_logger.info( - f"{lookup_id_to_mission[mission_id].mission_name} is not currently unlocked. " - f"Use /unfinished or /available to see what is available.") - return False - - def build_location_to_mission_mapping(self) -> None: - mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { - mission_info.mission.id: set() for campaign_mission in self.mission_req_table.values() for mission_info in campaign_mission.values() - } - - for loc in self.server_locations: - offset = SC2WOL_LOC_ID_OFFSET if loc < SC2HOTS_LOC_ID_OFFSET \ - else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) - mission_id, objective = divmod(loc - offset, VICTORY_MODULO) - mission_id_to_location_ids[mission_id].add(objective) - self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in - mission_id_to_location_ids.items()} - - def locations_for_mission(self, mission_name: str): - mission = lookup_name_to_mission[mission_name] - mission_id: int = mission.id - objectives = self.mission_id_to_location_ids[mission_id] - for objective in objectives: - yield get_location_offset(mission_id) + mission_id * VICTORY_MODULO + objective - - -class CompatItemHolder(typing.NamedTuple): - name: str - quantity: int = 1 - - -async def main(): - multiprocessing.freeze_support() - parser = get_base_parser() - parser.add_argument('--name', default=None, help="Slot Name to connect as.") - args = parser.parse_args() - - ctx = SC2Context(args.connect, args.password) - ctx.auth = args.name - if ctx.server_task is None: - ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") - - if gui_enabled: - ctx.run_gui() - ctx.run_cli() - - await ctx.exit_event.wait() - - await ctx.shutdown() - -# These items must be given to the player if the game is generated on version 2 -API2_TO_API3_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { - CompatItemHolder(ItemNames.PHOTON_CANNON), - CompatItemHolder(ItemNames.OBSERVER), - CompatItemHolder(ItemNames.WARP_HARMONIZATION), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, 3) -} - - -def compat_item_to_network_items(compat_item: CompatItemHolder) -> typing.List[NetworkItem]: - item_id = get_full_item_list()[compat_item.name].code - network_item = NetworkItem(item_id, 0, 0, 0) - return compat_item.quantity * [network_item] - - -def calculate_items(ctx: SC2Context) -> typing.Dict[SC2Race, typing.List[int]]: - items = ctx.items_received.copy() - # Items unlocked in API2 by default (Prophecy default items) - if ctx.slot_data_version < 3: - for compat_item in API2_TO_API3_COMPAT_ITEMS: - items.extend(compat_item_to_network_items(compat_item)) - - network_item: NetworkItem - accumulators: typing.Dict[SC2Race, typing.List[int]] = {race: [0 for _ in type_flaggroups[race]] for race in SC2Race} - - # Protoss Shield grouped item specific logic - shields_from_ground_upgrade: int = 0 - shields_from_air_upgrade: int = 0 - - item_list = get_full_item_list() - for network_item in items: - name: str = lookup_id_to_name[network_item.item] - item_data: ItemData = item_list[name] - - # exists exactly once - if item_data.quantity == 1: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] |= 1 << item_data.number - - # exists multiple times - elif item_data.type in ["Upgrade", "Progressive Upgrade","Progressive Upgrade 2"]: - flaggroup = type_flaggroups[item_data.race][item_data.type] - - # Generic upgrades apply only to Weapon / Armor upgrades - if item_data.type != "Upgrade" or ctx.generic_upgrade_items == 0: - accumulators[item_data.race][flaggroup] += 1 << item_data.number - else: - if name == ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: - shields_from_ground_upgrade += 1 - if name == ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE: - shields_from_air_upgrade += 1 - for bundled_number in upgrade_numbers[item_data.number]: - accumulators[item_data.race][flaggroup] += 1 << bundled_number - - # Regen bio-steel nerf with API3 - undo for older games - if ctx.slot_data_version < 3 and name == ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL: - current_level = (accumulators[item_data.race][flaggroup] >> item_data.number) % 4 - if current_level == 2: - # Switch from level 2 to level 3 for compatibility - accumulators[item_data.race][flaggroup] += 1 << item_data.number - # sum - else: - if name == ItemNames.STARTING_MINERALS: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.minerals_per_item - elif name == ItemNames.STARTING_VESPENE: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.vespene_per_item - elif name == ItemNames.STARTING_SUPPLY: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.starting_supply_per_item - else: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += item_data.number - - # Fix Shields from generic upgrades by unit class (Maximum of ground/air upgrades) - if shields_from_ground_upgrade > 0 or shields_from_air_upgrade > 0: - shield_upgrade_level = max(shields_from_ground_upgrade, shields_from_air_upgrade) - shield_upgrade_item = item_list[ItemNames.PROGRESSIVE_PROTOSS_SHIELDS] - for _ in range(0, shield_upgrade_level): - accumulators[shield_upgrade_item.race][type_flaggroups[shield_upgrade_item.race][shield_upgrade_item.type]] += 1 << shield_upgrade_item.number - - # Kerrigan levels per check - accumulators[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] += (len(ctx.checked_locations) // ctx.checks_per_level) * ctx.levels_per_check - - # Upgrades from completed missions - if ctx.generic_upgrade_missions > 0: - total_missions = sum(len(ctx.mission_req_table[campaign]) for campaign in ctx.mission_req_table) - for race in SC2Race: - if "Upgrade" not in type_flaggroups[race]: - continue - upgrade_flaggroup = type_flaggroups[race]["Upgrade"] - num_missions = ctx.generic_upgrade_missions * total_missions - amounts = [ - num_missions // 100, - 2 * num_missions // 100, - 3 * num_missions // 100 - ] - upgrade_count = 0 - completed = len([id for id in ctx.mission_id_to_location_ids if get_location_offset(id) + VICTORY_MODULO * id in ctx.checked_locations]) - for amount in amounts: - if completed >= amount: - upgrade_count += 1 - # Equivalent to "Progressive Weapon/Armor Upgrade" item - for bundled_number in upgrade_numbers[upgrade_numbers_all[race]]: - accumulators[race][upgrade_flaggroup] += upgrade_count << bundled_number - - return accumulators - - -def calc_difficulty(difficulty: int): - if difficulty == 0: - return 'C' - elif difficulty == 1: - return 'N' - elif difficulty == 2: - return 'H' - elif difficulty == 3: - return 'B' - - return 'X' - - -def get_kerrigan_level(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]], missions_beaten: int) -> int: - item_value = items[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] - mission_value = missions_beaten * ctx.kerrigan_levels_per_mission_completed - if ctx.kerrigan_levels_per_mission_completed_cap != -1: - mission_value = min(mission_value, ctx.kerrigan_levels_per_mission_completed_cap) - total_value = item_value + mission_value - if ctx.kerrigan_total_level_cap != -1: - total_value = min(total_value, ctx.kerrigan_total_level_cap) - return total_value - - -def calculate_kerrigan_options(ctx: SC2Context) -> int: - options = 0 - - # Bits 0, 1 - # Kerrigan unit available - if ctx.kerrigan_presence in kerrigan_unit_available: - options |= 1 << 0 - - # Bit 2 - # Kerrigan primal status by map - if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_vanilla: - options |= 1 << 2 - - return options - - -def caclulate_soa_options(ctx: SC2Context) -> int: - options = 0 - - # Bits 0, 1 - # SoA Calldowns available - soa_presence_value = 0 - if ctx.spear_of_adun_presence == SpearOfAdunPresence.option_not_present: - soa_presence_value = 0 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_lotv_protoss: - soa_presence_value = 1 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_protoss: - soa_presence_value = 2 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: - soa_presence_value = 3 - options |= soa_presence_value << 0 - - # Bit 2 - # SoA Calldowns for no-builds - if ctx.spear_of_adun_present_in_no_build == SpearOfAdunPresentInNoBuild.option_true: - options |= 1 << 2 - - # Bits 3,4 - # Autocasts - soa_autocasts_presence_value = 0 - if ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present: - soa_autocasts_presence_value = 0 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss: - soa_autocasts_presence_value = 1 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_protoss: - soa_autocasts_presence_value = 2 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere: - soa_autocasts_presence_value = 3 - options |= soa_autocasts_presence_value << 3 - - # Bit 5 - # Autocasts in no-builds - if ctx.spear_of_adun_autonomously_cast_present_in_no_build == SpearOfAdunAutonomouslyCastPresentInNoBuild.option_true: - options |= 1 << 5 - - return options - -def kerrigan_primal(ctx: SC2Context, kerrigan_level: int) -> bool: - if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_zerg: - return True - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_human: - return False - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_level_35: - return kerrigan_level >= 35 - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_half_completion: - total_missions = len(ctx.mission_id_to_location_ids) - completed = sum((mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations - for mission_id in ctx.mission_id_to_location_ids) - return completed >= (total_missions / 2) - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_item: - codes = [item.item for item in ctx.items_received] - return get_full_item_list()[ItemNames.KERRIGAN_PRIMAL_FORM].code in codes - return False - -async def starcraft_launch(ctx: SC2Context, mission_id: int): - sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id].mission_name}. If game does not launch check log file for errors.") - - with DllDirectory(None): - run_game(bot.maps.get(lookup_id_to_mission[mission_id].map_file), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), - name="Archipelago", fullscreen=True)], realtime=True) - - -class ArchipelagoBot(bot.bot_ai.BotAI): - __slots__ = [ - 'game_running', - 'mission_completed', - 'boni', - 'setup_done', - 'ctx', - 'mission_id', - 'want_close', - 'can_read_game', - 'last_received_update', - ] - - def __init__(self, ctx: SC2Context, mission_id: int): - self.game_running = False - self.mission_completed = False - self.want_close = False - self.can_read_game = False - self.last_received_update: int = 0 - self.setup_done = False - self.ctx = ctx - self.ctx.last_bot = self - self.mission_id = mission_id - self.boni = [False for _ in range(MAX_BONUS)] - - super(ArchipelagoBot, self).__init__() - - async def on_step(self, iteration: int): - if self.want_close: - self.want_close = False - await self._client.leave() - return - game_state = 0 - if not self.setup_done: - self.setup_done = True - start_items = calculate_items(self.ctx) - missions_beaten = self.missions_beaten_count() - kerrigan_level = get_kerrigan_level(self.ctx, start_items, missions_beaten) - kerrigan_options = calculate_kerrigan_options(self.ctx) - soa_options = caclulate_soa_options(self.ctx) - if self.ctx.difficulty_override >= 0: - difficulty = calc_difficulty(self.ctx.difficulty_override) - else: - difficulty = calc_difficulty(self.ctx.difficulty) - if self.ctx.game_speed_override >= 0: - game_speed = self.ctx.game_speed_override - else: - game_speed = self.ctx.game_speed - await self.chat_send("?SetOptions {} {} {} {} {} {} {} {} {} {} {} {} {}".format( - difficulty, - self.ctx.generic_upgrade_research, - self.ctx.all_in_choice, - game_speed, - self.ctx.disable_forced_camera, - self.ctx.skip_cutscenes, - kerrigan_options, - self.ctx.grant_story_tech, - self.ctx.take_over_ai_allies, - soa_options, - self.ctx.mission_order, - 1 if self.ctx.nova_covert_ops_only else 0, - self.ctx.grant_story_levels - )) - await self.chat_send("?GiveResources {} {} {}".format( - start_items[SC2Race.ANY][0], - start_items[SC2Race.ANY][1], - start_items[SC2Race.ANY][2] - )) - await self.updateTerranTech(start_items) - await self.updateZergTech(start_items, kerrigan_level) - await self.updateProtossTech(start_items) - await self.updateColors() - await self.chat_send("?LoadFinished") - self.last_received_update = len(self.ctx.items_received) - - else: - if self.ctx.pending_color_update: - await self.updateColors() - - if not self.ctx.announcements.empty(): - message = self.ctx.announcements.get(timeout=1) - await self.chat_send("?SendMessage " + message) - self.ctx.announcements.task_done() - - # Archipelago reads the health - controller1_state = 0 - controller2_state = 0 - for unit in self.all_own_units(): - if unit.health_max == CONTROLLER_HEALTH: - controller1_state = int(CONTROLLER_HEALTH - unit.health) - self.can_read_game = True - elif unit.health_max == CONTROLLER2_HEALTH: - controller2_state = int(CONTROLLER2_HEALTH - unit.health) - self.can_read_game = True - game_state = controller1_state + (controller2_state << 15) - - if iteration == 160 and not game_state & 1: - await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " + - "Starcraft 2 (This is likely a map issue)") - - if self.last_received_update < len(self.ctx.items_received): - current_items = calculate_items(self.ctx) - missions_beaten = self.missions_beaten_count() - kerrigan_level = get_kerrigan_level(self.ctx, current_items, missions_beaten) - await self.updateTerranTech(current_items) - await self.updateZergTech(current_items, kerrigan_level) - await self.updateProtossTech(current_items) - self.last_received_update = len(self.ctx.items_received) - - if game_state & 1: - if not self.game_running: - print("Archipelago Connected") - self.game_running = True - - if self.can_read_game: - if game_state & (1 << 1) and not self.mission_completed: - if self.mission_id != self.ctx.final_mission: - print("Mission Completed") - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id]}]) - self.mission_completed = True - else: - print("Game Complete") - await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) - self.mission_completed = True - - for x, completed in enumerate(self.boni): - if not completed and game_state & (1 << (x + 2)): - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id + x + 1]}]) - self.boni[x] = True - else: - await self.chat_send("?SendMessage LostConnection - Lost connection to game.") - - def missions_beaten_count(self): - return len([location for location in self.ctx.checked_locations if location % VICTORY_MODULO == 0]) - - async def updateColors(self): - await self.chat_send("?SetColor rr " + str(self.ctx.player_color_raynor)) - await self.chat_send("?SetColor ks " + str(self.ctx.player_color_zerg)) - await self.chat_send("?SetColor pz " + str(self.ctx.player_color_zerg_primal)) - await self.chat_send("?SetColor da " + str(self.ctx.player_color_protoss)) - await self.chat_send("?SetColor nova " + str(self.ctx.player_color_nova)) - self.ctx.pending_color_update = False - - async def updateTerranTech(self, current_items): - terran_items = current_items[SC2Race.TERRAN] - await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {} {} {} {} {}".format( - terran_items[0], terran_items[1], terran_items[2], terran_items[3], terran_items[4], - terran_items[5], terran_items[6], terran_items[7], terran_items[8], terran_items[9], terran_items[10], - terran_items[11], terran_items[12], terran_items[13])) - - async def updateZergTech(self, current_items, kerrigan_level): - zerg_items = current_items[SC2Race.ZERG] - kerrigan_primal_by_items = kerrigan_primal(self.ctx, kerrigan_level) - kerrigan_primal_bot_value = 1 if kerrigan_primal_by_items else 0 - await self.chat_send("?GiveZergTech {} {} {} {} {} {} {} {} {} {} {} {}".format( - kerrigan_level, kerrigan_primal_bot_value, zerg_items[0], zerg_items[1], zerg_items[2], - zerg_items[3], zerg_items[4], zerg_items[5], zerg_items[6], zerg_items[9], zerg_items[10], zerg_items[11] - )) - - async def updateProtossTech(self, current_items): - protoss_items = current_items[SC2Race.PROTOSS] - await self.chat_send("?GiveProtossTech {} {} {} {} {} {} {} {} {} {}".format( - protoss_items[0], protoss_items[1], protoss_items[2], protoss_items[3], protoss_items[4], - protoss_items[5], protoss_items[6], protoss_items[7], protoss_items[8], protoss_items[9] - )) - - -def request_unfinished_missions(ctx: SC2Context) -> None: - if ctx.mission_req_table: - message = "Unfinished Missions: " - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - unfinished_locations: typing.Dict[SC2Mission, typing.List[str]] = {} - - _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks) - - for mission in unfinished_missions: - objectives = set(ctx.locations_for_mission(mission)) - if objectives: - remaining_objectives = objectives.difference(ctx.checked_locations) - unfinished_locations[mission] = [ctx.location_names.lookup_in_game(location_id) for location_id in remaining_objectives] - else: - unfinished_locations[mission] = [] - - # Removing All-In from location pool - final_mission = lookup_id_to_mission[ctx.final_mission] - if final_mission in unfinished_missions.keys(): - message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message - if unfinished_missions[final_mission] == -1: - unfinished_missions.pop(final_mission) - - message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}] " + - mark_up_objectives( - f"[{len(unfinished_missions[mission])}/" - f"{sum(1 for _ in ctx.locations_for_mission(mission))}]", - ctx, unfinished_locations, mission) - for mission in unfinished_missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_unfinished_missions(ctx: SC2Context, unlocks: typing.Optional[typing.Dict] = None): - unfinished_missions: typing.List[str] = [] - locations_completed: typing.List[typing.Union[typing.Set[int], typing.Literal[-1]]] = [] - - if not unlocks: - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - available_missions = calc_available_missions(ctx, unlocks) - - for name in available_missions: - objectives = set(ctx.locations_for_mission(name)) - if objectives: - objectives_completed = ctx.checked_locations & objectives - if len(objectives_completed) < len(objectives): - unfinished_missions.append(name) - locations_completed.append(objectives_completed) - - else: # infer that this is the final mission as it has no objectives - unfinished_missions.append(name) - locations_completed.append(-1) - - return available_missions, dict(zip(unfinished_missions, locations_completed)) - - -def is_mission_available(ctx: SC2Context, mission_id_to_check: int) -> bool: - unfinished_missions = calc_available_missions(ctx) - - return any(mission_id_to_check == ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id for mission in unfinished_missions) - - -def mark_up_mission_name(ctx: SC2Context, mission_name: str, unlock_table: typing.Dict) -> str: - """Checks if the mission is required for game completion and adds '*' to the name to mark that.""" - - campaign = ctx.find_campaign(mission_name) - mission_info = ctx.mission_req_table[campaign][mission_name] - if mission_info.completion_critical: - if ctx.ui: - message = "[color=AF99EF]" + mission_name + "[/color]" - else: - message = "*" + mission_name + "*" - else: - message = mission_name - - if ctx.ui: - campaign_missions = list(ctx.mission_req_table[campaign].keys()) - unlocks: typing.List[str] - index = campaign_missions.index(mission_name) - if index in unlock_table[campaign]: - unlocks = unlock_table[campaign][index] - else: - unlocks = [] - - if len(unlocks) > 0: - pre_message = f"[ref={mission_info.mission.id}|Unlocks: " - pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[ctx.find_campaign(unlock)][unlock].mission.id})" for unlock in unlocks) - pre_message += f"]" - message = pre_message + message + "[/ref]" - - return message - - -def mark_up_objectives(message, ctx, unfinished_locations, mission): - formatted_message = message - - if ctx.ui: - locations = unfinished_locations[mission] - campaign = ctx.find_campaign(mission) - - pre_message = f"[ref={list(ctx.mission_req_table[campaign]).index(mission) + 30}|" - pre_message += "
".join(location for location in locations) - pre_message += f"]" - formatted_message = pre_message + message + "[/ref]" - - return formatted_message - - -def request_available_missions(ctx: SC2Context): - if ctx.mission_req_table: - message = "Available Missions: " - - # Initialize mission unlock table - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - missions = calc_available_missions(ctx, unlocks) - message += \ - ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}" - f"[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}]" - for mission in missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_available_missions(ctx: SC2Context, unlocks: typing.Optional[dict] = None) -> typing.List[str]: - available_missions: typing.List[str] = [] - missions_complete = 0 - - # Get number of missions completed - for loc in ctx.checked_locations: - if loc % VICTORY_MODULO == 0: - missions_complete += 1 - - for campaign in ctx.mission_req_table: - # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips - for mission_name in ctx.mission_req_table[campaign]: - if unlocks: - for unlock in ctx.mission_req_table[campaign][mission_name].required_world: - parsed_unlock = parse_unlock(unlock) - # TODO prophecy-only wants to connect to WoL here - index = parsed_unlock.connect_to - 1 - unlock_mission = list(ctx.mission_req_table[parsed_unlock.campaign])[index] - unlock_campaign = ctx.find_campaign(unlock_mission) - if unlock_campaign in unlocks: - if index not in unlocks[unlock_campaign]: - unlocks[unlock_campaign][index] = list() - unlocks[unlock_campaign][index].append(mission_name) - - if mission_reqs_completed(ctx, mission_name, missions_complete): - available_missions.append(mission_name) - - return available_missions - - -def parse_unlock(unlock: typing.Union[typing.Dict[typing.Literal["connect_to", "campaign"], int], MissionConnection, int]) -> MissionConnection: - if isinstance(unlock, int): - # Legacy - return MissionConnection(unlock) - elif isinstance(unlock, MissionConnection): - return unlock - else: - # Multi-campaign - return MissionConnection(unlock["connect_to"], lookup_id_to_campaign[unlock["campaign"]]) - - -def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int) -> bool: - """Returns a bool signifying if the mission has all requirements complete and can be done - - Arguments: - ctx -- instance of SC2Context - locations_to_check -- the mission string name to check - missions_complete -- an int of how many missions have been completed - mission_path -- a list of missions that have already been checked - """ - campaign = ctx.find_campaign(mission_name) - - if len(ctx.mission_req_table[campaign][mission_name].required_world) >= 1: - # A check for when the requirements are being or'd - or_success = False - - # Loop through required missions - for req_mission in ctx.mission_req_table[campaign][mission_name].required_world: - req_success = True - parsed_req_mission = parse_unlock(req_mission) - - # Check if required mission has been completed - mission_id = ctx.mission_req_table[parsed_req_mission.campaign][ - list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1]].mission.id - if not (mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations: - if not ctx.mission_req_table[campaign][mission_name].or_requirements: - return False - else: - req_success = False - - # Grid-specific logic (to avoid long path checks and infinite recursion) - if ctx.mission_order in (MissionOrder.option_grid, MissionOrder.option_mini_grid, MissionOrder.option_medium_grid): - if req_success: - return True - else: - if parsed_req_mission == ctx.mission_req_table[campaign][mission_name].required_world[-1]: - return False - else: - continue - - # Recursively check required mission to see if it's requirements are met, in case !collect has been done - # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion - if not mission_reqs_completed(ctx, list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1], missions_complete): - if not ctx.mission_req_table[campaign][mission_name].or_requirements: - return False - else: - req_success = False - - # If requirement check succeeded mark or as satisfied - if ctx.mission_req_table[campaign][mission_name].or_requirements and req_success: - or_success = True - - if ctx.mission_req_table[campaign][mission_name].or_requirements: - # Return false if or requirements not met - if not or_success: - return False - - # Check number of missions - if missions_complete >= ctx.mission_req_table[campaign][mission_name].number: - return True - else: - return False - else: - return True - - -def initialize_blank_mission_dict(location_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]]): - unlocks: typing.Dict[SC2Campaign, typing.Dict] = {} - - for mission in list(location_table): - unlocks[mission] = {} - - return unlocks - - -def check_game_install_path() -> bool: - # First thing: go to the default location for ExecuteInfo. - # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. - if is_windows: - # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. - # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# - import ctypes.wintypes - CSIDL_PERSONAL = 5 # My Documents - SHGFP_TYPE_CURRENT = 0 # Get current, not default value - - buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) - documentspath: str = buf.value - einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) - else: - einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) - - # Check if the file exists. - if os.path.isfile(einfo): - - # Open the file and read it, picking out the latest executable's path. - with open(einfo) as f: - content = f.read() - if content: - search_result = re.search(r" = (.*)Versions", content) - if not search_result: - sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, " - "then try again.") - return False - base = search_result.group(1) - - if os.path.exists(base): - executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") - - # Finally, check the path for an actual executable. - # If we find one, great. Set up the SC2PATH. - if os.path.isfile(executable): - sc2_logger.info(f"Found an SC2 install at {base}!") - sc2_logger.debug(f"Latest executable at {executable}.") - os.environ["SC2PATH"] = base - sc2_logger.debug(f"SC2PATH set to {base}.") - return True - else: - sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") - else: - sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") - else: - sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " - f"If that fails, please run /set_path with your SC2 install directory.") - return False - - -def is_mod_installed_correctly() -> bool: - """Searches for all required files.""" - if "SC2PATH" not in os.environ: - check_game_install_path() - sc2_path: str = os.environ["SC2PATH"] - mapdir = sc2_path / Path('Maps/ArchipelagoCampaign') - mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerSuper", "ArchipelagoPatches", - "ArchipelagoTriggers", "ArchipelagoPlayerWoL", "ArchipelagoPlayerHotS", - "ArchipelagoPlayerLotV", "ArchipelagoPlayerLotVPrologue", "ArchipelagoPlayerNCO"] - modfiles = [sc2_path / Path("Mods/" + mod + ".SC2Mod") for mod in mods] - wol_required_maps: typing.List[str] = ["WoL" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission - if mission.campaign in (SC2Campaign.WOL, SC2Campaign.PROPHECY)] - hots_required_maps: typing.List[str] = ["HotS" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.HOTS]] - lotv_required_maps: typing.List[str] = ["LotV" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission - if mission.campaign in (SC2Campaign.LOTV, SC2Campaign.PROLOGUE, SC2Campaign.EPILOGUE)] - nco_required_maps: typing.List[str] = ["NCO" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.NCO]] - required_maps = wol_required_maps + hots_required_maps + lotv_required_maps + nco_required_maps - needs_files = False - - # Check for maps. - missing_maps: typing.List[str] = [] - for mapfile in required_maps: - if not os.path.isfile(mapdir / mapfile): - missing_maps.append(mapfile) - if len(missing_maps) >= 19: - sc2_logger.warning(f"All map files missing from {mapdir}.") - needs_files = True - elif len(missing_maps) > 0: - for map in missing_maps: - sc2_logger.debug(f"Missing {map} from {mapdir}.") - sc2_logger.warning(f"Missing {len(missing_maps)} map files.") - needs_files = True - else: # Must be no maps missing - sc2_logger.info(f"All maps found in {mapdir}.") - - # Check for mods. - for modfile in modfiles: - if os.path.isfile(modfile) or os.path.isdir(modfile): - sc2_logger.info(f"Archipelago mod found at {modfile}.") - else: - sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") - needs_files = True - - # Final verdict. - if needs_files: - sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.") - return False - else: - sc2_logger.debug(f"All map/mod files are properly installed.") - return True - - -class DllDirectory: - # Credit to Black Sliver for this code. - # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw - _old: typing.Optional[str] = None - _new: typing.Optional[str] = None - - def __init__(self, new: typing.Optional[str]): - self._new = new - - def __enter__(self): - old = self.get() - if self.set(self._new): - self._old = old - - def __exit__(self, *args): - if self._old is not None: - self.set(self._old) - - @staticmethod - def get() -> typing.Optional[str]: - if sys.platform == "win32": - n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) - buf = ctypes.create_unicode_buffer(n) - ctypes.windll.kernel32.GetDllDirectoryW(n, buf) - return buf.value - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return None - - @staticmethod - def set(s: typing.Optional[str]) -> bool: - if sys.platform == "win32": - return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return False - - -def download_latest_release_zip( - owner: str, - repo: str, - api_version: str, - metadata: typing.Optional[str] = None, - force_download=False -) -> typing.Tuple[str, typing.Optional[str]]: - """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_metadata = r1.json() - cleanup_downloaded_metadata(latest_metadata) - latest_metadata = str(latest_metadata) - # sc2_logger.info(f"Latest version: {latest_metadata}.") - else: - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.") - sc2_logger.warning(f"text: {r1.text}") - return "", metadata - - if (force_download is False) and (metadata == latest_metadata): - sc2_logger.info("Latest version already installed.") - return "", metadata - - sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.") - download_url = r1.json()["assets"][0]["browser_download_url"] - - r2 = requests.get(download_url, headers=headers) - if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): - tempdir = tempfile.gettempdir() - file = tempdir + os.sep + f"{repo}.zip" - with open(file, "wb") as fh: - fh.write(r2.content) - sc2_logger.info(f"Successfully downloaded {repo}.zip.") - return file, latest_metadata - else: - sc2_logger.warning(f"Status code: {r2.status_code}") - sc2_logger.warning("Download failed.") - sc2_logger.warning(f"text: {r2.text}") - return "", metadata - - -def cleanup_downloaded_metadata(medatada_json: dict) -> None: - for asset in medatada_json['assets']: - del asset['download_count'] - - -def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool: - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_metadata = r1.json() - cleanup_downloaded_metadata(latest_metadata) - latest_metadata = str(latest_metadata) - if metadata != latest_metadata: - return True - else: - return False - - else: - sc2_logger.warning(f"Failed to reach GitHub while checking for updates.") - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"text: {r1.text}") - return False - - -def get_location_offset(mission_id): - return SC2WOL_LOC_ID_OFFSET if mission_id <= SC2Mission.ALL_IN.id \ - else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) - - -def launch(): - colorama.just_fix_windows_console() - asyncio.run(main()) - colorama.deinit() diff --git a/worlds/sc2/ClientGui.py b/worlds/sc2/ClientGui.py deleted file mode 100644 index d16acad8..00000000 --- a/worlds/sc2/ClientGui.py +++ /dev/null @@ -1,306 +0,0 @@ -from typing import * -import asyncio - -from NetUtils import JSONMessagePart -from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser -from kivy.app import App -from kivy.clock import Clock -from kivy.uix.gridlayout import GridLayout -from kivy.lang import Builder -from kivy.uix.label import Label -from kivy.uix.button import Button -from kivymd.uix.tooltip import MDTooltip -from kivy.uix.scrollview import ScrollView -from kivy.properties import StringProperty - -from .Client import SC2Context, calc_unfinished_missions, parse_unlock -from .MissionTables import (lookup_id_to_mission, lookup_name_to_mission, campaign_race_exceptions, SC2Mission, SC2Race, - SC2Campaign) -from .Locations import LocationType, lookup_location_id_to_type -from .Options import LocationInclusion -from . import SC2World, get_first_mission - - -class HoverableButton(HoverBehavior, Button): - pass - - -class MissionButton(HoverableButton, MDTooltip): - tooltip_text = StringProperty("Test") - - def __init__(self, *args, **kwargs): - super(HoverableButton, self).__init__(**kwargs) - self._tooltip = ServerToolTip(text=self.text, markup=True) - self._tooltip.padding = [5, 2, 5, 2] - - def on_enter(self): - self._tooltip.text = self.tooltip_text - - if self.tooltip_text != "": - self.display_tooltip() - - def on_leave(self): - self.remove_tooltip() - - @property - def ctx(self) -> SC2Context: - return App.get_running_app().ctx - -class CampaignScroll(ScrollView): - pass - -class MultiCampaignLayout(GridLayout): - pass - -class CampaignLayout(GridLayout): - pass - -class MissionLayout(GridLayout): - pass - -class MissionCategory(GridLayout): - pass - - -class SC2JSONtoKivyParser(KivyJSONtoTextParser): - def _handle_text(self, node: JSONMessagePart): - if node.get("keep_markup", False): - for ref in node.get("refs", []): - node["text"] = f"[ref={self.ref_count}|{ref}]{node['text']}[/ref]" - self.ref_count += 1 - return super(KivyJSONtoTextParser, self)._handle_text(node) - else: - return super()._handle_text(node) - - -class SC2Manager(GameManager): - logging_pairs = [ - ("Client", "Archipelago"), - ("Starcraft2", "Starcraft2"), - ] - base_title = "Archipelago Starcraft 2 Client" - - campaign_panel: Optional[CampaignLayout] = None - last_checked_locations: Set[int] = set() - mission_id_to_button: Dict[int, MissionButton] = {} - launching: Union[bool, int] = False # if int -> mission ID - refresh_from_launching = True - first_check = True - first_mission = "" - ctx: SC2Context - - def __init__(self, ctx) -> None: - super().__init__(ctx) - self.json_to_kivy_parser = SC2JSONtoKivyParser(ctx) - - def clear_tooltip(self) -> None: - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - self.ctx.current_tooltip = None - - def build(self): - container = super().build() - - panel = self.add_client_tab("Starcraft 2 Launcher", CampaignScroll()) - self.campaign_panel = MultiCampaignLayout() - panel.content.add_widget(self.campaign_panel) - - Clock.schedule_interval(self.build_mission_table, 0.5) - - return container - - def build_mission_table(self, dt) -> None: - if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or - not self.refresh_from_launching)) or self.first_check: - assert self.campaign_panel is not None - self.refresh_from_launching = True - - self.campaign_panel.clear_widgets() - if self.ctx.mission_req_table: - self.last_checked_locations = self.ctx.checked_locations.copy() - self.first_check = False - self.first_mission = get_first_mission(self.ctx.mission_req_table) - - self.mission_id_to_button = {} - - available_missions, unfinished_missions = calc_unfinished_missions(self.ctx) - - multi_campaign_layout_height = 0 - - for campaign, missions in sorted(self.ctx.mission_req_table.items(), key=lambda item: item[0].id): - categories: Dict[str, List[str]] = {} - - # separate missions into categories - for mission_index in missions: - mission_info = self.ctx.mission_req_table[campaign][mission_index] - if mission_info.category not in categories: - categories[mission_info.category] = [] - - categories[mission_info.category].append(mission_index) - - max_mission_count = max(len(categories[category]) for category in categories) - if max_mission_count == 1: - campaign_layout_height = 115 - else: - campaign_layout_height = (max_mission_count + 2) * 50 - multi_campaign_layout_height += campaign_layout_height - campaign_layout = CampaignLayout(size_hint_y=None, height=campaign_layout_height) - if campaign != SC2Campaign.GLOBAL: - campaign_layout.add_widget( - Label(text=campaign.campaign_name, size_hint_y=None, height=25, outline_width=1) - ) - mission_layout = MissionLayout() - - for category in categories: - category_name_height = 0 - category_spacing = 3 - if category.startswith('_'): - category_display_name = '' - else: - category_display_name = category - category_name_height += 25 - category_spacing = 10 - category_panel = MissionCategory(padding=[category_spacing,6,category_spacing,6]) - category_panel.add_widget( - Label(text=category_display_name, size_hint_y=None, height=category_name_height, outline_width=1)) - - for mission in categories[category]: - text: str = mission - tooltip: str = "" - mission_obj: SC2Mission = lookup_name_to_mission[mission] - mission_id: int = mission_obj.id - mission_data = self.ctx.mission_req_table[campaign][mission] - remaining_locations, plando_locations, remaining_count = self.sort_unfinished_locations(mission) - # Map has uncollected locations - if mission in unfinished_missions: - if self.any_valuable_locations(remaining_locations): - text = f"[color=6495ED]{text}[/color]" - else: - text = f"[color=A0BEF4]{text}[/color]" - elif mission in available_missions: - text = f"[color=FFFFFF]{text}[/color]" - # Map requirements not met - else: - text = f"[color=a9a9a9]{text}[/color]" - tooltip = f"Requires: " - if mission_data.required_world: - tooltip += ", ".join(list(self.ctx.mission_req_table[parse_unlock(req_mission).campaign])[parse_unlock(req_mission).connect_to - 1] for - req_mission in - mission_data.required_world) - - if mission_data.number: - tooltip += " and " - if mission_data.number: - tooltip += f"{self.ctx.mission_req_table[campaign][mission].number} missions completed" - - if mission_id == self.ctx.final_mission: - if mission in available_missions: - text = f"[color=FFBC95]{mission}[/color]" - else: - text = f"[color=D0C0BE]{mission}[/color]" - if tooltip: - tooltip += "\n" - tooltip += "Final Mission" - - if remaining_count > 0: - if tooltip: - tooltip += "\n\n" - tooltip += f"-- Uncollected locations --" - for loctype in LocationType: - if len(remaining_locations[loctype]) > 0: - if loctype == LocationType.VICTORY: - tooltip += f"\n- {remaining_locations[loctype][0]}" - else: - tooltip += f"\n{self.get_location_type_title(loctype)}:\n- " - tooltip += "\n- ".join(remaining_locations[loctype]) - if len(plando_locations) > 0: - tooltip += f"\nPlando:\n- " - tooltip += "\n- ".join(plando_locations) - - MISSION_BUTTON_HEIGHT = 50 - for pad in range(mission_data.ui_vertical_padding): - column_spacer = Label(text='', size_hint_y=None, height=MISSION_BUTTON_HEIGHT) - category_panel.add_widget(column_spacer) - mission_button = MissionButton(text=text, size_hint_y=None, height=MISSION_BUTTON_HEIGHT) - mission_race = mission_obj.race - if mission_race == SC2Race.ANY: - mission_race = mission_obj.campaign.race - race = campaign_race_exceptions.get(mission_obj, mission_race) - racial_colors = { - SC2Race.TERRAN: (0.24, 0.84, 0.68), - SC2Race.ZERG: (1, 0.65, 0.37), - SC2Race.PROTOSS: (0.55, 0.7, 1) - } - if race in racial_colors: - mission_button.background_color = racial_colors[race] - mission_button.tooltip_text = tooltip - mission_button.bind(on_press=self.mission_callback) - self.mission_id_to_button[mission_id] = mission_button - category_panel.add_widget(mission_button) - - category_panel.add_widget(Label(text="")) - mission_layout.add_widget(category_panel) - campaign_layout.add_widget(mission_layout) - self.campaign_panel.add_widget(campaign_layout) - self.campaign_panel.height = multi_campaign_layout_height - - elif self.launching: - assert self.campaign_panel is not None - self.refresh_from_launching = False - - self.campaign_panel.clear_widgets() - self.campaign_panel.add_widget(Label(text="Launching Mission: " + - lookup_id_to_mission[self.launching].mission_name)) - if self.ctx.ui: - self.ctx.ui.clear_tooltip() - - def mission_callback(self, button: MissionButton) -> None: - if not self.launching: - mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button) - if self.ctx.play_mission(mission_id): - self.launching = mission_id - Clock.schedule_once(self.finish_launching, 10) - - def finish_launching(self, dt): - self.launching = False - - def sort_unfinished_locations(self, mission_name: str) -> Tuple[Dict[LocationType, List[str]], List[str], int]: - locations: Dict[LocationType, List[str]] = {loctype: [] for loctype in LocationType} - count = 0 - for loc in self.ctx.locations_for_mission(mission_name): - if loc in self.ctx.missing_locations: - count += 1 - locations[lookup_location_id_to_type[loc]].append(self.ctx.location_names.lookup_in_game(loc)) - - plando_locations = [] - for plando_loc in self.ctx.plando_locations: - for loctype in LocationType: - if plando_loc in locations[loctype]: - locations[loctype].remove(plando_loc) - plando_locations.append(plando_loc) - - return locations, plando_locations, count - - def any_valuable_locations(self, locations: Dict[LocationType, List[str]]) -> bool: - for loctype in LocationType: - if len(locations[loctype]) > 0 and self.ctx.location_inclusions[loctype] == LocationInclusion.option_enabled: - return True - return False - - def get_location_type_title(self, location_type: LocationType) -> str: - title = location_type.name.title().replace("_", " ") - if self.ctx.location_inclusions[location_type] == LocationInclusion.option_disabled: - title += " (Nothing)" - elif self.ctx.location_inclusions[location_type] == LocationInclusion.option_resources: - title += " (Resources)" - else: - title += "" - return title - -def start_gui(context: SC2Context): - context.ui = SC2Manager(context) - context.ui_task = asyncio.create_task(context.ui.async_run(), name="UI") - import pkgutil - data = pkgutil.get_data(SC2World.__module__, "Starcraft2.kv").decode() - Builder.load_string(data) diff --git a/worlds/sc2/ItemGroups.py b/worlds/sc2/ItemGroups.py deleted file mode 100644 index 3a373304..00000000 --- a/worlds/sc2/ItemGroups.py +++ /dev/null @@ -1,100 +0,0 @@ -import typing -from . import Items, ItemNames -from .MissionTables import campaign_mission_table, SC2Campaign, SC2Mission - -""" -Item name groups, given to Archipelago and used in YAMLs and /received filtering. -For non-developers the following will be useful: -* Items with a bracket get groups named after the unbracketed part - * eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI" - * The exception to this are item names that would be ambiguous (eg. "Resource Efficiency") -* Item flaggroups get unique groups as well as combined groups for numbered flaggroups - * eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6" - * The best place to look these up is at the bottom of Items.py -* Items that have a parent are grouped together - * eg. "Zergling Items" contains all items that have "Zergling" as a parent - * These groups do NOT contain the parent item - * This currently does not include items with multiple potential parents, like some LotV unit upgrades -* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any") -* Hand-crafted item groups can be found at the bottom of this file -""" - -item_name_groups: typing.Dict[str, typing.List[str]] = {} - -# Groups for use in world logic -item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission] -item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \ - ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]] - -# These item name groups should not show up in documentation -unlisted_item_name_groups = { - "Missions", "WoL Missions" -} - -# Some item names only differ in bracketed parts -# These items are ambiguous for short-hand name groups -bracketless_duplicates: typing.Set[str] -# This is a list of names in ItemNames with bracketed parts removed, for internal use -_shortened_names = [(name[:name.find(' (')] if '(' in name else name) - for name in [ItemNames.__dict__[name] for name in ItemNames.__dir__() if not name.startswith('_')]] -# Remove the first instance of every short-name from the full item list -bracketless_duplicates = set(_shortened_names) -for name in bracketless_duplicates: - _shortened_names.remove(name) -# The remaining short-names are the duplicates -bracketless_duplicates = set(_shortened_names) -del _shortened_names - -# All items get sorted into their data type -for item, data in Items.get_full_item_list().items(): - # Items get assigned to their flaggroup's type - item_name_groups.setdefault(data.type, []).append(item) - # Numbered flaggroups get sorted into an unnumbered group - # Currently supports numbers of one or two digits - if data.type[-2:].strip().isnumeric(): - type_group = data.type[:-2].strip() - item_name_groups.setdefault(type_group, []).append(item) - # Flaggroups with numbers are unlisted - unlisted_item_name_groups.add(data.type) - # Items with a bracket get a short-hand name group for ease of use in YAMLs - if '(' in item: - short_name = item[:item.find(' (')] - # Ambiguous short-names are dropped - if short_name not in bracketless_duplicates: - item_name_groups[short_name] = [item] - # Short-name groups are unlisted - unlisted_item_name_groups.add(short_name) - # Items with a parent get assigned to their parent's group - if data.parent_item: - # The parent groups need a special name, otherwise they are ambiguous with the parent - parent_group = f"{data.parent_item} Items" - item_name_groups.setdefault(parent_group, []).append(item) - # Parent groups are unlisted - unlisted_item_name_groups.add(parent_group) - # All items get assigned to their race's group - race_group = data.race.name.capitalize() - item_name_groups.setdefault(race_group, []).append(item) - - -# Hand-made groups -item_name_groups["Aiur"] = [ - ItemNames.ZEALOT, ItemNames.DRAGOON, ItemNames.SENTRY, ItemNames.AVENGER, ItemNames.HIGH_TEMPLAR, - ItemNames.IMMORTAL, ItemNames.REAVER, - ItemNames.PHOENIX, ItemNames.SCOUT, ItemNames.ARBITER, ItemNames.CARRIER, -] -item_name_groups["Nerazim"] = [ - ItemNames.CENTURION, ItemNames.STALKER, ItemNames.DARK_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.DARK_ARCHON, - ItemNames.ANNIHILATOR, - ItemNames.CORSAIR, ItemNames.ORACLE, ItemNames.VOID_RAY, -] -item_name_groups["Tal'Darim"] = [ - ItemNames.SUPPLICANT, ItemNames.SLAYER, ItemNames.HAVOC, ItemNames.BLOOD_HUNTER, ItemNames.ASCENDANT, - ItemNames.VANGUARD, ItemNames.WRATHWALKER, - ItemNames.DESTROYER, ItemNames.MOTHERSHIP, - ItemNames.WARP_PRISM_PHASE_BLASTER, -] -item_name_groups["Purifier"] = [ - ItemNames.SENTINEL, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.ENERGIZER, - ItemNames.COLOSSUS, ItemNames.DISRUPTOR, - ItemNames.MIRAGE, ItemNames.TEMPEST, -] \ No newline at end of file diff --git a/worlds/sc2/ItemNames.py b/worlds/sc2/ItemNames.py deleted file mode 100644 index 10c71391..00000000 --- a/worlds/sc2/ItemNames.py +++ /dev/null @@ -1,661 +0,0 @@ -""" -A complete collection of Starcraft 2 item names as strings. -Users of this data may make some assumptions about the structure of a name: -* The upgrade for a unit will end with the unit's name in parentheses -* Weapon / armor upgrades may be grouped by a common prefix specified within this file -""" - -# Terran Units -MARINE = "Marine" -MEDIC = "Medic" -FIREBAT = "Firebat" -MARAUDER = "Marauder" -REAPER = "Reaper" -HELLION = "Hellion" -VULTURE = "Vulture" -GOLIATH = "Goliath" -DIAMONDBACK = "Diamondback" -SIEGE_TANK = "Siege Tank" -MEDIVAC = "Medivac" -WRAITH = "Wraith" -VIKING = "Viking" -BANSHEE = "Banshee" -BATTLECRUISER = "Battlecruiser" -GHOST = "Ghost" -SPECTRE = "Spectre" -THOR = "Thor" -RAVEN = "Raven" -SCIENCE_VESSEL = "Science Vessel" -PREDATOR = "Predator" -HERCULES = "Hercules" -# Extended units -LIBERATOR = "Liberator" -VALKYRIE = "Valkyrie" -WIDOW_MINE = "Widow Mine" -CYCLONE = "Cyclone" -HERC = "HERC" -WARHOUND = "Warhound" - -# Terran Buildings -BUNKER = "Bunker" -MISSILE_TURRET = "Missile Turret" -SENSOR_TOWER = "Sensor Tower" -PLANETARY_FORTRESS = "Planetary Fortress" -PERDITION_TURRET = "Perdition Turret" -HIVE_MIND_EMULATOR = "Hive Mind Emulator" -PSI_DISRUPTER = "Psi Disrupter" - -# Terran Weapon / Armor Upgrades -TERRAN_UPGRADE_PREFIX = "Progressive Terran" -TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry" -TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle" -TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship" - -PROGRESSIVE_TERRAN_INFANTRY_WEAPON = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_INFANTRY_ARMOR = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_VEHICLE_WEAPON = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_VEHICLE_ARMOR = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_SHIP_WEAPON = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_SHIP_ARMOR = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_WEAPON_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_TERRAN_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_TERRAN_INFANTRY_UPGRADE = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_VEHICLE_UPGRADE = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_SHIP_UPGRADE = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Mercenaries -WAR_PIGS = "War Pigs" -DEVIL_DOGS = "Devil Dogs" -HAMMER_SECURITIES = "Hammer Securities" -SPARTAN_COMPANY = "Spartan Company" -SIEGE_BREAKERS = "Siege Breakers" -HELS_ANGELS = "Hel's Angels" -DUSK_WINGS = "Dusk Wings" -JACKSONS_REVENGE = "Jackson's Revenge" -SKIBIS_ANGELS = "Skibi's Angels" -DEATH_HEADS = "Death Heads" -WINGED_NIGHTMARES = "Winged Nightmares" -MIDNIGHT_RIDERS = "Midnight Riders" -BRYNHILDS = "Brynhilds" -JOTUN = "Jotun" - -# Lab / Global -ULTRA_CAPACITORS = "Ultra-Capacitors" -VANADIUM_PLATING = "Vanadium Plating" -ORBITAL_DEPOTS = "Orbital Depots" -MICRO_FILTERING = "Micro-Filtering" -AUTOMATED_REFINERY = "Automated Refinery" -COMMAND_CENTER_REACTOR = "Command Center Reactor" -TECH_REACTOR = "Tech Reactor" -ORBITAL_STRIKE = "Orbital Strike" -CELLULAR_REACTOR = "Cellular Reactor" -PROGRESSIVE_REGENERATIVE_BIO_STEEL = "Progressive Regenerative Bio-Steel" -PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System" -PROGRESSIVE_ORBITAL_COMMAND = "Progressive Orbital Command" -STRUCTURE_ARMOR = "Structure Armor" -HI_SEC_AUTO_TRACKING = "Hi-Sec Auto Tracking" -ADVANCED_OPTICS = "Advanced Optics" -ROGUE_FORCES = "Rogue Forces" - -# Terran Unit Upgrades -BANSHEE_HYPERFLIGHT_ROTORS = "Hyperflight Rotors (Banshee)" -BANSHEE_INTERNAL_TECH_MODULE = "Internal Tech Module (Banshee)" -BANSHEE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Banshee)" -BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS = "Progressive Cross-Spectrum Dampeners (Banshee)" -BANSHEE_SHOCKWAVE_MISSILE_BATTERY = "Shockwave Missile Battery (Banshee)" -BANSHEE_SHAPED_HULL = "Shaped Hull (Banshee)" -BANSHEE_ADVANCED_TARGETING_OPTICS = "Advanced Targeting Optics (Banshee)" -BANSHEE_DISTORTION_BLASTERS = "Distortion Blasters (Banshee)" -BANSHEE_ROCKET_BARRAGE = "Rocket Barrage (Banshee)" -BATTLECRUISER_ATX_LASER_BATTERY = "ATX Laser Battery (Battlecruiser)" -BATTLECRUISER_CLOAK = "Cloak (Battlecruiser)" -BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX = "Progressive Defensive Matrix (Battlecruiser)" -BATTLECRUISER_INTERNAL_TECH_MODULE = "Internal Tech Module (Battlecruiser)" -BATTLECRUISER_PROGRESSIVE_MISSILE_PODS = "Progressive Missile Pods (Battlecruiser)" -BATTLECRUISER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Battlecruiser)" -BATTLECRUISER_TACTICAL_JUMP = "Tactical Jump (Battlecruiser)" -BATTLECRUISER_BEHEMOTH_PLATING = "Behemoth Plating (Battlecruiser)" -BATTLECRUISER_COVERT_OPS_ENGINES = "Covert Ops Engines (Battlecruiser)" -BUNKER_NEOSTEEL_BUNKER = "Neosteel Bunker (Bunker)" -BUNKER_PROJECTILE_ACCELERATOR = "Projectile Accelerator (Bunker)" -BUNKER_SHRIKE_TURRET = "Shrike Turret (Bunker)" -BUNKER_FORTIFIED_BUNKER = "Fortified Bunker (Bunker)" -CYCLONE_MAG_FIELD_ACCELERATORS = "Mag-Field Accelerators (Cyclone)" -CYCLONE_MAG_FIELD_LAUNCHERS = "Mag-Field Launchers (Cyclone)" -CYCLONE_RAPID_FIRE_LAUNCHERS = "Rapid Fire Launchers (Cyclone)" -CYCLONE_TARGETING_OPTICS = "Targeting Optics (Cyclone)" -CYCLONE_RESOURCE_EFFICIENCY = "Resource Efficiency (Cyclone)" -CYCLONE_INTERNAL_TECH_MODULE = "Internal Tech Module (Cyclone)" -DIAMONDBACK_BURST_CAPACITORS = "Burst Capacitors (Diamondback)" -DIAMONDBACK_HYPERFLUXOR = "Hyperfluxor (Diamondback)" -DIAMONDBACK_RESOURCE_EFFICIENCY = "Resource Efficiency (Diamondback)" -DIAMONDBACK_SHAPED_HULL = "Shaped Hull (Diamondback)" -DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL = "Progressive Tri-Lithium Power Cell (Diamondback)" -DIAMONDBACK_ION_THRUSTERS = "Ion Thrusters (Diamondback)" -FIREBAT_INCINERATOR_GAUNTLETS = "Incinerator Gauntlets (Firebat)" -FIREBAT_JUGGERNAUT_PLATING = "Juggernaut Plating (Firebat)" -FIREBAT_RESOURCE_EFFICIENCY = "Resource Efficiency (Firebat)" -FIREBAT_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Firebat)" -FIREBAT_INFERNAL_PRE_IGNITER = "Infernal Pre-Igniter (Firebat)" -FIREBAT_KINETIC_FOAM = "Kinetic Foam (Firebat)" -FIREBAT_NANO_PROJECTORS = "Nano Projectors (Firebat)" -GHOST_CRIUS_SUIT = "Crius Suit (Ghost)" -GHOST_EMP_ROUNDS = "EMP Rounds (Ghost)" -GHOST_LOCKDOWN = "Lockdown (Ghost)" -GHOST_OCULAR_IMPLANTS = "Ocular Implants (Ghost)" -GHOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Ghost)" -GOLIATH_ARES_CLASS_TARGETING_SYSTEM = "Ares-Class Targeting System (Goliath)" -GOLIATH_JUMP_JETS = "Jump Jets (Goliath)" -GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM = "Multi-Lock Weapons System (Goliath)" -GOLIATH_OPTIMIZED_LOGISTICS = "Optimized Logistics (Goliath)" -GOLIATH_SHAPED_HULL = "Shaped Hull (Goliath)" -GOLIATH_RESOURCE_EFFICIENCY = "Resource Efficiency (Goliath)" -GOLIATH_INTERNAL_TECH_MODULE = "Internal Tech Module (Goliath)" -HELLION_HELLBAT_ASPECT = "Hellbat Aspect (Hellion)" -HELLION_JUMP_JETS = "Jump Jets (Hellion)" -HELLION_OPTIMIZED_LOGISTICS = "Optimized Logistics (Hellion)" -HELLION_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Hellion)" -HELLION_SMART_SERVOS = "Smart Servos (Hellion)" -HELLION_THERMITE_FILAMENTS = "Thermite Filaments (Hellion)" -HELLION_TWIN_LINKED_FLAMETHROWER = "Twin-Linked Flamethrower (Hellion)" -HELLION_INFERNAL_PLATING = "Infernal Plating (Hellion)" -HERC_JUGGERNAUT_PLATING = "Juggernaut Plating (HERC)" -HERC_KINETIC_FOAM = "Kinetic Foam (HERC)" -HERC_RESOURCE_EFFICIENCY = "Resource Efficiency (HERC)" -HERCULES_INTERNAL_FUSION_MODULE = "Internal Fusion Module (Hercules)" -HERCULES_TACTICAL_JUMP = "Tactical Jump (Hercules)" -LIBERATOR_ADVANCED_BALLISTICS = "Advanced Ballistics (Liberator)" -LIBERATOR_CLOAK = "Cloak (Liberator)" -LIBERATOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Liberator)" -LIBERATOR_OPTIMIZED_LOGISTICS = "Optimized Logistics (Liberator)" -LIBERATOR_RAID_ARTILLERY = "Raid Artillery (Liberator)" -LIBERATOR_SMART_SERVOS = "Smart Servos (Liberator)" -LIBERATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Liberator)" -MARAUDER_CONCUSSIVE_SHELLS = "Concussive Shells (Marauder)" -MARAUDER_INTERNAL_TECH_MODULE = "Internal Tech Module (Marauder)" -MARAUDER_KINETIC_FOAM = "Kinetic Foam (Marauder)" -MARAUDER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marauder)" -MARAUDER_MAGRAIL_MUNITIONS = "Magrail Munitions (Marauder)" -MARAUDER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marauder)" -MARAUDER_JUGGERNAUT_PLATING = "Juggernaut Plating (Marauder)" -MARINE_COMBAT_SHIELD = "Combat Shield (Marine)" -MARINE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marine)" -MARINE_MAGRAIL_MUNITIONS = "Magrail Munitions (Marine)" -MARINE_OPTIMIZED_LOGISTICS = "Optimized Logistics (Marine)" -MARINE_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marine)" -MEDIC_ADVANCED_MEDIC_FACILITIES = "Advanced Medic Facilities (Medic)" -MEDIC_OPTICAL_FLARE = "Optical Flare (Medic)" -MEDIC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medic)" -MEDIC_RESTORATION = "Restoration (Medic)" -MEDIC_STABILIZER_MEDPACKS = "Stabilizer Medpacks (Medic)" -MEDIC_ADAPTIVE_MEDPACKS = "Adaptive Medpacks (Medic)" -MEDIC_NANO_PROJECTOR = "Nano Projector (Medic)" -MEDIVAC_ADVANCED_HEALING_AI = "Advanced Healing AI (Medivac)" -MEDIVAC_AFTERBURNERS = "Afterburners (Medivac)" -MEDIVAC_EXPANDED_HULL = "Expanded Hull (Medivac)" -MEDIVAC_RAPID_DEPLOYMENT_TUBE = "Rapid Deployment Tube (Medivac)" -MEDIVAC_SCATTER_VEIL = "Scatter Veil (Medivac)" -MEDIVAC_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Medivac)" -MISSILE_TURRET_HELLSTORM_BATTERIES = "Hellstorm Batteries (Missile Turret)" -MISSILE_TURRET_TITANIUM_HOUSING = "Titanium Housing (Missile Turret)" -PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)" -PLANETARY_FORTRESS_ADVANCED_TARGETING = "Advanced Targeting (Planetary Fortress)" -PREDATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Predator)" -PREDATOR_CLOAK = "Cloak (Predator)" -PREDATOR_CHARGE = "Charge (Predator)" -PREDATOR_PREDATOR_S_FURY = "Predator's Fury (Predator)" -RAVEN_ANTI_ARMOR_MISSILE = "Anti-Armor Missile (Raven)" -RAVEN_BIO_MECHANICAL_REPAIR_DRONE = "Bio Mechanical Repair Drone (Raven)" -RAVEN_HUNTER_SEEKER_WEAPON = "Hunter-Seeker Weapon (Raven)" -RAVEN_INTERFERENCE_MATRIX = "Interference Matrix (Raven)" -RAVEN_INTERNAL_TECH_MODULE = "Internal Tech Module (Raven)" -RAVEN_RAILGUN_TURRET = "Railgun Turret (Raven)" -RAVEN_SPIDER_MINES = "Spider Mines (Raven)" -RAVEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Raven)" -RAVEN_DURABLE_MATERIALS = "Durable Materials (Raven)" -REAPER_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Reaper)" -REAPER_COMBAT_DRUGS = "Combat Drugs (Reaper)" -REAPER_G4_CLUSTERBOMB = "G-4 Clusterbomb (Reaper)" -REAPER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Reaper)" -REAPER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Reaper)" -REAPER_SPIDER_MINES = "Spider Mines (Reaper)" -REAPER_U238_ROUNDS = "U-238 Rounds (Reaper)" -REAPER_JET_PACK_OVERDRIVE = "Jet Pack Overdrive (Reaper)" -SCIENCE_VESSEL_DEFENSIVE_MATRIX = "Defensive Matrix (Science Vessel)" -SCIENCE_VESSEL_EMP_SHOCKWAVE = "EMP Shockwave (Science Vessel)" -SCIENCE_VESSEL_IMPROVED_NANO_REPAIR = "Improved Nano-Repair (Science Vessel)" -SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS = "Advanced AI Systems (Science Vessel)" -SCV_ADVANCED_CONSTRUCTION = "Advanced Construction (SCV)" -SCV_DUAL_FUSION_WELDERS = "Dual-Fusion Welders (SCV)" -SCV_HOSTILE_ENVIRONMENT_ADAPTATION = "Hostile Environment Adaptation (SCV)" -SIEGE_TANK_ADVANCED_SIEGE_TECH = "Advanced Siege Tech (Siege Tank)" -SIEGE_TANK_GRADUATING_RANGE = "Graduating Range (Siege Tank)" -SIEGE_TANK_INTERNAL_TECH_MODULE = "Internal Tech Module (Siege Tank)" -SIEGE_TANK_JUMP_JETS = "Jump Jets (Siege Tank)" -SIEGE_TANK_LASER_TARGETING_SYSTEM = "Laser Targeting System (Siege Tank)" -SIEGE_TANK_MAELSTROM_ROUNDS = "Maelstrom Rounds (Siege Tank)" -SIEGE_TANK_SHAPED_BLAST = "Shaped Blast (Siege Tank)" -SIEGE_TANK_SMART_SERVOS = "Smart Servos (Siege Tank)" -SIEGE_TANK_SPIDER_MINES = "Spider Mines (Siege Tank)" -SIEGE_TANK_SHAPED_HULL = "Shaped Hull (Siege Tank)" -SIEGE_TANK_RESOURCE_EFFICIENCY = "Resource Efficiency (Siege Tank)" -SPECTRE_IMPALER_ROUNDS = "Impaler Rounds (Spectre)" -SPECTRE_NYX_CLASS_CLOAKING_MODULE = "Nyx-Class Cloaking Module (Spectre)" -SPECTRE_PSIONIC_LASH = "Psionic Lash (Spectre)" -SPECTRE_RESOURCE_EFFICIENCY = "Resource Efficiency (Spectre)" -SPIDER_MINE_CERBERUS_MINE = "Cerberus Mine (Spider Mine)" -SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION = "High Explosive Munition (Spider Mine)" -THOR_330MM_BARRAGE_CANNON = "330mm Barrage Cannon (Thor)" -THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL = "Progressive Immortality Protocol (Thor)" -THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD = "Progressive High Impact Payload (Thor)" -THOR_BUTTON_WITH_A_SKULL_ON_IT = "Button With a Skull on It (Thor)" -THOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Thor)" -THOR_LARGE_SCALE_FIELD_CONSTRUCTION = "Large Scale Field Construction (Thor)" -VALKYRIE_AFTERBURNERS = "Afterburners (Valkyrie)" -VALKYRIE_FLECHETTE_MISSILES = "Flechette Missiles (Valkyrie)" -VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS = "Enhanced Cluster Launchers (Valkyrie)" -VALKYRIE_SHAPED_HULL = "Shaped Hull (Valkyrie)" -VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR = "Launching Vector Compensator (Valkyrie)" -VALKYRIE_RESOURCE_EFFICIENCY = "Resource Efficiency (Valkyrie)" -VIKING_ANTI_MECHANICAL_MUNITION = "Anti-Mechanical Munition (Viking)" -VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM = "Phobos-Class Weapons System (Viking)" -VIKING_RIPWAVE_MISSILES = "Ripwave Missiles (Viking)" -VIKING_SMART_SERVOS = "Smart Servos (Viking)" -VIKING_SHREDDER_ROUNDS = "Shredder Rounds (Viking)" -VIKING_WILD_MISSILES = "W.I.L.D. Missiles (Viking)" -VULTURE_AUTO_LAUNCHERS = "Auto Launchers (Vulture)" -VULTURE_ION_THRUSTERS = "Ion Thrusters (Vulture)" -VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE = "Progressive Replenishable Magazine (Vulture)" -VULTURE_AUTO_REPAIR = "Auto-Repair (Vulture)" -WARHOUND_RESOURCE_EFFICIENCY = "Resource Efficiency (Warhound)" -WARHOUND_REINFORCED_PLATING = "Reinforced Plating (Warhound)" -WIDOW_MINE_BLACK_MARKET_LAUNCHERS = "Black Market Launchers (Widow Mine)" -WIDOW_MINE_CONCEALMENT = "Concealment (Widow Mine)" -WIDOW_MINE_DRILLING_CLAWS = "Drilling Claws (Widow Mine)" -WIDOW_MINE_EXECUTIONER_MISSILES = "Executioner Missiles (Widow Mine)" -WRAITH_ADVANCED_LASER_TECHNOLOGY = "Advanced Laser Technology (Wraith)" -WRAITH_DISPLACEMENT_FIELD = "Displacement Field (Wraith)" -WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS = "Progressive Tomahawk Power Cells (Wraith)" -WRAITH_TRIGGER_OVERRIDE = "Trigger Override (Wraith)" -WRAITH_INTERNAL_TECH_MODULE = "Internal Tech Module (Wraith)" -WRAITH_RESOURCE_EFFICIENCY = "Resource Efficiency (Wraith)" - -# Nova -NOVA_GHOST_VISOR = "Ghost Visor (Nova Equipment)" -NOVA_RANGEFINDER_OCULUS = "Rangefinder Oculus (Nova Equipment)" -NOVA_DOMINATION = "Domination (Nova Ability)" -NOVA_BLINK = "Blink (Nova Ability)" -NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE = "Progressive Stealth Suit Module (Nova Suit Module)" -NOVA_ENERGY_SUIT_MODULE = "Energy Suit Module (Nova Suit Module)" -NOVA_ARMORED_SUIT_MODULE = "Armored Suit Module (Nova Suit Module)" -NOVA_JUMP_SUIT_MODULE = "Jump Suit Module (Nova Suit Module)" -NOVA_C20A_CANISTER_RIFLE = "C20A Canister Rifle (Nova Weapon)" -NOVA_HELLFIRE_SHOTGUN = "Hellfire Shotgun (Nova Weapon)" -NOVA_PLASMA_RIFLE = "Plasma Rifle (Nova Weapon)" -NOVA_MONOMOLECULAR_BLADE = "Monomolecular Blade (Nova Weapon)" -NOVA_BLAZEFIRE_GUNBLADE = "Blazefire Gunblade (Nova Weapon)" -NOVA_STIM_INFUSION = "Stim Infusion (Nova Gadget)" -NOVA_PULSE_GRENADES = "Pulse Grenades (Nova Gadget)" -NOVA_FLASHBANG_GRENADES = "Flashbang Grenades (Nova Gadget)" -NOVA_IONIC_FORCE_FIELD = "Ionic Force Field (Nova Gadget)" -NOVA_HOLO_DECOY = "Holo Decoy (Nova Gadget)" -NOVA_NUKE = "Tac Nuke Strike (Nova Ability)" - -# Zerg Units -ZERGLING = "Zergling" -SWARM_QUEEN = "Swarm Queen" -ROACH = "Roach" -HYDRALISK = "Hydralisk" -ABERRATION = "Aberration" -MUTALISK = "Mutalisk" -SWARM_HOST = "Swarm Host" -INFESTOR = "Infestor" -ULTRALISK = "Ultralisk" -CORRUPTOR = "Corruptor" -SCOURGE = "Scourge" -BROOD_QUEEN = "Brood Queen" -DEFILER = "Defiler" - -# Zerg Buildings -SPORE_CRAWLER = "Spore Crawler" -SPINE_CRAWLER = "Spine Crawler" - -# Zerg Weapon / Armor Upgrades -ZERG_UPGRADE_PREFIX = "Progressive Zerg" -ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer" - -PROGRESSIVE_ZERG_MELEE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Melee Attack" -PROGRESSIVE_ZERG_MISSILE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Missile Attack" -PROGRESSIVE_ZERG_GROUND_CARAPACE = f"{ZERG_UPGRADE_PREFIX} Ground Carapace" -PROGRESSIVE_ZERG_FLYER_ATTACK = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack" -PROGRESSIVE_ZERG_FLYER_CARAPACE = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace" -PROGRESSIVE_ZERG_WEAPON_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_ZERG_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_ZERG_GROUND_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade" -PROGRESSIVE_ZERG_FLYER_UPGRADE = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Zerg Unit Upgrades -ZERGLING_HARDENED_CARAPACE = "Hardened Carapace (Zergling)" -ZERGLING_ADRENAL_OVERLOAD = "Adrenal Overload (Zergling)" -ZERGLING_METABOLIC_BOOST = "Metabolic Boost (Zergling)" -ZERGLING_SHREDDING_CLAWS = "Shredding Claws (Zergling)" -ROACH_HYDRIODIC_BILE = "Hydriodic Bile (Roach)" -ROACH_ADAPTIVE_PLATING = "Adaptive Plating (Roach)" -ROACH_TUNNELING_CLAWS = "Tunneling Claws (Roach)" -ROACH_GLIAL_RECONSTITUTION = "Glial Reconstitution (Roach)" -ROACH_ORGANIC_CARAPACE = "Organic Carapace (Roach)" -HYDRALISK_FRENZY = "Frenzy (Hydralisk)" -HYDRALISK_ANCILLARY_CARAPACE = "Ancillary Carapace (Hydralisk)" -HYDRALISK_GROOVED_SPINES = "Grooved Spines (Hydralisk)" -HYDRALISK_MUSCULAR_AUGMENTS = "Muscular Augments (Hydralisk)" -HYDRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Hydralisk)" -BANELING_CORROSIVE_ACID = "Corrosive Acid (Baneling)" -BANELING_RUPTURE = "Rupture (Baneling)" -BANELING_REGENERATIVE_ACID = "Regenerative Acid (Baneling)" -BANELING_CENTRIFUGAL_HOOKS = "Centrifugal Hooks (Baneling)" -BANELING_TUNNELING_JAWS = "Tunneling Jaws (Baneling)" -BANELING_RAPID_METAMORPH = "Rapid Metamorph (Baneling)" -MUTALISK_VICIOUS_GLAIVE = "Vicious Glaive (Mutalisk)" -MUTALISK_RAPID_REGENERATION = "Rapid Regeneration (Mutalisk)" -MUTALISK_SUNDERING_GLAIVE = "Sundering Glaive (Mutalisk)" -MUTALISK_SEVERING_GLAIVE = "Severing Glaive (Mutalisk)" -MUTALISK_AERODYNAMIC_GLAIVE_SHAPE = "Aerodynamic Glaive Shape (Mutalisk)" -SWARM_HOST_BURROW = "Burrow (Swarm Host)" -SWARM_HOST_RAPID_INCUBATION = "Rapid Incubation (Swarm Host)" -SWARM_HOST_PRESSURIZED_GLANDS = "Pressurized Glands (Swarm Host)" -SWARM_HOST_LOCUST_METABOLIC_BOOST = "Locust Metabolic Boost (Swarm Host)" -SWARM_HOST_ENDURING_LOCUSTS = "Enduring Locusts (Swarm Host)" -SWARM_HOST_ORGANIC_CARAPACE = "Organic Carapace (Swarm Host)" -SWARM_HOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Host)" -ULTRALISK_BURROW_CHARGE = "Burrow Charge (Ultralisk)" -ULTRALISK_TISSUE_ASSIMILATION = "Tissue Assimilation (Ultralisk)" -ULTRALISK_MONARCH_BLADES = "Monarch Blades (Ultralisk)" -ULTRALISK_ANABOLIC_SYNTHESIS = "Anabolic Synthesis (Ultralisk)" -ULTRALISK_CHITINOUS_PLATING = "Chitinous Plating (Ultralisk)" -ULTRALISK_ORGANIC_CARAPACE = "Organic Carapace (Ultralisk)" -ULTRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Ultralisk)" -CORRUPTOR_CORRUPTION = "Corruption (Corruptor)" -CORRUPTOR_CAUSTIC_SPRAY = "Caustic Spray (Corruptor)" -SCOURGE_VIRULENT_SPORES = "Virulent Spores (Scourge)" -SCOURGE_RESOURCE_EFFICIENCY = "Resource Efficiency (Scourge)" -SCOURGE_SWARM_SCOURGE = "Swarm Scourge (Scourge)" -DEVOURER_CORROSIVE_SPRAY = "Corrosive Spray (Devourer)" -DEVOURER_GAPING_MAW = "Gaping Maw (Devourer)" -DEVOURER_IMPROVED_OSMOSIS = "Improved Osmosis (Devourer)" -DEVOURER_PRESCIENT_SPORES = "Prescient Spores (Devourer)" -GUARDIAN_PROLONGED_DISPERSION = "Prolonged Dispersion (Guardian)" -GUARDIAN_PRIMAL_ADAPTATION = "Primal Adaptation (Guardian)" -GUARDIAN_SORONAN_ACID = "Soronan Acid (Guardian)" -IMPALER_ADAPTIVE_TALONS = "Adaptive Talons (Impaler)" -IMPALER_SECRETION_GLANDS = "Secretion Glands (Impaler)" -IMPALER_HARDENED_TENTACLE_SPINES = "Hardened Tentacle Spines (Impaler)" -LURKER_SEISMIC_SPINES = "Seismic Spines (Lurker)" -LURKER_ADAPTED_SPINES = "Adapted Spines (Lurker)" -RAVAGER_POTENT_BILE = "Potent Bile (Ravager)" -RAVAGER_BLOATED_BILE_DUCTS = "Bloated Bile Ducts (Ravager)" -RAVAGER_DEEP_TUNNEL = "Deep Tunnel (Ravager)" -VIPER_PARASITIC_BOMB = "Parasitic Bomb (Viper)" -VIPER_PARALYTIC_BARBS = "Paralytic Barbs (Viper)" -VIPER_VIRULENT_MICROBES = "Virulent Microbes (Viper)" -BROOD_LORD_POROUS_CARTILAGE = "Porous Cartilage (Brood Lord)" -BROOD_LORD_EVOLVED_CARAPACE = "Evolved Carapace (Brood Lord)" -BROOD_LORD_SPLITTER_MITOSIS = "Splitter Mitosis (Brood Lord)" -BROOD_LORD_RESOURCE_EFFICIENCY = "Resource Efficiency (Brood Lord)" -INFESTOR_INFESTED_TERRAN = "Infested Terran (Infestor)" -INFESTOR_MICROBIAL_SHROUD = "Microbial Shroud (Infestor)" -SWARM_QUEEN_SPAWN_LARVAE = "Spawn Larvae (Swarm Queen)" -SWARM_QUEEN_DEEP_TUNNEL = "Deep Tunnel (Swarm Queen)" -SWARM_QUEEN_ORGANIC_CARAPACE = "Organic Carapace (Swarm Queen)" -SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION = "Bio-Mechanical Transfusion (Swarm Queen)" -SWARM_QUEEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Queen)" -SWARM_QUEEN_INCUBATOR_CHAMBER = "Incubator Chamber (Swarm Queen)" -BROOD_QUEEN_FUNGAL_GROWTH = "Fungal Growth (Brood Queen)" -BROOD_QUEEN_ENSNARE = "Ensnare (Brood Queen)" -BROOD_QUEEN_ENHANCED_MITOCHONDRIA = "Enhanced Mitochondria (Brood Queen)" - -# Zerg Strains -ZERGLING_RAPTOR_STRAIN = "Raptor Strain (Zergling)" -ZERGLING_SWARMLING_STRAIN = "Swarmling Strain (Zergling)" -ROACH_VILE_STRAIN = "Vile Strain (Roach)" -ROACH_CORPSER_STRAIN = "Corpser Strain (Roach)" -BANELING_SPLITTER_STRAIN = "Splitter Strain (Baneling)" -BANELING_HUNTER_STRAIN = "Hunter Strain (Baneling)" -SWARM_HOST_CARRION_STRAIN = "Carrion Strain (Swarm Host)" -SWARM_HOST_CREEPER_STRAIN = "Creeper Strain (Swarm Host)" -ULTRALISK_NOXIOUS_STRAIN = "Noxious Strain (Ultralisk)" -ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)" - -# Morphs -ZERGLING_BANELING_ASPECT = "Baneling Aspect (Zergling)" -HYDRALISK_IMPALER_ASPECT = "Impaler Aspect (Hydralisk)" -HYDRALISK_LURKER_ASPECT = "Lurker Aspect (Hydralisk)" -MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT = "Brood Lord Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_VIPER_ASPECT = "Viper Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_GUARDIAN_ASPECT = "Guardian Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_DEVOURER_ASPECT = "Devourer Aspect (Mutalisk/Corruptor)" -ROACH_RAVAGER_ASPECT = "Ravager Aspect (Roach)" - -# Zerg Mercs -INFESTED_MEDICS = "Infested Medics" -INFESTED_SIEGE_TANKS = "Infested Siege Tanks" -INFESTED_BANSHEES = "Infested Banshees" - -# Kerrigan Upgrades -KERRIGAN_KINETIC_BLAST = "Kinetic Blast (Kerrigan Tier 1)" -KERRIGAN_HEROIC_FORTITUDE = "Heroic Fortitude (Kerrigan Tier 1)" -KERRIGAN_LEAPING_STRIKE = "Leaping Strike (Kerrigan Tier 1)" -KERRIGAN_CRUSHING_GRIP = "Crushing Grip (Kerrigan Tier 2)" -KERRIGAN_CHAIN_REACTION = "Chain Reaction (Kerrigan Tier 2)" -KERRIGAN_PSIONIC_SHIFT = "Psionic Shift (Kerrigan Tier 2)" -KERRIGAN_WILD_MUTATION = "Wild Mutation (Kerrigan Tier 4)" -KERRIGAN_SPAWN_BANELINGS = "Spawn Banelings (Kerrigan Tier 4)" -KERRIGAN_MEND = "Mend (Kerrigan Tier 4)" -KERRIGAN_INFEST_BROODLINGS = "Infest Broodlings (Kerrigan Tier 6)" -KERRIGAN_FURY = "Fury (Kerrigan Tier 6)" -KERRIGAN_ABILITY_EFFICIENCY = "Ability Efficiency (Kerrigan Tier 6)" -KERRIGAN_APOCALYPSE = "Apocalypse (Kerrigan Tier 7)" -KERRIGAN_SPAWN_LEVIATHAN = "Spawn Leviathan (Kerrigan Tier 7)" -KERRIGAN_DROP_PODS = "Drop-Pods (Kerrigan Tier 7)" -KERRIGAN_PRIMAL_FORM = "Primal Form (Kerrigan)" - -# Misc Upgrades -KERRIGAN_ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Kerrigan Tier 3)" -KERRIGAN_IMPROVED_OVERLORDS = "Improved Overlords (Kerrigan Tier 3)" -KERRIGAN_AUTOMATED_EXTRACTORS = "Automated Extractors (Kerrigan Tier 3)" -KERRIGAN_TWIN_DRONES = "Twin Drones (Kerrigan Tier 5)" -KERRIGAN_MALIGNANT_CREEP = "Malignant Creep (Kerrigan Tier 5)" -KERRIGAN_VESPENE_EFFICIENCY = "Vespene Efficiency (Kerrigan Tier 5)" -OVERLORD_VENTRAL_SACS = "Ventral Sacs (Overlord)" - -# Kerrigan Levels -KERRIGAN_LEVELS_1 = "1 Kerrigan Level" -KERRIGAN_LEVELS_2 = "2 Kerrigan Levels" -KERRIGAN_LEVELS_3 = "3 Kerrigan Levels" -KERRIGAN_LEVELS_4 = "4 Kerrigan Levels" -KERRIGAN_LEVELS_5 = "5 Kerrigan Levels" -KERRIGAN_LEVELS_6 = "6 Kerrigan Levels" -KERRIGAN_LEVELS_7 = "7 Kerrigan Levels" -KERRIGAN_LEVELS_8 = "8 Kerrigan Levels" -KERRIGAN_LEVELS_9 = "9 Kerrigan Levels" -KERRIGAN_LEVELS_10 = "10 Kerrigan Levels" -KERRIGAN_LEVELS_14 = "14 Kerrigan Levels" -KERRIGAN_LEVELS_35 = "35 Kerrigan Levels" -KERRIGAN_LEVELS_70 = "70 Kerrigan Levels" - -# Protoss Units -ZEALOT = "Zealot" -STALKER = "Stalker" -HIGH_TEMPLAR = "High Templar" -DARK_TEMPLAR = "Dark Templar" -IMMORTAL = "Immortal" -COLOSSUS = "Colossus" -PHOENIX = "Phoenix" -VOID_RAY = "Void Ray" -CARRIER = "Carrier" -OBSERVER = "Observer" -CENTURION = "Centurion" -SENTINEL = "Sentinel" -SUPPLICANT = "Supplicant" -INSTIGATOR = "Instigator" -SLAYER = "Slayer" -SENTRY = "Sentry" -ENERGIZER = "Energizer" -HAVOC = "Havoc" -SIGNIFIER = "Signifier" -ASCENDANT = "Ascendant" -AVENGER = "Avenger" -BLOOD_HUNTER = "Blood Hunter" -DRAGOON = "Dragoon" -DARK_ARCHON = "Dark Archon" -ADEPT = "Adept" -WARP_PRISM = "Warp Prism" -ANNIHILATOR = "Annihilator" -VANGUARD = "Vanguard" -WRATHWALKER = "Wrathwalker" -REAVER = "Reaver" -DISRUPTOR = "Disruptor" -MIRAGE = "Mirage" -CORSAIR = "Corsair" -DESTROYER = "Destroyer" -SCOUT = "Scout" -TEMPEST = "Tempest" -MOTHERSHIP = "Mothership" -ARBITER = "Arbiter" -ORACLE = "Oracle" - -# Upgrades -PROTOSS_UPGRADE_PREFIX = "Progressive Protoss" -PROTOSS_GROUND_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Ground" -PROTOSS_AIR_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Air" -PROGRESSIVE_PROTOSS_GROUND_WEAPON = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_PROTOSS_GROUND_ARMOR = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor" -PROGRESSIVE_PROTOSS_SHIELDS = f"{PROTOSS_UPGRADE_PREFIX} Shields" -PROGRESSIVE_PROTOSS_AIR_WEAPON = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_PROTOSS_AIR_ARMOR = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor" -PROGRESSIVE_PROTOSS_WEAPON_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_PROTOSS_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_PROTOSS_GROUND_UPGRADE = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_PROTOSS_AIR_UPGRADE = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Buildings -PHOTON_CANNON = "Photon Cannon" -KHAYDARIN_MONOLITH = "Khaydarin Monolith" -SHIELD_BATTERY = "Shield Battery" - -# Unit Upgrades -SUPPLICANT_BLOOD_SHIELD = "Blood Shield (Supplicant)" -SUPPLICANT_SOUL_AUGMENTATION = "Soul Augmentation (Supplicant)" -SUPPLICANT_SHIELD_REGENERATION = "Shield Regeneration (Supplicant)" -ADEPT_SHOCKWAVE = "Shockwave (Adept)" -ADEPT_RESONATING_GLAIVES = "Resonating Glaives (Adept)" -ADEPT_PHASE_BULWARK = "Phase Bulwark (Adept)" -STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES = "Disintegrating Particles (Stalker/Instigator/Slayer)" -STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION = "Particle Reflection (Stalker/Instigator/Slayer)" -DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS = "High Impact Phase Disruptor (Dragoon)" -DRAGOON_TRILLIC_COMPRESSION_SYSTEM = "Trillic Compression System (Dragoon)" -DRAGOON_SINGULARITY_CHARGE = "Singularity Charge (Dragoon)" -DRAGOON_ENHANCED_STRIDER_SERVOS = "Enhanced Strider Servos (Dragoon)" -SCOUT_COMBAT_SENSOR_ARRAY = "Combat Sensor Array (Scout)" -SCOUT_APIAL_SENSORS = "Apial Sensors (Scout)" -SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout)" -SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout)" -TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)" -TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)" -TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)" -PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage)" -PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage)" -CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)" -CORSAIR_ARGUS_JEWEL = "Argus Jewel (Corsair)" -CORSAIR_SUSTAINING_DISRUPTION = "Sustaining Disruption (Corsair)" -CORSAIR_NEUTRON_SHIELDS = "Neutron Shields (Corsair)" -ORACLE_STEALTH_DRIVE = "Stealth Drive (Oracle)" -ORACLE_STASIS_CALIBRATION = "Stasis Calibration (Oracle)" -ORACLE_TEMPORAL_ACCELERATION_BEAM = "Temporal Acceleration Beam (Oracle)" -ARBITER_CHRONOSTATIC_REINFORCEMENT = "Chronostatic Reinforcement (Arbiter)" -ARBITER_KHAYDARIN_CORE = "Khaydarin Core (Arbiter)" -ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)" -ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)" -ARBITER_ENHANCED_CLOAK_FIELD = "Enhanced Cloak Field (Arbiter)" -CARRIER_GRAVITON_CATAPULT = "Graviton Catapult (Carrier)" -CARRIER_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier)" -VOID_RAY_DESTROYER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer)" -DESTROYER_REFORGED_BLOODSHARD_CORE = "Reforged Bloodshard Core (Destroyer)" -WARP_PRISM_GRAVITIC_DRIVE = "Gravitic Drive (Warp Prism)" -WARP_PRISM_PHASE_BLASTER = "Phase Blaster (Warp Prism)" -WARP_PRISM_WAR_CONFIGURATION = "War Configuration (Warp Prism)" -OBSERVER_GRAVITIC_BOOSTERS = "Gravitic Boosters (Observer)" -OBSERVER_SENSOR_ARRAY = "Sensor Array (Observer)" -REAVER_SCARAB_DAMAGE = "Scarab Damage (Reaver)" -REAVER_SOLARITE_PAYLOAD = "Solarite Payload (Reaver)" -REAVER_REAVER_CAPACITY = "Reaver Capacity (Reaver)" -REAVER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaver)" -VANGUARD_AGONY_LAUNCHERS = "Agony Launchers (Vanguard)" -VANGUARD_MATTER_DISPERSION = "Matter Dispersion (Vanguard)" -IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE = "Singularity Charge (Immortal/Annihilator)" -IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS = "Advanced Targeting Mechanics (Immortal/Annihilator)" -COLOSSUS_PACIFICATION_PROTOCOL = "Pacification Protocol (Colossus)" -WRATHWALKER_RAPID_POWER_CYCLING = "Rapid Power Cycling (Wrathwalker)" -WRATHWALKER_EYE_OF_WRATH = "Eye of Wrath (Wrathwalker)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK = "Blink (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_DARK_ARCHON_MELD = "Dark Archon Meld (Dark Templar)" -HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM = "Unshackled Psionic Storm (High Templar/Signifier)" -HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION = "Hallucination (High Templar/Signifier)" -HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET = "Khaydarin Amulet (High Templar/Signifier)" -ARCHON_HIGH_ARCHON = "High Archon (Archon)" -DARK_ARCHON_FEEDBACK = "Feedback (Dark Archon)" -DARK_ARCHON_MAELSTROM = "Maelstrom (Dark Archon)" -DARK_ARCHON_ARGUS_TALISMAN = "Argus Talisman (Dark Archon)" -ASCENDANT_POWER_OVERWHELMING = "Power Overwhelming (Ascendant)" -ASCENDANT_CHAOTIC_ATTUNEMENT = "Chaotic Attunement (Ascendant)" -ASCENDANT_BLOOD_AMULET = "Blood Amulet (Ascendant)" -SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE = "Cloaking Module (Sentry/Energizer/Havoc)" -SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)" -SENTRY_FORCE_FIELD = "Force Field (Sentry)" -SENTRY_HALLUCINATION = "Hallucination (Sentry)" -ENERGIZER_RECLAMATION = "Reclamation (Energizer)" -ENERGIZER_FORGED_CHASSIS = "Forged Chassis (Energizer)" -HAVOC_DETECT_WEAKNESS = "Detect Weakness (Havoc)" -HAVOC_BLOODSHARD_RESONANCE = "Bloodshard Resonance (Havoc)" -ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS = "Leg Enhancements (Zealot/Sentinel/Centurion)" -ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY = "Shield Capacity (Zealot/Sentinel/Centurion)" - -# Spear Of Adun -SOA_CHRONO_SURGE = "Chrono Surge (Spear of Adun Calldown)" -SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun Calldown)" -SOA_PYLON_OVERCHARGE = "Pylon Overcharge (Spear of Adun Calldown)" -SOA_ORBITAL_STRIKE = "Orbital Strike (Spear of Adun Calldown)" -SOA_TEMPORAL_FIELD = "Temporal Field (Spear of Adun Calldown)" -SOA_SOLAR_LANCE = "Solar Lance (Spear of Adun Calldown)" -SOA_MASS_RECALL = "Mass Recall (Spear of Adun Calldown)" -SOA_SHIELD_OVERCHARGE = "Shield Overcharge (Spear of Adun Calldown)" -SOA_DEPLOY_FENIX = "Deploy Fenix (Spear of Adun Calldown)" -SOA_PURIFIER_BEAM = "Purifier Beam (Spear of Adun Calldown)" -SOA_TIME_STOP = "Time Stop (Spear of Adun Calldown)" -SOA_SOLAR_BOMBARDMENT = "Solar Bombardment (Spear of Adun Calldown)" - -# Generic upgrades -MATRIX_OVERLOAD = "Matrix Overload" -QUATRO = "Quatro" -NEXUS_OVERCHARGE = "Nexus Overcharge" -ORBITAL_ASSIMILATORS = "Orbital Assimilators" -WARP_HARMONIZATION = "Warp Harmonization" -GUARDIAN_SHELL = "Guardian Shell" -RECONSTRUCTION_BEAM = "Reconstruction Beam (Spear of Adun Auto-Cast)" -OVERWATCH = "Overwatch (Spear of Adun Auto-Cast)" -SUPERIOR_WARP_GATES = "Superior Warp Gates" -ENHANCED_TARGETING = "Enhanced Targeting" -OPTIMIZED_ORDNANCE = "Optimized Ordnance" -KHALAI_INGENUITY = "Khalai Ingenuity" -AMPLIFIED_ASSIMILATORS = "Amplified Assimilators" - -# Filler items -STARTING_MINERALS = "Additional Starting Minerals" -STARTING_VESPENE = "Additional Starting Vespene" -STARTING_SUPPLY = "Additional Starting Supply" -NOTHING = "Nothing" diff --git a/worlds/sc2/Items.py b/worlds/sc2/Items.py deleted file mode 100644 index ee1f34d7..00000000 --- a/worlds/sc2/Items.py +++ /dev/null @@ -1,2554 +0,0 @@ -import inspect -from pydoc import describe - -from BaseClasses import Item, ItemClassification, MultiWorld -import typing - -from .Options import get_option_value, RequiredTactics -from .MissionTables import SC2Mission, SC2Race, SC2Campaign, campaign_mission_table -from . import ItemNames -from worlds.AutoWorld import World - - -class ItemData(typing.NamedTuple): - code: int - type: str - number: int # Important for bot commands to send the item into the game - race: SC2Race - classification: ItemClassification = ItemClassification.useful - quantity: int = 1 - parent_item: typing.Optional[str] = None - origin: typing.Set[str] = {"wol"} - description: typing.Optional[str] = None - important_for_filtering: bool = False - - def is_important_for_filtering(self): - return self.important_for_filtering \ - or self.classification == ItemClassification.progression \ - or self.classification == ItemClassification.progression_skip_balancing - - -class StarcraftItem(Item): - game: str = "Starcraft 2" - - -def get_full_item_list(): - return item_table - - -SC2WOL_ITEM_ID_OFFSET = 1000 -SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 -SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 - -# Descriptions -WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" - Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. -""") -LASER_TARGETING_SYSTEMS_DESCRIPTION = "Increases vision by 2 and weapon range by 1." -STIMPACK_SMALL_COST = 10 -STIMPACK_SMALL_HEAL = 30 -STIMPACK_LARGE_COST = 20 -STIMPACK_LARGE_HEAL = 60 -STIMPACK_TEMPLATE = inspect.cleandoc(""" - Level 1: Stimpack: Increases unit movement and attack speed for 15 seconds. Injures the unit for {} life. - Level 2: Super Stimpack: Instead of injuring the unit, heals the unit for {} life instead. -""") -STIMPACK_SMALL_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_SMALL_COST, STIMPACK_SMALL_HEAL) -STIMPACK_LARGE_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_LARGE_COST, STIMPACK_LARGE_HEAL) -SMART_SERVOS_DESCRIPTION = "Increases transformation speed between modes." -INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE = "{} can be trained from a {} without an attached Tech Lab." -RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE = "Reduces {} resource and supply cost." -RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE = "Reduces {} resource cost." -CLOAK_DESCRIPTION_TEMPLATE = "Allows {} to use the Cloak ability." - - -# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. -item_table = { - # WoL - ItemNames.MARINE: - ItemData(0 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="General-purpose infantry."), - ItemNames.MEDIC: - ItemData(1 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Support trooper. Heals nearby biological units."), - ItemNames.FIREBAT: - ItemData(2 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Specialized anti-infantry attacker."), - ItemNames.MARAUDER: - ItemData(3 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy assault infantry."), - ItemNames.REAPER: - ItemData(4 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Raider. Capable of jumping up and down cliffs. Throws explosive mines."), - ItemNames.HELLION: - ItemData(5 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast scout. Has a flame attack that damages all enemy units in its line of fire."), - ItemNames.VULTURE: - ItemData(6 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast skirmish unit. Can use the Spider Mine ability."), - ItemNames.GOLIATH: - ItemData(7 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy-fire support unit."), - ItemNames.DIAMONDBACK: - ItemData(8 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast, high-damage hovertank. Rail Gun can fire while the Diamondback is moving."), - ItemNames.SIEGE_TANK: - ItemData(9 + SC2WOL_ITEM_ID_OFFSET, "Unit", 9, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy tank. Long-range artillery in Siege Mode."), - ItemNames.MEDIVAC: - ItemData(10 + SC2WOL_ITEM_ID_OFFSET, "Unit", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Air transport. Heals nearby biological units."), - ItemNames.WRAITH: - ItemData(11 + SC2WOL_ITEM_ID_OFFSET, "Unit", 11, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Highly mobile flying unit. Excellent at surgical strikes."), - ItemNames.VIKING: - ItemData(12 + SC2WOL_ITEM_ID_OFFSET, "Unit", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Durable support flyer. Loaded with strong anti-capital air missiles. - Can switch into Assault Mode to attack ground units. - """ - )), - ItemNames.BANSHEE: - ItemData(13 + SC2WOL_ITEM_ID_OFFSET, "Unit", 13, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Tactical-strike aircraft."), - ItemNames.BATTLECRUISER: - ItemData(14 + SC2WOL_ITEM_ID_OFFSET, "Unit", 14, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Powerful warship."), - ItemNames.GHOST: - ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Infiltration unit. Can use Snipe and Cloak abilities. Can also call down Tactical Nukes. - """ - )), - ItemNames.SPECTRE: - ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Infiltration unit. Can use Ultrasonic Pulse, Psionic Lash, and Cloak. - Can also call down Tactical Nukes. - """ - )), - ItemNames.THOR: - ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy assault mech."), - # EE units - ItemNames.LIBERATOR: - ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"nco", "ext"}, - description=inspect.cleandoc( - """ - Artillery fighter. Loaded with missiles that deal area damage to enemy air targets. - Can switch into Defender Mode to provide siege support. - """ - )), - ItemNames.VALKYRIE: - ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"bw"}, - description=inspect.cleandoc( - """ - Advanced anti-aircraft fighter. - Able to use cluster missiles that deal area damage to air targets. - """ - )), - ItemNames.WIDOW_MINE: - ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Robotic mine. Launches missiles at nearby enemy units while burrowed. - Attacks deal splash damage in a small area around the target. - Widow Mine is revealed when Sentinel Missile is on cooldown. - """ - )), - ItemNames.CYCLONE: - ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Mobile assault vehicle. Can use Lock On to quickly fire while moving. - """ - )), - ItemNames.HERC: - ItemData(22 + SC2WOL_ITEM_ID_OFFSET, "Unit", 26, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Front-line infantry. Can use Grapple. - """ - )), - ItemNames.WARHOUND: - ItemData(23 + SC2WOL_ITEM_ID_OFFSET, "Unit", 27, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Anti-vehicle mech. Haywire missiles do bonus damage to mechanical units. - """ - )), - - # Some other items are moved to Upgrade group because of the way how the bot message is parsed - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: - ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran infantry units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: - ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran infantry units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: - ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran vehicle units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: - ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran vehicle units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON: - ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran starship units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR: - ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran starship units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, SC2Race.TERRAN, quantity=3), - - # Unit and structure upgrades - ItemNames.BUNKER_PROJECTILE_ACCELERATOR: - ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Increases range of all units in the Bunker by 1."), - ItemNames.BUNKER_NEOSTEEL_BUNKER: - ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Increases the number of Bunker slots by 2."), - ItemNames.MISSILE_TURRET_TITANIUM_HOUSING: - ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MISSILE_TURRET, - description="Increases Missile Turret life by 75."), - ItemNames.MISSILE_TURRET_HELLSTORM_BATTERIES: - ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, SC2Race.TERRAN, - parent_item=ItemNames.MISSILE_TURRET, - description="The Missile Turret unleashes an additional flurry of missiles with each attack."), - ItemNames.SCV_ADVANCED_CONSTRUCTION: - ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4, SC2Race.TERRAN, - description="Multiple SCVs can construct a structure, reducing its construction time."), - ItemNames.SCV_DUAL_FUSION_WELDERS: - ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5, SC2Race.TERRAN, - description="SCVs repair twice as fast."), - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: - ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 24, SC2Race.TERRAN, - quantity=2, - description=inspect.cleandoc( - """ - Level 1: While on low health, Terran structures are repaired to half health instead of burning down. - Level 2: Terran structures are repaired to full health instead of half health - """ - )), - ItemNames.PROGRESSIVE_ORBITAL_COMMAND: - ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 26, SC2Race.TERRAN, - quantity=2, classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Level 1: Allows Command Centers to use Scanner Sweep and Calldown: MULE abilities. - Level 2: Orbital Command abilities work even in Planetary Fortress mode. - """ - )), - ItemNames.MARINE_PROGRESSIVE_STIMPACK: - ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, quantity=2, - description=STIMPACK_SMALL_DESCRIPTION), - ItemNames.MARINE_COMBAT_SHIELD: - ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, - description="Increases Marine life by 10."), - ItemNames.MEDIC_ADVANCED_MEDIC_FACILITIES: - ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Medics", "Barracks")), - ItemNames.MEDIC_STABILIZER_MEDPACKS: - ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MEDIC, - description="Increases Medic heal speed. Reduces the amount of energy required for each heal."), - ItemNames.FIREBAT_INCINERATOR_GAUNTLETS: - ItemData(212 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.FIREBAT, - description="Increases Firebat's damage radius by 40%"), - ItemNames.FIREBAT_JUGGERNAUT_PLATING: - ItemData(213 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 13, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, - description="Increases Firebat's armor by 2."), - ItemNames.MARAUDER_CONCUSSIVE_SHELLS: - ItemData(214 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 14, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, - description="Marauder attack temporarily slows all units in target area."), - ItemNames.MARAUDER_KINETIC_FOAM: - ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, - description="Increases Marauder life by 25."), - ItemNames.REAPER_U238_ROUNDS: - ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, - description=inspect.cleandoc( - """ - Increases Reaper pistol attack range by 1. - Reaper pistols do additional 3 damage to Light Armor. - """ - )), - ItemNames.REAPER_G4_CLUSTERBOMB: - ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.REAPER, - description="Timed explosive that does heavy area damage."), - ItemNames.CYCLONE_MAG_FIELD_ACCELERATORS: - ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone Lock On damage"), - ItemNames.CYCLONE_MAG_FIELD_LAUNCHERS: - ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone attack range by 2."), - ItemNames.MARINE_LASER_TARGETING_SYSTEM: - ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.MARINE_MAGRAIL_MUNITIONS: - ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, origin={"nco"}, - description="Deals 20 damage to target unit. Autocast on attack with a cooldown."), - ItemNames.MARINE_OPTIMIZED_LOGISTICS: - ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"}, - description="Increases Marine training speed."), - ItemNames.MEDIC_RESTORATION: - ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description="Removes negative status effects from target allied unit."), - ItemNames.MEDIC_OPTICAL_FLARE: - ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description="Reduces vision range of target enemy unit. Disables detection."), - ItemNames.MEDIC_RESOURCE_EFFICIENCY: - ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Medic")), - ItemNames.FIREBAT_PROGRESSIVE_STIMPACK: - ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, quantity=2, origin={"bw"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.FIREBAT_RESOURCE_EFFICIENCY: - ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Firebat")), - ItemNames.MARAUDER_PROGRESSIVE_STIMPACK: - ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, quantity=2, origin={"nco"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.MARAUDER_LASER_TARGETING_SYSTEM: - ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.MARAUDER_MAGRAIL_MUNITIONS: - ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description="Deals 20 damage to target unit. Autocast on attack with a cooldown."), - ItemNames.MARAUDER_INTERNAL_TECH_MODULE: - ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Marauders", "Barracks")), - ItemNames.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: - ItemData(232 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, origin={"bw"}, - description="Increases SCV life by 15 and attack speed slightly."), - ItemNames.MEDIC_ADAPTIVE_MEDPACKS: - ItemData(233 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MEDIC, origin={"ext"}, - description="Allows Medics to heal mechanical and air units."), - ItemNames.MEDIC_NANO_PROJECTOR: - ItemData(234 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"ext"}, - description="Increases Medic heal range by 2."), - ItemNames.FIREBAT_INFERNAL_PRE_IGNITER: - ItemData(235 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"bw"}, - description="Firebats do an additional 4 damage to Light Armor."), - ItemNames.FIREBAT_KINETIC_FOAM: - ItemData(236 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"ext"}, - description="Increases Firebat life by 100."), - ItemNames.FIREBAT_NANO_PROJECTORS: - ItemData(237 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"ext"}, - description="Increases Firebat attack range by 2"), - ItemNames.MARAUDER_JUGGERNAUT_PLATING: - ItemData(238 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, origin={"ext"}, - description="Increases Marauder's armor by 2."), - ItemNames.REAPER_JET_PACK_OVERDRIVE: - ItemData(239 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 6, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, origin={"ext"}, - description=inspect.cleandoc( - """ - Allows the Reaper to fly for 10 seconds. - While flying, the Reaper can attack air units. - """ - )), - ItemNames.HELLION_INFERNAL_PLATING: - ItemData(240 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 7, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, origin={"ext"}, - description="Increases Hellion and Hellbat armor by 2."), - ItemNames.VULTURE_AUTO_REPAIR: - ItemData(241 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 8, SC2Race.TERRAN, - parent_item=ItemNames.VULTURE, origin={"ext"}, - description="Vultures regenerate life."), - ItemNames.GOLIATH_SHAPED_HULL: - ItemData(242 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "ext"}, - description="Increases Goliath life by 25."), - ItemNames.GOLIATH_RESOURCE_EFFICIENCY: - ItemData(243 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 10, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, origin={"nco", "bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Goliath")), - ItemNames.GOLIATH_INTERNAL_TECH_MODULE: - ItemData(244 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "bw"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Goliaths", "Factory")), - ItemNames.SIEGE_TANK_SHAPED_HULL: - ItemData(245 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco", "ext"}, - description="Increases Siege Tank life by 25."), - ItemNames.SIEGE_TANK_RESOURCE_EFFICIENCY: - ItemData(246 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Siege Tank")), - ItemNames.PREDATOR_CLOAK: - ItemData(247 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Predators")), - ItemNames.PREDATOR_CHARGE: - ItemData(248 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Allows Predators to intercept enemy ground units."), - ItemNames.MEDIVAC_SCATTER_VEIL: - ItemData(249 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, SC2Race.TERRAN, - parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Medivacs get 100 shields."), - ItemNames.REAPER_PROGRESSIVE_STIMPACK: - ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, quantity=2, origin={"nco"}, - description=STIMPACK_SMALL_DESCRIPTION), - ItemNames.REAPER_LASER_TARGETING_SYSTEM: - ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.REAPER_ADVANCED_CLOAKING_FIELD: - ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, origin={"nco"}, - description="Reapers are permanently cloaked."), - ItemNames.REAPER_SPIDER_MINES: - ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"}, - important_for_filtering=True, - description="Allows Reapers to lay Spider Mines. 3 charges per Reaper."), - ItemNames.REAPER_COMBAT_DRUGS: - ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 20, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"ext"}, - description="Reapers regenerate life while out of combat."), - ItemNames.HELLION_HELLBAT_ASPECT: - ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 21, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.HELLION, origin={"nco"}, - description="Allows Hellions to transform into Hellbats."), - ItemNames.HELLION_SMART_SERVOS: - ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 22, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, origin={"nco"}, - description="Transforms faster between modes. Hellions can attack while moving."), - ItemNames.HELLION_OPTIMIZED_LOGISTICS: - ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"}, - description="Increases Hellion training speed."), - ItemNames.HELLION_JUMP_JETS: - ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"}, - description=inspect.cleandoc( - """ - Increases movement speed in Hellion mode. - In Hellbat mode, launches the Hellbat toward enemy ground units and briefly stuns them. - """ - )), - ItemNames.HELLION_PROGRESSIVE_STIMPACK: - ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, quantity=2, origin={"nco"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.VULTURE_ION_THRUSTERS: - ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, origin={"bw"}, - description="Increases Vulture movement speed."), - ItemNames.VULTURE_AUTO_LAUNCHERS: - ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, SC2Race.TERRAN, - parent_item=ItemNames.VULTURE, origin={"bw"}, - description="Allows Vultures to attack while moving."), - ItemNames.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: - ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, SC2Race.TERRAN, - origin={"bw"}, - description="Increases Spider mine damage."), - ItemNames.GOLIATH_JUMP_JETS: - ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.GOLIATH, origin={"nco"}, - description="Allows Goliaths to jump up and down cliffs."), - ItemNames.GOLIATH_OPTIMIZED_LOGISTICS: - ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco"}, - description="Increases Goliath training speed."), - ItemNames.DIAMONDBACK_HYPERFLUXOR: - ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description="Increases Diamondback attack speed."), - ItemNames.DIAMONDBACK_BURST_CAPACITORS: - ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description=inspect.cleandoc( - """ - While not attacking, the Diamondback charges its weapon. - The next attack does 10 additional damage. - """ - )), - ItemNames.DIAMONDBACK_RESOURCE_EFFICIENCY: - ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Diamondback")), - ItemNames.SIEGE_TANK_JUMP_JETS: - ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=inspect.cleandoc( - """ - Repositions Siege Tank to a target location. - Can be used in either mode and to jump up and down cliffs. - """ - )), - ItemNames.SIEGE_TANK_SPIDER_MINES: - ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - important_for_filtering=True, - description=inspect.cleandoc( - """ - Allows Siege Tanks to lay Spider Mines. - Lays 3 Spider Mines at once. 3 charges - """ - )), - ItemNames.SIEGE_TANK_SMART_SERVOS: - ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.SIEGE_TANK_GRADUATING_RANGE: - ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"ext"}, - description=inspect.cleandoc( - """ - Increases the Siege Tank's attack range by 1 every 3 seconds while in Siege Mode, - up to a maximum of 5 additional range. - """ - )), - ItemNames.SIEGE_TANK_LASER_TARGETING_SYSTEM: - ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.SIEGE_TANK_ADVANCED_SIEGE_TECH: - ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"ext"}, - description="Siege Tanks gain +3 armor in Siege Mode."), - ItemNames.SIEGE_TANK_INTERNAL_TECH_MODULE: - ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Siege Tanks", "Factory")), - ItemNames.PREDATOR_RESOURCE_EFFICIENCY: - ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Decreases Predator resource and supply cost."), - ItemNames.MEDIVAC_EXPANDED_HULL: - ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Increases Medivac cargo space by 4."), - ItemNames.MEDIVAC_AFTERBURNERS: - ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Ability. Temporarily increases the Medivac's movement speed by 70%."), - ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY: - ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.WRAITH, origin={"ext"}, - description=inspect.cleandoc( - """ - Burst Lasers do more damage and can hit both ground and air targets. - Replaces Gemini Missiles weapon. - """ - )), - ItemNames.VIKING_SMART_SERVOS: - ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.VIKING_ANTI_MECHANICAL_MUNITION: - ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description="Increases Viking damage to mechanical units while in Assault Mode."), - ItemNames.DIAMONDBACK_ION_THRUSTERS: - ItemData(281 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description="Increases Diamondback movement speed."), - ItemNames.WARHOUND_RESOURCE_EFFICIENCY: - ItemData(282 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 13, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Warhound")), - ItemNames.WARHOUND_REINFORCED_PLATING: - ItemData(283 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 14, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, - description="Increases Warhound armor by 2."), - ItemNames.HERC_RESOURCE_EFFICIENCY: - ItemData(284 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 15, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("HERC")), - ItemNames.HERC_JUGGERNAUT_PLATING: - ItemData(285 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 16, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description="Increases HERC armor by 2."), - ItemNames.HERC_KINETIC_FOAM: - ItemData(286 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 17, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description="Increases HERC life by 50."), - - ItemNames.HELLION_TWIN_LINKED_FLAMETHROWER: - ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, - description="Doubles the width of the Hellion's flame attack."), - ItemNames.HELLION_THERMITE_FILAMENTS: - ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, - description="Hellions do an additional 10 damage to Light Armor."), - ItemNames.SPIDER_MINE_CERBERUS_MINE: - ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Increases trigger and blast radius of Spider Mines."), - ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: - ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Allows Vultures to replace used Spider Mines. Costs 15 minerals. - Level 2: Replacing used Spider Mines no longer costs minerals. - """ - )), - ItemNames.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: - ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, - description="Goliaths can attack both ground and air targets simultaneously."), - ItemNames.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: - ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, - description="Increases Goliath ground attack range by 1 and air by 3."), - ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: - ItemData(306 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 4, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Tri-Lithium Power Cell: Increases Diamondback attack range by 1. - Level 2: Tungsten Spikes: Increases Diamondback attack range by 3. - """ - )), - ItemNames.DIAMONDBACK_SHAPED_HULL: - ItemData(307 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK, - description="Increases Diamondback life by 50."), - ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS: - ItemData(308 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, - description="Siege Tanks do an additional 40 damage to the primary target in Siege Mode."), - ItemNames.SIEGE_TANK_SHAPED_BLAST: - ItemData(309 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, - description="Reduces splash damage to friendly targets while in Siege Mode by 75%."), - ItemNames.MEDIVAC_RAPID_DEPLOYMENT_TUBE: - ItemData(310 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, - description="Medivacs deploy loaded troops almost instantly."), - ItemNames.MEDIVAC_ADVANCED_HEALING_AI: - ItemData(311 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, - description="Medivacs can heal two targets at once."), - ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: - ItemData(312 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Tomahawk Power Cells: Increases Wraith starting energy by 100. - Level 2: Unregistered Cloaking Module: Wraiths do not require energy to cloak and remain cloaked. - """ - )), - ItemNames.WRAITH_DISPLACEMENT_FIELD: - ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, - description="Wraiths evade 20% of incoming attacks while cloaked."), - ItemNames.VIKING_RIPWAVE_MISSILES: - ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, - description="Vikings do area damage while in Fighter Mode"), - ItemNames.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: - ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 29, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, - description="Increases Viking attack range by 1 in Assault mode and 2 in Fighter mode."), - ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: - ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Banshees can remain cloaked twice as long. - Level 2: Banshees do not require energy to cloak and remain cloaked. - """ - )), - ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: - ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE, - description="Banshees do area damage in a straight line."), - ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: - ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 2, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, quantity=2, - description="Spell. Missile Pods do damage to air targets in a target area."), - ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: - ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 20, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Spell. For 20 seconds the Battlecruiser gains a shield that can absorb up to 200 damage. - Level 2: Passive. Battlecruiser gets 200 shields. - """ - )), - ItemNames.GHOST_OCULAR_IMPLANTS: - ItemData(320 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, - description="Increases Ghost sight range by 3 and attack range by 2."), - ItemNames.GHOST_CRIUS_SUIT: - ItemData(321 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, - description="Cloak no longer requires energy to activate or maintain."), - ItemNames.SPECTRE_PSIONIC_LASH: - ItemData(322 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SPECTRE, - description="Spell. Deals 200 damage to a single target."), - ItemNames.SPECTRE_NYX_CLASS_CLOAKING_MODULE: - ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, - description="Cloak no longer requires energy to activate or maintain."), - ItemNames.THOR_330MM_BARRAGE_CANNON: - ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, - description=inspect.cleandoc( - """ - Improves 250mm Strike Cannons ability to deal area damage and stun units in a small area. - Can be also freely aimed on ground. - """ - )), - ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: - ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, quantity=2, - description=inspect.cleandoc(""" - Level 1: Allows destroyed Thors to be reconstructed on the field. Costs Vespene Gas. - Level 2: Thors are automatically reconstructed after falling for free. - """ - )), - ItemNames.LIBERATOR_ADVANCED_BALLISTICS: - ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, SC2Race.TERRAN, - parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description="Increases Liberator range by 3 in Defender Mode."), - ItemNames.LIBERATOR_RAID_ARTILLERY: - ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description="Allows Liberators to attack structures while in Defender Mode."), - ItemNames.WIDOW_MINE_DRILLING_CLAWS: - ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Allows Widow Mines to burrow and unburrow faster."), - ItemNames.WIDOW_MINE_CONCEALMENT: - ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Burrowed Widow Mines are no longer revealed when the Sentinel Missile is on cooldown."), - ItemNames.MEDIVAC_ADVANCED_CLOAKING_FIELD: - ItemData(330 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 11, SC2Race.TERRAN, - parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Medivacs are permanently cloaked."), - ItemNames.WRAITH_TRIGGER_OVERRIDE: - ItemData(331 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 12, SC2Race.TERRAN, - parent_item=ItemNames.WRAITH, origin={"ext"}, - description="Wraith attack speed increases by 10% with each attack, up to a maximum of 100%."), - ItemNames.WRAITH_INTERNAL_TECH_MODULE: - ItemData(332 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, origin={"bw"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Wraiths", "Starport")), - ItemNames.WRAITH_RESOURCE_EFFICIENCY: - ItemData(333 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, SC2Race.TERRAN, - parent_item=ItemNames.WRAITH, origin={"bw"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Wraith")), - ItemNames.VIKING_SHREDDER_ROUNDS: - ItemData(334 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.VIKING, origin={"ext"}, - description="Attacks in Assault mode do line splash damage."), - ItemNames.VIKING_WILD_MISSILES: - ItemData(335 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description="Launches 5 rockets at the target unit. Each rocket does 25 (40 vs armored) damage."), - ItemNames.BANSHEE_SHAPED_HULL: - ItemData(336 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee life by 100."), - ItemNames.BANSHEE_ADVANCED_TARGETING_OPTICS: - ItemData(337 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee attack range by 2 while cloaked."), - ItemNames.BANSHEE_DISTORTION_BLASTERS: - ItemData(338 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee attack damage by 25% while cloaked."), - ItemNames.BANSHEE_ROCKET_BARRAGE: - ItemData(339 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Deals 75 damage to enemy ground units in the target area."), - ItemNames.GHOST_RESOURCE_EFFICIENCY: - ItemData(340 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Ghost")), - ItemNames.SPECTRE_RESOURCE_EFFICIENCY: - ItemData(341 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Spectre")), - ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT: - ItemData(342 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.THOR, origin={"ext"}, - description="Allows Thors to launch nukes."), - ItemNames.THOR_LASER_TARGETING_SYSTEM: - ItemData(343 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: - ItemData(344 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"}, - description="Allows Thors to be built by SCVs like a structure."), - ItemNames.RAVEN_RESOURCE_EFFICIENCY: - ItemData(345 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Raven")), - ItemNames.RAVEN_DURABLE_MATERIALS: - ItemData(346 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"}, - description="Extends timed life duration of Raven's summoned objects."), - ItemNames.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: - ItemData(347 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"}, - description="Nano-Repair no longer requires energy to use."), - ItemNames.SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS: - ItemData(348 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 29, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"}, - description="Science Vessel can use Nano-Repair at two targets at once."), - ItemNames.CYCLONE_RESOURCE_EFFICIENCY: - ItemData(349 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 0, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Cyclone")), - ItemNames.BANSHEE_HYPERFLIGHT_ROTORS: - ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee movement speed."), - ItemNames.BANSHEE_LASER_TARGETING_SYSTEM: - ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.BANSHEE_INTERNAL_TECH_MODULE: - ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Banshees", "Starport")), - ItemNames.BATTLECRUISER_TACTICAL_JUMP: - ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 4, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco", "ext"}, - description=inspect.cleandoc( - """ - Allows Battlecruisers to warp to a target location anywhere on the map. - """ - )), - ItemNames.BATTLECRUISER_CLOAK: - ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 5, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Battlecruisers")), - ItemNames.BATTLECRUISER_ATX_LASER_BATTERY: - ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=inspect.cleandoc( - """ - Battlecruisers can attack while moving, - do the same damage to both ground and air targets, and fire faster. - """ - )), - ItemNames.BATTLECRUISER_OPTIMIZED_LOGISTICS: - ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 7, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"ext"}, - description="Increases Battlecruiser training speed."), - ItemNames.BATTLECRUISER_INTERNAL_TECH_MODULE: - ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Battlecruisers", "Starport")), - ItemNames.GHOST_EMP_ROUNDS: - ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 9, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"ext"}, - description=inspect.cleandoc( - """ - Spell. Does 100 damage to shields and drains all energy from units in the targeted area. - Cloaked units hit by EMP are revealed for a short time. - """ - )), - ItemNames.GHOST_LOCKDOWN: - ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 10, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"bw"}, - description="Spell. Stuns a target mechanical unit for a long time."), - ItemNames.SPECTRE_IMPALER_ROUNDS: - ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 11, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, origin={"ext"}, - description="Spectres do additional damage to armored targets."), - ItemNames.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: - ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, SC2Race.TERRAN, - parent_item=ItemNames.THOR, quantity=2, origin={"ext"}, - description=inspect.cleandoc( - f""" - Level 1: Allows Thors to transform in order to use an alternative air attack. - Level 2: {SMART_SERVOS_DESCRIPTION} - """ - )), - ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: - ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"}, - description="Spell. Deploys a drone that can heal biological or mechanical units."), - ItemNames.RAVEN_SPIDER_MINES: - ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 13, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"nco"}, important_for_filtering=True, - description="Spell. Deploys 3 Spider Mines to a target location."), - ItemNames.RAVEN_RAILGUN_TURRET: - ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 14, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"nco"}, - description=inspect.cleandoc( - """ - Spell. Allows Ravens to deploy an advanced Auto-Turret, - that can attack enemy ground units in a straight line. - """ - )), - ItemNames.RAVEN_HUNTER_SEEKER_WEAPON: - ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"}, - description="Allows Ravens to attack with a Hunter-Seeker weapon."), - ItemNames.RAVEN_INTERFERENCE_MATRIX: - ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 16, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"ext"}, - description=inspect.cleandoc( - """ - Spell. Target enemy Mechanical or Psionic unit can't attack or use abilities for a short duration. - """ - )), - ItemNames.RAVEN_ANTI_ARMOR_MISSILE: - ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"}, - description="Spell. Decreases target and nearby enemy units armor by 2."), - ItemNames.RAVEN_INTERNAL_TECH_MODULE: - ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Ravens", "Starport")), - ItemNames.SCIENCE_VESSEL_EMP_SHOCKWAVE: - ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 19, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"}, - description="Spell. Depletes all energy and shields of all units in a target area."), - ItemNames.SCIENCE_VESSEL_DEFENSIVE_MATRIX: - ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 20, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"}, - description=inspect.cleandoc( - """ - Spell. Provides a target unit with a defensive barrier that can absorb up to 250 damage - """ - )), - ItemNames.CYCLONE_TARGETING_OPTICS: - ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 21, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone Lock On casting range and the range while Locked On."), - ItemNames.CYCLONE_RAPID_FIRE_LAUNCHERS: - ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 22, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="The first 12 shots of Lock On are fired more quickly."), - ItemNames.LIBERATOR_CLOAK: - ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Liberators")), - ItemNames.LIBERATOR_LASER_TARGETING_SYSTEM: - ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.LIBERATOR_OPTIMIZED_LOGISTICS: - ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description="Increases Liberator training speed."), - ItemNames.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: - ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Increases Widow Mine Sentinel Missile range."), - ItemNames.WIDOW_MINE_EXECUTIONER_MISSILES: - ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 27, SC2Race.TERRAN, - parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description=inspect.cleandoc( - """ - Reduces Sentinel Missile cooldown. - When killed, Widow Mines will launch several missiles at random enemy targets. - """ - )), - ItemNames.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: - ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 28, - SC2Race.TERRAN, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Valkyries fire 2 additional rockets each volley."), - ItemNames.VALKYRIE_SHAPED_HULL: - ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Increases Valkyrie life by 50."), - ItemNames.VALKYRIE_FLECHETTE_MISSILES: - ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 0, SC2Race.TERRAN, - parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Equips Valkyries with Air-to-Surface missiles to attack ground units."), - ItemNames.VALKYRIE_AFTERBURNERS: - ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Ability. Temporarily increases the Valkyries's movement speed by 70%."), - ItemNames.CYCLONE_INTERNAL_TECH_MODULE: - ItemData(383 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.CYCLONE, origin={"ext"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Cyclones", "Factory")), - ItemNames.LIBERATOR_SMART_SERVOS: - ItemData(384 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.LIBERATOR_RESOURCE_EFFICIENCY: - ItemData(385 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Liberator")), - ItemNames.HERCULES_INTERNAL_FUSION_MODULE: - ItemData(386 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HERCULES, origin={"ext"}, - description="Hercules can be trained from a Starport without having a Fusion Core."), - ItemNames.HERCULES_TACTICAL_JUMP: - ItemData(387 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 6, SC2Race.TERRAN, - parent_item=ItemNames.HERCULES, origin={"ext"}, - description=inspect.cleandoc( - """ - Allows Hercules to warp to a target location anywhere on the map. - """ - )), - ItemNames.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: - ItemData(388 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 28, SC2Race.TERRAN, - parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"}, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Lift Off - Planetary Fortress can lift off. - Level 2: Armament Stabilizers - Planetary Fortress can attack while lifted off. - """ - )), - ItemNames.PLANETARY_FORTRESS_ADVANCED_TARGETING: - ItemData(389 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 7, SC2Race.TERRAN, - parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"}, - description="Planetary Fortress can attack air units."), - ItemNames.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: - ItemData(390 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Allows Valkyries to shoot air while moving."), - ItemNames.VALKYRIE_RESOURCE_EFFICIENCY: - ItemData(391 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 9, SC2Race.TERRAN, - parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Valkyrie")), - ItemNames.PREDATOR_PREDATOR_S_FURY: - ItemData(392 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 10, SC2Race.TERRAN, - parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Predators can use an attack that jumps between targets."), - ItemNames.BATTLECRUISER_BEHEMOTH_PLATING: - ItemData(393 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 11, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"ext"}, - description="Increases Battlecruiser armor by 2."), - ItemNames.BATTLECRUISER_COVERT_OPS_ENGINES: - ItemData(394 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 12, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description="Increases Battlecruiser movement speed."), - - #Buildings - ItemNames.BUNKER: - ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Defensive structure. Able to load infantry units, giving them +1 range to their attacks."), - ItemNames.MISSILE_TURRET: - ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Anti-air defensive structure."), - ItemNames.SENSOR_TOWER: - ItemData(402 + SC2WOL_ITEM_ID_OFFSET, "Building", 2, SC2Race.TERRAN, - description="Reveals locations of enemy units at long range."), - - ItemNames.WAR_PIGS: - ItemData(500 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Marines"), - ItemNames.DEVIL_DOGS: - ItemData(501 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Mercenary Firebats"), - ItemNames.HAMMER_SECURITIES: - ItemData(502 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.TERRAN, - description="Mercenary Marauders"), - ItemNames.SPARTAN_COMPANY: - ItemData(503 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Goliaths"), - ItemNames.SIEGE_BREAKERS: - ItemData(504 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 4, SC2Race.TERRAN, - description="Mercenary Siege Tanks"), - ItemNames.HELS_ANGELS: - ItemData(505 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 5, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Vikings"), - ItemNames.DUSK_WINGS: - ItemData(506 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 6, SC2Race.TERRAN, - description="Mercenary Banshees"), - ItemNames.JACKSONS_REVENGE: - ItemData(507 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 7, SC2Race.TERRAN, - description="Mercenary Battlecruiser"), - ItemNames.SKIBIS_ANGELS: - ItemData(508 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 8, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Medics"), - ItemNames.DEATH_HEADS: - ItemData(509 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 9, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Reapers"), - ItemNames.WINGED_NIGHTMARES: - ItemData(510 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description="Mercenary Wraiths"), - ItemNames.MIDNIGHT_RIDERS: - ItemData(511 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 11, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Liberators"), - ItemNames.BRYNHILDS: - ItemData(512 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description="Mercenary Valkyries"), - ItemNames.JOTUN: - ItemData(513 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 13, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Thor"), - - ItemNames.ULTRA_CAPACITORS: - ItemData(600 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 0, SC2Race.TERRAN, - description="Increases attack speed of units by 5% per weapon upgrade."), - ItemNames.VANADIUM_PLATING: - ItemData(601 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 1, SC2Race.TERRAN, - description="Increases the life of units by 5% per armor upgrade."), - ItemNames.ORBITAL_DEPOTS: - ItemData(602 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 2, SC2Race.TERRAN, - description="Supply depots are built instantly."), - ItemNames.MICRO_FILTERING: - ItemData(603 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 3, SC2Race.TERRAN, - description="Refineries produce Vespene gas 25% faster."), - ItemNames.AUTOMATED_REFINERY: - ItemData(604 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 4, SC2Race.TERRAN, - description="Eliminates the need for SCVs in vespene gas production."), - ItemNames.COMMAND_CENTER_REACTOR: - ItemData(605 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 5, SC2Race.TERRAN, - description="Command Centers can train two SCVs at once."), - ItemNames.RAVEN: - ItemData(606 + SC2WOL_ITEM_ID_OFFSET, "Unit", 22, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Aerial Caster unit."), - ItemNames.SCIENCE_VESSEL: - ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Unit", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Aerial Caster unit. Can repair mechanical units."), - ItemNames.TECH_REACTOR: - ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 6, SC2Race.TERRAN, - description="Merges Tech Labs and Reactors into one add on structure to provide both functions."), - ItemNames.ORBITAL_STRIKE: - ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, SC2Race.TERRAN, - description="Trained units from Barracks are instantly deployed on rally point."), - ItemNames.BUNKER_SHRIKE_TURRET: - ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Adds an automated turret to Bunkers."), - ItemNames.BUNKER_FORTIFIED_BUNKER: - ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Bunkers have more life."), - ItemNames.PLANETARY_FORTRESS: - ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Building", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Allows Command Centers to upgrade into a defensive structure with a turret and additional armor. - Planetary Fortresses cannot Lift Off, or cast Orbital Command spells. - """ - )), - ItemNames.PERDITION_TURRET: - ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Building", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Automated defensive turret. Burrows down while no enemies are nearby."), - ItemNames.PREDATOR: - ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Unit", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Anti-infantry specialist that deals area damage with each attack."), - ItemNames.HERCULES: - ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Unit", 25, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Massive transport ship."), - ItemNames.CELLULAR_REACTOR: - ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8, SC2Race.TERRAN, - description="All Terran spellcasters get +100 starting and maximum energy."), - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL: - ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, SC2Race.TERRAN, quantity=3, - classification= ItemClassification.progression, - description=inspect.cleandoc( - """ - Allows Terran mechanical units to regenerate health while not in combat. - Each level increases life regeneration speed. - """ - )), - ItemNames.HIVE_MIND_EMULATOR: - ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Building", 5, SC2Race.TERRAN, - ItemClassification.progression, - description="Defensive structure. Can permanently Mind Control Zerg units."), - ItemNames.PSI_DISRUPTER: - ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Building", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Defensive structure. Slows the attack and movement speeds of all nearby Zerg units."), - ItemNames.STRUCTURE_ARMOR: - ItemData(620 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9, SC2Race.TERRAN, - description="Increases armor of all Terran structures by 2.", origin={"ext"}), - ItemNames.HI_SEC_AUTO_TRACKING: - ItemData(621 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, SC2Race.TERRAN, - description="Increases attack range of all Terran structures by 1.", origin={"ext"}), - ItemNames.ADVANCED_OPTICS: - ItemData(622 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, SC2Race.TERRAN, - description="Increases attack range of all Terran mechanical units by 1.", origin={"ext"}), - ItemNames.ROGUE_FORCES: - ItemData(623 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, SC2Race.TERRAN, - description="Mercenary calldowns are no longer limited by charges.", origin={"ext"}), - - ItemNames.ZEALOT: - ItemData(700 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Powerful melee warrior. Can use the charge ability."), - ItemNames.STALKER: - ItemData(701 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Ranged attack strider. Can use the Blink ability."), - ItemNames.HIGH_TEMPLAR: - ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Potent psionic master. Can use the Feedback and Psionic Storm abilities. Can merge into an Archon."), - ItemNames.DARK_TEMPLAR: - ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Can use the Shadow Fury ability."), - ItemNames.IMMORTAL: - ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Assault strider. Can use Barrier to absorb damage."), - ItemNames.COLOSSUS: - ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Battle strider with a powerful area attack. Can walk up and down cliffs. Attacks set fire to the ground, dealing extra damage to enemies over time."), - ItemNames.PHOENIX: - ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."), - ItemNames.VOID_RAY: - ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Surgical strike craft. Has the Prismatic Alignment and Prismatic Range abilities."), - ItemNames.CARRIER: - ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Capital ship. Builds and launches Interceptors that attack enemy targets. Repair Drones heal nearby mechanical units."), - - # Filler items to fill remaining spots - ItemNames.STARTING_MINERALS: - ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting minerals for all missions."), - ItemNames.STARTING_VESPENE: - ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting vespene for all missions."), - ItemNames.STARTING_SUPPLY: - ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting supply for all missions."), - # This item is used to "remove" location from the game. Never placed unless plando'd - ItemNames.NOTHING: - ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, SC2Race.ANY, quantity=0, - classification=ItemClassification.trap, - description="Does nothing. Used to remove a location from the game."), - - # Nova gear - ItemNames.NOVA_GHOST_VISOR: - ItemData(900 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 0, SC2Race.TERRAN, origin={"nco"}, - description="Reveals the locations of enemy units in the fog of war around Nova. Can detect cloaked units."), - ItemNames.NOVA_RANGEFINDER_OCULUS: - ItemData(901 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 1, SC2Race.TERRAN, origin={"nco"}, - description="Increaases Nova's vision range and non-melee weapon attack range by 2. Also increases range of melee weapons by 1."), - ItemNames.NOVA_DOMINATION: - ItemData(902 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 2, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to mind-control a target enemy unit."), - ItemNames.NOVA_BLINK: - ItemData(903 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 3, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to teleport a short distance and cloak for 10s."), - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: - ItemData(904 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 0, SC2Race.TERRAN, quantity=2, origin={"nco"}, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Level 1: Gives Nova the ability to cloak. - Level 2: Nova is permanently cloaked. - """ - )), - ItemNames.NOVA_ENERGY_SUIT_MODULE: - ItemData(905 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 4, SC2Race.TERRAN, origin={"nco"}, - description="Increases Nova's maximum energy and energy regeneration rate."), - ItemNames.NOVA_ARMORED_SUIT_MODULE: - ItemData(906 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 5, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Increases Nova's health by 100 and armour by 1. Nova also regenerates life quickly out of combat."), - ItemNames.NOVA_JUMP_SUIT_MODULE: - ItemData(907 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 6, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Increases Nova's movement speed and allows her to jump up and down cliffs."), - ItemNames.NOVA_C20A_CANISTER_RIFLE: - ItemData(908 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 7, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the C20A Canister Rifle, which has a ranged attack and allows Nova to cast Snipe."), - ItemNames.NOVA_HELLFIRE_SHOTGUN: - ItemData(909 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 8, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Hellfire Shotgun, which has a short-range area attack in a cone and allows Nova to cast Penetrating Blast."), - ItemNames.NOVA_PLASMA_RIFLE: - ItemData(910 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 9, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Plasma Rifle, which has a rapidfire ranged attack and allows Nova to cast Plasma Shot."), - ItemNames.NOVA_MONOMOLECULAR_BLADE: - ItemData(911 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 10, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Monomolecular Blade, which has a melee attack and allows Nova to cast Dash Attack."), - ItemNames.NOVA_BLAZEFIRE_GUNBLADE: - ItemData(912 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 11, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Blazefire Gunblade, which has a melee attack and allows Nova to cast Fury of One."), - ItemNames.NOVA_STIM_INFUSION: - ItemData(913 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 12, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to heal herself and temporarily increase her movement and attack speeds."), - ItemNames.NOVA_PULSE_GRENADES: - ItemData(914 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 13, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to throw a grenade dealing large damage in an area."), - ItemNames.NOVA_FLASHBANG_GRENADES: - ItemData(915 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 14, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to throw a grenade to stun enemies and disable detection in a large area."), - ItemNames.NOVA_IONIC_FORCE_FIELD: - ItemData(916 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 15, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to shield herself temporarily."), - ItemNames.NOVA_HOLO_DECOY: - ItemData(917 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 16, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to summon a decoy unit which enemies will prefer to target and takes reduced damage."), - ItemNames.NOVA_NUKE: - ItemData(918 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 17, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to launch tactical nukes built from the Shadow Ops."), - - # HotS - ItemNames.ZERGLING: - ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 0, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Fast inexpensive melee attacker. Hatches in pairs from a single larva. Can morph into a Baneling."), - ItemNames.SWARM_QUEEN: - ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 1, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Ranged support caster. Can use the Spawn Creep Tumor and Rapid Transfusion abilities."), - ItemNames.ROACH: - ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 2, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Durable short ranged attacker. Regenerates life quickly when burrowed."), - ItemNames.HYDRALISK: - ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 3, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="High-damage generalist ranged attacker."), - ItemNames.ZERGLING_BANELING_ASPECT: - ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 5, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-ground suicide unit. Does damage over a small area on death."), - ItemNames.ABERRATION: - ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 5, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Durable melee attacker that deals heavy damage and can walk over other units."), - ItemNames.MUTALISK: - ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 6, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Fragile flying attacker. Attacks bounce between targets."), - ItemNames.SWARM_HOST: - ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 7, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Siege unit that attacks by rooting in place and continually spawning Locusts."), - ItemNames.INFESTOR: - ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 8, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Support caster that can move while burrowed. Can use the Fungal Growth, Parasitic Domination, and Consumption abilities."), - ItemNames.ULTRALISK: - ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 9, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Massive melee attacker. Has an area-damage cleave attack."), - ItemNames.SPORE_CRAWLER: - ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 10, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-air defensive structure that can detect cloaked units."), - ItemNames.SPINE_CRAWLER: - ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 11, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-ground defensive structure."), - ItemNames.CORRUPTOR: - ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 12, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"ext"}, - description="Anti-air flying attacker specializing in taking down enemy capital ships."), - ItemNames.SCOURGE: - ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 13, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw", "ext"}, - description="Flying anti-air suicide unit. Hatches in pairs from a single larva."), - ItemNames.BROOD_QUEEN: - ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 4, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw", "ext"}, - description="Flying support caster. Can cast the Ocular Symbiote and Spawn Broodlings abilities."), - ItemNames.DEFILER: - ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 14, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw"}, - description="Support caster. Can use the Dark Swarm, Consume, and Plague abilities."), - - ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 7, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 9, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.ZERG, quantity=3, origin={"hots"}), - - ItemNames.ZERGLING_HARDENED_CARAPACE: - ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, description="Increases Zergling health by +10."), - ItemNames.ZERGLING_ADRENAL_OVERLOAD: - ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, description="Increases Zergling attack speed."), - ItemNames.ZERGLING_METABOLIC_BOOST: - ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 2, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, classification=ItemClassification.filler, - description="Increases Zergling movement speed."), - ItemNames.ROACH_HYDRIODIC_BILE: - ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, description="Roaches deal +8 damage to light targets."), - ItemNames.ROACH_ADAPTIVE_PLATING: - ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 4, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, description="Roaches gain +3 armour when their life is below 50%."), - ItemNames.ROACH_TUNNELING_CLAWS: - ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 5, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Roaches to move while burrowed."), - ItemNames.HYDRALISK_FRENZY: - ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 6, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, - description="Allows Hydralisks to use the Frenzy ability, which increases their attack speed by 50%."), - ItemNames.HYDRALISK_ANCILLARY_CARAPACE: - ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 7, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, classification=ItemClassification.filler, description="Hydralisks gain +20 health."), - ItemNames.HYDRALISK_GROOVED_SPINES: - ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 8, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, description="Hydralisks gain +1 range."), - ItemNames.BANELING_CORROSIVE_ACID: - ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 9, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Increases the damage banelings deal to their primary target. Splash damage remains the same."), - ItemNames.BANELING_RUPTURE: - ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 10, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - classification=ItemClassification.filler, - description="Increases the splash radius of baneling attacks."), - ItemNames.BANELING_REGENERATIVE_ACID: - ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 11, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - classification=ItemClassification.filler, - description="Banelings will heal nearby friendly units when they explode."), - ItemNames.MUTALISK_VICIOUS_GLAIVE: - ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 12, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks attacks will bounce an additional 3 times."), - ItemNames.MUTALISK_RAPID_REGENERATION: - ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 13, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks will regenerate quickly when out of combat."), - ItemNames.MUTALISK_SUNDERING_GLAIVE: - ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 14, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks deal increased damage to their primary target."), - ItemNames.SWARM_HOST_BURROW: - ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 15, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Swarm Hosts to burrow instead of root to spawn locusts."), - ItemNames.SWARM_HOST_RAPID_INCUBATION: - ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 16, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, description="Swarm Hosts will spawn locusts 20% faster."), - ItemNames.SWARM_HOST_PRESSURIZED_GLANDS: - ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 17, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.progression, - description="Allows Swarm Host Locusts to attack air targets."), - ItemNames.ULTRALISK_BURROW_CHARGE: - ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 18, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, - description="Allows Ultralisks to burrow and charge at enemy units, knocking back and stunning units when it emerges."), - ItemNames.ULTRALISK_TISSUE_ASSIMILATION: - ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 19, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks recover health when they deal damage."), - ItemNames.ULTRALISK_MONARCH_BLADES: - ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 20, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks gain increased splash damage."), - ItemNames.CORRUPTOR_CAUSTIC_SPRAY: - ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 21, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR, - origin={"ext"}, - description="Allows Corruptors to use the Caustic Spray ability, which deals ramping damage to buildings over time."), - ItemNames.CORRUPTOR_CORRUPTION: - ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 22, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR, - origin={"ext"}, - description="Allows Corruptors to use the Corruption ability, which causes a target enemy unit to take increased damage."), - ItemNames.SCOURGE_VIRULENT_SPORES: - ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 23, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, description="Scourge will deal splash damage."), - ItemNames.SCOURGE_RESOURCE_EFFICIENCY: - ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 24, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, classification=ItemClassification.progression, - description="Reduces the cost of Scourge by 50 gas per egg."), - ItemNames.SCOURGE_SWARM_SCOURGE: - ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 25, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, description="An extra Scourge will be built from each egg at no additional cost."), - ItemNames.ZERGLING_SHREDDING_CLAWS: - ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 26, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"ext"}, description="Zergling attacks will temporarily reduce their target's armour to 0."), - ItemNames.ROACH_GLIAL_RECONSTITUTION: - ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 27, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"ext"}, description="Increases Roach movement speed."), - ItemNames.ROACH_ORGANIC_CARAPACE: - ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 28, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"ext"}, description="Increases Roach health by +25."), - ItemNames.HYDRALISK_MUSCULAR_AUGMENTS: - ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 29, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"bw"}, description="Increases Hydralisk movement speed."), - ItemNames.HYDRALISK_RESOURCE_EFFICIENCY: - ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 0, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"bw"}, description="Reduces Hydralisk resource cost by 25/25 and supply cost by 1."), - ItemNames.BANELING_CENTRIFUGAL_HOOKS: - ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 1, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, - description="Increases the movement speed of Banelings."), - ItemNames.BANELING_TUNNELING_JAWS: - ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 2, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, - description="Allows Banelings to move while burrowed."), - ItemNames.BANELING_RAPID_METAMORPH: - ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 3, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, description="Banelings morph faster."), - ItemNames.MUTALISK_SEVERING_GLAIVE: - ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 4, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"ext"}, description="Mutalisk bounce attacks will deal full damage."), - ItemNames.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: - ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 5, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"ext"}, description="Increases the attack range of Mutalisks by 2."), - ItemNames.SWARM_HOST_LOCUST_METABOLIC_BOOST: - ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 6, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, classification=ItemClassification.filler, - description="Increases Locust movement speed."), - ItemNames.SWARM_HOST_ENDURING_LOCUSTS: - ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 7, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Increases the duration of Swarm Hosts' Locusts by 10s."), - ItemNames.SWARM_HOST_ORGANIC_CARAPACE: - ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Increases Swarm Host health by +40."), - ItemNames.SWARM_HOST_RESOURCE_EFFICIENCY: - ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Reduces Swarm Host resource cost by 100/25."), - ItemNames.ULTRALISK_ANABOLIC_SYNTHESIS: - ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 10, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}, classification=ItemClassification.filler), - ItemNames.ULTRALISK_CHITINOUS_PLATING: - ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 11, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}), - ItemNames.ULTRALISK_ORGANIC_CARAPACE: - ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"ext"}), - ItemNames.ULTRALISK_RESOURCE_EFFICIENCY: - ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}), - ItemNames.DEVOURER_CORROSIVE_SPRAY: - ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 14, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.DEVOURER_GAPING_MAW: - ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 15, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.DEVOURER_IMPROVED_OSMOSIS: - ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 16, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}, - classification=ItemClassification.filler), - ItemNames.DEVOURER_PRESCIENT_SPORES: - ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 17, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_PROLONGED_DISPERSION: - ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 18, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_PRIMAL_ADAPTATION: - ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 19, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_SORONAN_ACID: - ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 20, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.IMPALER_ADAPTIVE_TALONS: - ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 21, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}, - classification=ItemClassification.filler), - ItemNames.IMPALER_SECRETION_GLANDS: - ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 22, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}), - ItemNames.IMPALER_HARDENED_TENTACLE_SPINES: - ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 23, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}), - ItemNames.LURKER_SEISMIC_SPINES: - ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 24, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}), - ItemNames.LURKER_ADAPTED_SPINES: - ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 25, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_POTENT_BILE: - ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 26, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_BLOATED_BILE_DUCTS: - ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 27, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_DEEP_TUNNEL: - ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 28, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.VIPER_PARASITIC_BOMB: - ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 29, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.VIPER_PARALYTIC_BARBS: - ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 0, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.VIPER_VIRULENT_MICROBES: - ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 1, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_POROUS_CARTILAGE: - ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 2, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_EVOLVED_CARAPACE: - ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 3, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_SPLITTER_MITOSIS: - ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 4, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_RESOURCE_EFFICIENCY: - ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 5, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.INFESTOR_INFESTED_TERRAN: - ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 6, SC2Race.ZERG, parent_item=ItemNames.INFESTOR, - origin={"ext"}), - ItemNames.INFESTOR_MICROBIAL_SHROUD: - ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 7, SC2Race.ZERG, parent_item=ItemNames.INFESTOR, - origin={"ext"}), - ItemNames.SWARM_QUEEN_SPAWN_LARVAE: - ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_DEEP_TUNNEL: - ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_ORGANIC_CARAPACE: - ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}, classification=ItemClassification.filler), - ItemNames.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: - ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_RESOURCE_EFFICIENCY: - ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 12, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_INCUBATOR_CHAMBER: - ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 13, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_FUNGAL_GROWTH: - ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 14, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_ENSNARE: - ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 15, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: - ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 16, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - - ItemNames.ZERGLING_RAPTOR_STRAIN: - ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, - description="Allows Zerglings to jump up and down cliffs and leap onto enemies. Also increases Zergling attack damage by 2."), - ItemNames.ZERGLING_SWARMLING_STRAIN: - ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, - description="Zerglings will spawn instantly and with an extra Zergling per egg at no additional cost."), - ItemNames.ROACH_VILE_STRAIN: - ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 2, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"}, - description="Roach attacks will slow the movement and attack speed of enemies."), - ItemNames.ROACH_CORPSER_STRAIN: - ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"}, - description="Units killed after being attacked by Roaches will spawn 2 Roachlings."), - ItemNames.HYDRALISK_IMPALER_ASPECT: - ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 0, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Hydralisks to morph into Impalers."), - ItemNames.HYDRALISK_LURKER_ASPECT: - ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 1, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, description="Allows Hydralisks to morph into Lurkers."), - ItemNames.BANELING_SPLITTER_STRAIN: - ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 6, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Banelings will split into two smaller Splitterlings on exploding."), - ItemNames.BANELING_HUNTER_STRAIN: - ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 7, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Allows Banelings to jump up and down cliffs and leap onto enemies."), - ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: - ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 2, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Mutalisks and Corruptors to morph into Brood Lords."), - ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT: - ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 3, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Mutalisks and Corruptors to morph into Vipers."), - ItemNames.SWARM_HOST_CARRION_STRAIN: - ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, description="Swarm Hosts will spawn Flying Locusts."), - ItemNames.SWARM_HOST_CREEPER_STRAIN: - ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Swarm Hosts to teleport to any creep on the map in vision. Swarm Hosts will spread creep around them when rooted or burrowed."), - ItemNames.ULTRALISK_NOXIOUS_STRAIN: - ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, classification=ItemClassification.filler, - description="Ultralisks will periodically spread poison, damaging nearby biological enemies."), - ItemNames.ULTRALISK_TORRASQUE_STRAIN: - ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks will revive after being killed."), - - ItemNames.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 1, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 2, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 3, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 4, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 5, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.filler), - ItemNames.KERRIGAN_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 1, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 2, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 6, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 7, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 8, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 3, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 4, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 5, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 9, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 10, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 11, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 12, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 13, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 14, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - # Handled separately from other abilities - ItemNames.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, "Primal Form", 0, SC2Race.ZERG, origin={"hots"}), - - ItemNames.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, "Level", 10, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, "Level", 9, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, "Level", 8, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, "Level", 7, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, "Level", 6, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, "Level", 5, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, "Level", 4, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, "Level", 3, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, "Level", 2, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, "Level", 1, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, "Level", 14, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, "Level", 35, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, "Level", 70, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - - # Zerg Mercs - ItemNames.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.ZERG, origin={"ext"}), - ItemNames.INFESTED_SIEGE_TANKS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.ZERG, origin={"ext"}), - ItemNames.INFESTED_BANSHEES: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.ZERG, origin={"ext"}), - - # Misc Upgrades - ItemNames.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 6, SC2Race.ZERG, origin={"bw"}), - - # Morphs - ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 6, SC2Race.ZERG, origin={"bw"}), - ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 7, SC2Race.ZERG, origin={"bw"}), - ItemNames.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 8, SC2Race.ZERG, origin={"ext"}), - - - # Protoss Units (those that aren't as items in WoL (Prophecy)) - ItemNames.OBSERVER: ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 9, SC2Race.PROTOSS, - classification=ItemClassification.filler, origin={"wol"}, - description="Flying spy. Cloak renders the unit invisible to enemies without detection."), - ItemNames.CENTURION: ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 10, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Powerful melee warrior. Has the Shadow Charge and Darkcoil abilities."), - ItemNames.SENTINEL: ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 11, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Powerful melee warrior. Has the Charge and Reconstruction abilities."), - ItemNames.SUPPLICANT: ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 12, SC2Race.PROTOSS, - classification=ItemClassification.filler, important_for_filtering=True, origin={"ext"}, - description="Powerful melee warrior. Has powerful damage resistant shields."), - ItemNames.INSTIGATOR: ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 13, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Ranged support strider. Can store multiple Blink charges."), - ItemNames.SLAYER: ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 14, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Ranged attack strider. Can use the Phase Blink and Phasing Armor abilities."), - ItemNames.SENTRY: ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 15, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Robotic support unit can use the Guardian Shield ability and restore the shields of nearby Protoss units."), - ItemNames.ENERGIZER: ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 16, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Robotic support unit. Can use the Chrono Beam ability and become stationary to power nearby structures."), - ItemNames.HAVOC: ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 17, SC2Race.PROTOSS, - origin={"lotv"}, important_for_filtering=True, - description="Robotic support unit. Can use the Target Lock and Force Field abilities and increase the range of nearby Protoss units."), - ItemNames.SIGNIFIER: ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 18, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Potent permanently cloaked psionic master. Can use the Feedback and Crippling Psionic Storm abilities. Can merge into an Archon."), - ItemNames.ASCENDANT: ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 19, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Potent psionic master. Can use the Psionic Orb, Mind Blast, and Sacrifice abilities."), - ItemNames.AVENGER: ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 20, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Recalls to the nearest Dark Shrine upon death."), - ItemNames.BLOOD_HUNTER: ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 21, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Can use the Void Stasis ability."), - ItemNames.DRAGOON: ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 22, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ranged assault strider. Has enhanced health and damage."), - ItemNames.DARK_ARCHON: ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 23, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Potent psionic master. Can use the Confuse and Mind Control abilities."), - ItemNames.ADEPT: ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 24, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ranged specialist. Can use the Psionic Transfer ability."), - ItemNames.WARP_PRISM: ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 25, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Flying transport. Can carry units and become stationary to deploy a power field."), - ItemNames.ANNIHILATOR: ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 26, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Assault Strider. Can use the Shadow Cannon ability to damage air and ground units."), - ItemNames.VANGUARD: ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 27, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Assault Strider. Deals splash damage around the primary target."), - ItemNames.WRATHWALKER: ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 28, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Battle strider with a powerful single target attack. Can walk up and down cliffs."), - ItemNames.REAVER: ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 29, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Area damage siege unit. Builds and launches explosive Scarabs for high burst damage."), - ItemNames.DISRUPTOR: ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 0, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Robotic disruption unit. Can use the Purification Nova ability to deal heavy area damage."), - ItemNames.MIRAGE: ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 1, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."), - ItemNames.CORSAIR: ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 2, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Air superiority starfighter. Can use the Disruption Web ability."), - ItemNames.DESTROYER: ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 3, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Area assault craft. Can use the Destruction Beam ability to attack multiple units at once."), - ItemNames.SCOUT: ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 4, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Versatile high-speed fighter."), - ItemNames.TEMPEST: ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 5, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Siege artillery craft. Attacks from long range. Can use the Disintegration ability."), - ItemNames.MOTHERSHIP: ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ultimate Protoss vessel, Can use the Vortex and Mass Recall abilities. Cloaks nearby units and structures."), - ItemNames.ARBITER: ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 7, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units."), - ItemNames.ORACLE: ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Flying caster. Can use the Revelation and Stasis Ward abilities."), - - # Protoss Upgrades - ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 11, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 12, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 13, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 14, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 15, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - - # Protoss Buildings - ItemNames.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, "Building", 0, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"wol", "lotv"}), - ItemNames.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, "Building", 1, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, "Building", 2, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - - # Protoss Unit Upgrades - ItemNames.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 0, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.SUPPLICANT_SHIELD_REGENERATION: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 3, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 4, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 6, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression), - ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 7, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression), - ItemNames.DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 8, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 10, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.DRAGOON), - ItemNames.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 13, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT), - ItemNames.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 16, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 17, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 18, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 19, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 20, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 22, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 23, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 24, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 25, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 26, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 27, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 28, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 29, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 0, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.CARRIER_GRAVITON_CATAPULT: - ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 3, SC2Race.PROTOSS, origin={"wol"}, - parent_item=ItemNames.CARRIER, - description="Carriers can launch Interceptors more quickly."), - ItemNames.CARRIER_HULL_OF_PAST_GLORIES: - ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 4, SC2Race.PROTOSS, origin={"bw"}, - parent_item=ItemNames.CARRIER, - description="Carriers gain +2 armour."), - ItemNames.VOID_RAY_DESTROYER_FLUX_VANES: - ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 5, SC2Race.PROTOSS, classification=ItemClassification.filler, - origin={"ext"}, - description="Increases Void Ray and Destroyer movement speed."), - ItemNames.DESTROYER_REFORGED_BLOODSHARD_CORE: - ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 6, SC2Race.PROTOSS, origin={"ext"}, - parent_item=ItemNames.DESTROYER, - description="When fully charged, the Destroyer's Destruction Beam weapon does full damage to secondary targets."), - ItemNames.WARP_PRISM_GRAVITIC_DRIVE: - ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 7, SC2Race.PROTOSS, classification=ItemClassification.filler, - origin={"ext"}, parent_item=ItemNames.WARP_PRISM, - description="Increases the movement speed of Warp Prisms."), - ItemNames.WARP_PRISM_PHASE_BLASTER: - ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, parent_item=ItemNames.WARP_PRISM, - description="Equips Warp Prisms with an auto-attack that can hit ground and air targets."), - ItemNames.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WARP_PRISM), - ItemNames.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER), - ItemNames.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER), - ItemNames.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 12, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 15, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 16, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD), - ItemNames.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 17, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD), - ItemNames.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 18, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 19, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}), - ItemNames.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 20, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.COLOSSUS), - ItemNames.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WRATHWALKER), - ItemNames.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 22, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.WRATHWALKER), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 23, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 24, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 25, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 26, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 27, SC2Race.PROTOSS, origin={"bw"}, important_for_filtering=True ,parent_item=ItemNames.DARK_TEMPLAR), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 28, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 29, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 0, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 1, SC2Race.PROTOSS, origin={"ext"}, important_for_filtering=True), - ItemNames.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 2, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 3, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 4, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 6, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 7, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 8, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 9, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY), - ItemNames.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY), - ItemNames.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER), - ItemNames.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER), - ItemNames.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 14, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC), - ItemNames.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC), - ItemNames.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 16, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 17, SC2Race.PROTOSS, origin={"bw"}), - - # SoA Calldown powers - ItemNames.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 0, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.PROTOSS, origin={"lotv"}, quantity=2), - ItemNames.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 1, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 2, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 3, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 4, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 5, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 6, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 7, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 8, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 9, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 10, SC2Race.PROTOSS, origin={"lotv"}), - - # Generic Protoss Upgrades - ItemNames.MATRIX_OVERLOAD: - ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 0, SC2Race.PROTOSS, origin={"lotv"}, - description=r"All friendly units gain 25% movement speed and 15% attack speed within a Pylon's power field and for 15 seconds after leaving it."), - ItemNames.QUATRO: - ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 1, SC2Race.PROTOSS, origin={"ext"}, - description="All friendly Protoss units gain the equivalent of their +1 armour, attack, and shield upgrades."), - ItemNames.NEXUS_OVERCHARGE: - ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 2, SC2Race.PROTOSS, origin={"lotv"}, - important_for_filtering=True, description="The Protoss Nexus gains a long-range auto-attack."), - ItemNames.ORBITAL_ASSIMILATORS: - ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 3, SC2Race.PROTOSS, origin={"lotv"}, - description="Assimilators automatically harvest Vespene Gas without the need for Probes."), - ItemNames.WARP_HARMONIZATION: - ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 4, SC2Race.PROTOSS, origin={"lotv"}, - description=r"Stargates and Robotics Facilities can transform to utilize Warp In technology. Warp In cooldowns are 20% faster than original build times."), - ItemNames.GUARDIAN_SHELL: - ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 5, SC2Race.PROTOSS, origin={"lotv"}, - description="The Spear of Adun passively shields friendly Protoss units before death, making them invulnerable for 5 seconds. Each unit can only be shielded once every 60 seconds."), - ItemNames.RECONSTRUCTION_BEAM: - ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="The Spear of Adun will passively heal mechanical units for 5 and non-biological structures for 10 life per second. Up to 3 targets can be repaired at once."), - ItemNames.OVERWATCH: - ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 7, SC2Race.PROTOSS, origin={"ext"}, - description="Once per second, the Spear of Adun will last-hit a damaged enemy unit that is below 50 health."), - ItemNames.SUPERIOR_WARP_GATES: - ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 8, SC2Race.PROTOSS, origin={"ext"}, - description="Protoss Warp Gates can hold up to 3 charges of unit warp-ins."), - ItemNames.ENHANCED_TARGETING: - ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 9, SC2Race.PROTOSS, origin={"ext"}, - description="Protoss defensive structures gain +2 range."), - ItemNames.OPTIMIZED_ORDNANCE: - ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 10, SC2Race.PROTOSS, origin={"ext"}, - description="Increases the attack speed of Protoss defensive structures by 25%."), - ItemNames.KHALAI_INGENUITY: - ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 11, SC2Race.PROTOSS, origin={"ext"}, - description="Pylons, Photon Cannons, Monoliths, and Shield Batteries warp in near-instantly."), - ItemNames.AMPLIFIED_ASSIMILATORS: - ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 12, SC2Race.PROTOSS, origin={"ext"}, - description=r"Assimilators produce Vespene gas 25% faster."), -} - - -def get_item_table(): - return item_table - - -basic_units = { - SC2Race.TERRAN: { - ItemNames.MARINE, - ItemNames.MARAUDER, - ItemNames.GOLIATH, - ItemNames.HELLION, - ItemNames.VULTURE, - ItemNames.WARHOUND, - }, - SC2Race.ZERG: { - ItemNames.ZERGLING, - ItemNames.SWARM_QUEEN, - ItemNames.ROACH, - ItemNames.HYDRALISK, - }, - SC2Race.PROTOSS: { - ItemNames.ZEALOT, - ItemNames.CENTURION, - ItemNames.SENTINEL, - ItemNames.STALKER, - ItemNames.INSTIGATOR, - ItemNames.SLAYER, - ItemNames.DRAGOON, - ItemNames.ADEPT, - } -} - -advanced_basic_units = { - SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ - ItemNames.REAPER, - ItemNames.DIAMONDBACK, - ItemNames.VIKING, - ItemNames.SIEGE_TANK, - ItemNames.BANSHEE, - ItemNames.THOR, - ItemNames.BATTLECRUISER, - ItemNames.CYCLONE - }), - SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ - ItemNames.INFESTOR, - ItemNames.ABERRATION, - }), - SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ - ItemNames.DARK_TEMPLAR, - ItemNames.BLOOD_HUNTER, - ItemNames.AVENGER, - ItemNames.IMMORTAL, - ItemNames.ANNIHILATOR, - ItemNames.VANGUARD, - }) -} - -no_logic_starting_units = { - SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ - ItemNames.FIREBAT, - ItemNames.GHOST, - ItemNames.SPECTRE, - ItemNames.WRAITH, - ItemNames.RAVEN, - ItemNames.PREDATOR, - ItemNames.LIBERATOR, - ItemNames.HERC, - }), - SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ - ItemNames.ULTRALISK, - ItemNames.SWARM_HOST - }), - SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ - ItemNames.CARRIER, - ItemNames.TEMPEST, - ItemNames.VOID_RAY, - ItemNames.DESTROYER, - ItemNames.COLOSSUS, - ItemNames.WRATHWALKER, - ItemNames.SCOUT, - ItemNames.HIGH_TEMPLAR, - ItemNames.SIGNIFIER, - ItemNames.ASCENDANT, - ItemNames.DARK_ARCHON, - ItemNames.SUPPLICANT, - }) -} - -not_balanced_starting_units = { - ItemNames.SIEGE_TANK, - ItemNames.THOR, - ItemNames.BANSHEE, - ItemNames.BATTLECRUISER, - ItemNames.ULTRALISK, - ItemNames.CARRIER, - ItemNames.TEMPEST, -} - - -def get_basic_units(world: World, race: SC2Race) -> typing.Set[str]: - logic_level = get_option_value(world, 'required_tactics') - if logic_level == RequiredTactics.option_no_logic: - return no_logic_starting_units[race] - elif logic_level == RequiredTactics.option_advanced: - return advanced_basic_units[race] - else: - return basic_units[race] - - -# Items that can be placed before resources if not already in -# General upgrades and Mercs -second_pass_placeable_items: typing.Tuple[str, ...] = ( - # Global weapon/armor upgrades - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, - # Terran Buildings without upgrades - ItemNames.SENSOR_TOWER, - ItemNames.HIVE_MIND_EMULATOR, - ItemNames.PSI_DISRUPTER, - ItemNames.PERDITION_TURRET, - # Terran units without upgrades - ItemNames.HERC, - ItemNames.WARHOUND, - # General Terran upgrades without any dependencies - ItemNames.SCV_ADVANCED_CONSTRUCTION, - ItemNames.SCV_DUAL_FUSION_WELDERS, - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, - ItemNames.PROGRESSIVE_ORBITAL_COMMAND, - ItemNames.ULTRA_CAPACITORS, - ItemNames.VANADIUM_PLATING, - ItemNames.ORBITAL_DEPOTS, - ItemNames.MICRO_FILTERING, - ItemNames.AUTOMATED_REFINERY, - ItemNames.COMMAND_CENTER_REACTOR, - ItemNames.TECH_REACTOR, - ItemNames.CELLULAR_REACTOR, - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 - ItemNames.STRUCTURE_ARMOR, - ItemNames.HI_SEC_AUTO_TRACKING, - ItemNames.ADVANCED_OPTICS, - ItemNames.ROGUE_FORCES, - # Mercenaries (All races) - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Mercenary"], - # Kerrigan and Nova levels, abilities and generally useful stuff - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type in ("Level", "Ability", "Evolution Pit", "Nova Gear")], - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, - # Zerg static defenses - ItemNames.SPORE_CRAWLER, - ItemNames.SPINE_CRAWLER, - # Defiler, Aberration (no upgrades) - ItemNames.DEFILER, - ItemNames.ABERRATION, - # Spear of Adun Abilities - ItemNames.SOA_CHRONO_SURGE, - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON, - ItemNames.SOA_PYLON_OVERCHARGE, - ItemNames.SOA_ORBITAL_STRIKE, - ItemNames.SOA_TEMPORAL_FIELD, - ItemNames.SOA_SOLAR_LANCE, - ItemNames.SOA_MASS_RECALL, - ItemNames.SOA_SHIELD_OVERCHARGE, - ItemNames.SOA_DEPLOY_FENIX, - ItemNames.SOA_PURIFIER_BEAM, - ItemNames.SOA_TIME_STOP, - ItemNames.SOA_SOLAR_BOMBARDMENT, - # Protoss generic upgrades - ItemNames.MATRIX_OVERLOAD, - ItemNames.QUATRO, - ItemNames.NEXUS_OVERCHARGE, - ItemNames.ORBITAL_ASSIMILATORS, - ItemNames.WARP_HARMONIZATION, - ItemNames.GUARDIAN_SHELL, - ItemNames.RECONSTRUCTION_BEAM, - ItemNames.OVERWATCH, - ItemNames.SUPERIOR_WARP_GATES, - ItemNames.KHALAI_INGENUITY, - ItemNames.AMPLIFIED_ASSIMILATORS, - # Protoss static defenses - ItemNames.PHOTON_CANNON, - ItemNames.KHAYDARIN_MONOLITH, - ItemNames.SHIELD_BATTERY -) - - -filler_items: typing.Tuple[str, ...] = ( - ItemNames.STARTING_MINERALS, - ItemNames.STARTING_VESPENE, - ItemNames.STARTING_SUPPLY, -) - -# Defense rating table -# Commented defense ratings are handled in LogicMixin -defense_ratings = { - ItemNames.SIEGE_TANK: 5, - # "Maelstrom Rounds": 2, - ItemNames.PLANETARY_FORTRESS: 3, - # Bunker w/ Marine/Marauder: 3, - ItemNames.PERDITION_TURRET: 2, - ItemNames.VULTURE: 1, - ItemNames.BANSHEE: 1, - ItemNames.BATTLECRUISER: 1, - ItemNames.LIBERATOR: 4, - ItemNames.WIDOW_MINE: 1, - # "Concealment (Widow Mine)": 1 -} -zerg_defense_ratings = { - ItemNames.PERDITION_TURRET: 2, - # Bunker w/ Firebat: 2, - ItemNames.LIBERATOR: -2, - ItemNames.HIVE_MIND_EMULATOR: 3, - ItemNames.PSI_DISRUPTER: 3, -} -air_defense_ratings = { - ItemNames.MISSILE_TURRET: 2, -} - -kerrigan_levels = [item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Level" and item_data.race == SC2Race.ZERG] - -spider_mine_sources = { - ItemNames.VULTURE, - ItemNames.REAPER_SPIDER_MINES, - ItemNames.SIEGE_TANK_SPIDER_MINES, - ItemNames.RAVEN_SPIDER_MINES, -} - -progressive_if_nco = { - ItemNames.MARINE_PROGRESSIVE_STIMPACK, - ItemNames.FIREBAT_PROGRESSIVE_STIMPACK, - ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, -} - -progressive_if_ext = { - ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, - ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, - ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, - ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, - ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, - ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, - ItemNames.PROGRESSIVE_ORBITAL_COMMAND -} - -kerrigan_actives: typing.List[typing.Set[str]] = [ - {ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE}, - {ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT}, - set(), - {ItemNames.KERRIGAN_WILD_MUTATION, ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_MEND}, - set(), - set(), - {ItemNames.KERRIGAN_APOCALYPSE, ItemNames.KERRIGAN_SPAWN_LEVIATHAN, ItemNames.KERRIGAN_DROP_PODS}, -] - -kerrigan_passives: typing.List[typing.Set[str]] = [ - {ItemNames.KERRIGAN_HEROIC_FORTITUDE}, - {ItemNames.KERRIGAN_CHAIN_REACTION}, - {ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION, ItemNames.KERRIGAN_IMPROVED_OVERLORDS, ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS}, - set(), - {ItemNames.KERRIGAN_TWIN_DRONES, ItemNames.KERRIGAN_MALIGNANT_CREEP, ItemNames.KERRIGAN_VESPENE_EFFICIENCY}, - {ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY}, - set(), -] - -kerrigan_only_passives = { - ItemNames.KERRIGAN_HEROIC_FORTITUDE, ItemNames.KERRIGAN_CHAIN_REACTION, - ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY, -} - -spear_of_adun_calldowns = { - ItemNames.SOA_CHRONO_SURGE, - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON, - ItemNames.SOA_PYLON_OVERCHARGE, - ItemNames.SOA_ORBITAL_STRIKE, - ItemNames.SOA_TEMPORAL_FIELD, - ItemNames.SOA_SOLAR_LANCE, - ItemNames.SOA_MASS_RECALL, - ItemNames.SOA_SHIELD_OVERCHARGE, - ItemNames.SOA_DEPLOY_FENIX, - ItemNames.SOA_PURIFIER_BEAM, - ItemNames.SOA_TIME_STOP, - ItemNames.SOA_SOLAR_BOMBARDMENT -} - -spear_of_adun_castable_passives = { - ItemNames.RECONSTRUCTION_BEAM, - ItemNames.OVERWATCH, -} - -nova_equipment = { - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Nova Gear"], - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE -} - -# 'number' values of upgrades for upgrade bundle items -upgrade_numbers = [ - # Terran - {0, 4, 8}, # Weapon - {2, 6, 10}, # Armor - {0, 2}, # Infantry - {4, 6}, # Vehicle - {8, 10}, # Starship - {0, 2, 4, 6, 8, 10}, # All - # Zerg - {0, 2, 6}, # Weapon - {4, 8}, # Armor - {0, 2, 4}, # Ground - {6, 8}, # Flyer - {0, 2, 4, 6, 8}, # All - # Protoss - {0, 6}, # Weapon - {2, 4, 8}, # Armor - {0, 2}, # Ground, Shields are handled specially - {6, 8}, # Air, Shields are handled specially - {0, 2, 4, 6, 8}, # All -] -# 'upgrade_numbers' indices for all upgrades -upgrade_numbers_all = { - SC2Race.TERRAN: 5, - SC2Race.ZERG: 10, - SC2Race.PROTOSS: 15, -} - -# Names of upgrades to be included for different options -upgrade_included_names = [ - { # Individual Items - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, - ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR, - ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK, - ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK, - ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE, - ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK, - ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR, - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, - ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON, - ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR, - }, - { # Bundle Weapon And Armor - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, - }, - { # Bundle Unit Class - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE, - }, - { # Bundle All - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, - } -] - -lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if - data.code} - -# Map type to expected int -type_flaggroups: typing.Dict[SC2Race, typing.Dict[str, int]] = { - SC2Race.ANY: { - "Minerals": 0, - "Vespene": 1, - "Supply": 2, - "Goal": 3, - "Nothing Group": 4, - }, - SC2Race.TERRAN: { - "Armory 1": 0, - "Armory 2": 1, - "Armory 3": 2, - "Armory 4": 3, - "Armory 5": 4, - "Armory 6": 5, - "Progressive Upgrade": 6, # Unit upgrades that exist multiple times (Stimpack / Super Stimpack) - "Laboratory": 7, - "Upgrade": 8, # Weapon / Armor upgrades - "Unit": 9, - "Building": 10, - "Mercenary": 11, - "Nova Gear": 12, - "Progressive Upgrade 2": 13, - }, - SC2Race.ZERG: { - "Ability": 0, - "Mutation 1": 1, - "Strain": 2, - "Morph": 3, - "Upgrade": 4, - "Mercenary": 5, - "Unit": 6, - "Level": 7, - "Primal Form": 8, - "Evolution Pit": 9, - "Mutation 2": 10, - "Mutation 3": 11 - }, - SC2Race.PROTOSS: { - "Unit": 0, - "Unit 2": 1, - "Upgrade": 2, # Weapon / Armor upgrades - "Building": 3, - "Progressive Upgrade": 4, - "Spear of Adun": 5, - "Solarite Core": 6, - "Forge 1": 7, - "Forge 2": 8, - "Forge 3": 9, - } -} diff --git a/worlds/sc2/Locations.py b/worlds/sc2/Locations.py deleted file mode 100644 index 42b1dd4d..00000000 --- a/worlds/sc2/Locations.py +++ /dev/null @@ -1,1635 +0,0 @@ -from enum import IntEnum -from typing import List, Tuple, Optional, Callable, NamedTuple, Set, Any -from BaseClasses import MultiWorld -from . import ItemNames -from .Options import get_option_value, kerrigan_unit_available, RequiredTactics, GrantStoryTech, LocationInclusion, \ - EnableHotsMissions -from .Rules import SC2Logic - -from BaseClasses import Location -from worlds.AutoWorld import World - -SC2WOL_LOC_ID_OFFSET = 1000 -SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda -SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 -SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 - - -class SC2Location(Location): - game: str = "Starcraft2" - - -class LocationType(IntEnum): - VICTORY = 0 # Winning a mission - VANILLA = 1 # Objectives that provided metaprogression in the original campaign, along with a few other locations for a balanced experience - EXTRA = 2 # Additional locations based on mission progression, collecting in-mission rewards, etc. that do not significantly increase the challenge. - CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission, and often associated with Achievements - MASTERY = 4 # Extremely challenging objectives often associated with Masteries and Feats of Strength in the original campaign - - -class LocationData(NamedTuple): - region: str - name: str - code: Optional[int] - type: LocationType - rule: Optional[Callable[[Any], bool]] = Location.access_rule - - -def get_location_types(world: World, inclusion_type: LocationInclusion) -> Set[LocationType]: - """ - - :param multiworld: - :param player: - :param inclusion_type: Level of inclusion to check for - :return: A list of location types that match the inclusion type - """ - exclusion_options = [ - ("vanilla_locations", LocationType.VANILLA), - ("extra_locations", LocationType.EXTRA), - ("challenge_locations", LocationType.CHALLENGE), - ("mastery_locations", LocationType.MASTERY) - ] - excluded_location_types = set() - for option_name, location_type in exclusion_options: - if get_option_value(world, option_name) is inclusion_type: - excluded_location_types.add(location_type) - return excluded_location_types - - -def get_plando_locations(world: World) -> List[str]: - """ - - :param multiworld: - :param player: - :return: A list of locations affected by a plando in a world - """ - if world is None: - return [] - plando_locations = [] - for plando_setting in world.options.plando_items: - plando_locations += plando_setting.locations - - return plando_locations - - -def get_locations(world: Optional[World]) -> Tuple[LocationData, ...]: - # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option - logic_level = get_option_value(world, 'required_tactics') - adv_tactics = logic_level != RequiredTactics.option_standard - kerriganless = get_option_value(world, 'kerrigan_presence') not in kerrigan_unit_available \ - or get_option_value(world, "enable_hots_missions") == EnableHotsMissions.option_false - story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - logic = SC2Logic(world) - player = None if world is None else world.player - location_table: List[LocationData] = [ - # WoL - LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY), - LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.EXTRA), - LocationData("Liberation Day", "Liberation Day: Transport", SC2WOL_LOC_ID_OFFSET + 108, LocationType.EXTRA), - LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.EXTRA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Close Resource Pickups", SC2WOL_LOC_ID_OFFSET + 204, LocationType.EXTRA), - LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2 and - (adv_tactics or logic.terran_basic_anti_air(state))), - LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.VANILLA), - LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Ride's on its Way", SC2WOL_LOC_ID_OFFSET + 308, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Zero Hour", "Zero Hour: Hold Just a Little Longer", SC2WOL_LOC_ID_OFFSET + 309, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Zero Hour", "Zero Hour: Cavalry's on the Way", SC2WOL_LOC_ID_OFFSET + 310, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.terran_early_tech(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Evacuation", "Evacuation: North Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("Evacuation", "Evacuation: West Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("Evacuation", "Evacuation: East Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.EXTRA), - LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.EXTRA), - LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE, - lambda state: logic.terran_early_tech(state) and - logic.terran_defense_rating(state, True, False) >= 2 and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.terran_defense_rating(state, True, False) >= 4 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southwest Gas Pickups", SC2WOL_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: East Gas Pickups", SC2WOL_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: Southeast Gas Pickups", SC2WOL_LOC_ID_OFFSET + 711, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.VANILLA), - LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.VANILLA), - LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state) or adv_tactics), - LocationData("The Dig", "The Dig: Door Outer Layer", SC2WOL_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Door Thermal Barrier", SC2WOL_LOC_ID_OFFSET + 906, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Cutting Through the Core", SC2WOL_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Structure Access Imminent", SC2WOL_LOC_ID_OFFSET + 908, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.VANILLA), - LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.VANILLA, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.VANILLA, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.VANILLA), - LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.VANILLA), - LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.VANILLA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.VANILLA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.EXTRA), - LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.EXTRA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.EXTRA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.EXTRA), - LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.VANILLA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.VANILLA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: adv_tactics or - logic.terran_basic_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.VANILLA), - LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.EXTRA), - LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.EXTRA, - lambda state: adv_tactics or - logic.terran_basic_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.CHALLENGE, - lambda state: logic.terran_basic_anti_air(state) and - (adv_tactics or - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: Zerg Cleared", SC2WOL_LOC_ID_OFFSET + 1308, LocationType.CHALLENGE, - lambda state: logic.terran_competent_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.VANILLA), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.VANILLA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.VANILLA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405, - LocationType.MASTERY, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_beats_protoss_deathball(state) - and logic.terran_base_trasher(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_comp(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY), - LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.VANILLA), - LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.VANILLA), - LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.EXTRA), - LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY), - LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.VANILLA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.VANILLA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE, - lambda state: (adv_tactics or logic.terran_common_unit(state)) and - logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: Flawless", SC2WOL_LOC_ID_OFFSET + 1711, LocationType.CHALLENGE, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 2 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1712, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 4 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1713, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 6 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1714, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - (adv_tactics or logic.terran_basic_anti_air)), - LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.VANILLA), - LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, - LocationType.CHALLENGE, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.VANILLA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.VANILLA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.VANILLA), - LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Surprise Attack Ends", SC2WOL_LOC_ID_OFFSET + 2009, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.VANILLA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Entrance Holding Pen", SC2WOL_LOC_ID_OFFSET + 2107, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Cargo Bay Warbot", SC2WOL_LOC_ID_OFFSET + 2108, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Escape Warbot", SC2WOL_LOC_ID_OFFSET + 2109, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY), - LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.EXTRA), - LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.EXTRA), - LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.EXTRA), - LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.VANILLA, - lambda state: adv_tactics or logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.VANILLA, - lambda state: adv_tactics or logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Southwest Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.CHALLENGE, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.VANILLA), - LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.VANILLA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.EXTRA), - LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.EXTRA), - LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY), - LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.EXTRA), - LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Southwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2606, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Northwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2607, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Northeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2608, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: East Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2609, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Southeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2610, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Expansion Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2611, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY), - LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.VANILLA), - LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.VANILLA), - LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.VANILLA), - LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("All-In", "All-In: Victory", SC2WOL_LOC_ID_OFFSET + 2900, LocationType.VICTORY, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: First Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2901, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Second Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2902, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Third Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2903, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Fourth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2904, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Fifth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2905, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - - # HotS - LocationData("Lab Rat", "Lab Rat: Victory", SC2HOTS_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: Gather Minerals", SC2HOTS_LOC_ID_OFFSET + 101, LocationType.VANILLA), - LocationData("Lab Rat", "Lab Rat: South Zergling Group", SC2HOTS_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: East Zergling Group", SC2HOTS_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: West Zergling Group", SC2HOTS_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: Hatchery", SC2HOTS_LOC_ID_OFFSET + 105, LocationType.EXTRA), - LocationData("Lab Rat", "Lab Rat: Overlord", SC2HOTS_LOC_ID_OFFSET + 106, LocationType.EXTRA), - LocationData("Lab Rat", "Lab Rat: Gas Turrets", SC2HOTS_LOC_ID_OFFSET + 107, LocationType.EXTRA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Back in the Saddle", "Back in the Saddle: Victory", SC2HOTS_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Back in the Saddle", "Back in the Saddle: Defend the Tram", SC2HOTS_LOC_ID_OFFSET + 201, LocationType.EXTRA, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Back in the Saddle", "Back in the Saddle: Kinetic Blast", SC2HOTS_LOC_ID_OFFSET + 202, LocationType.VANILLA), - LocationData("Back in the Saddle", "Back in the Saddle: Crushing Grip", SC2HOTS_LOC_ID_OFFSET + 203, LocationType.VANILLA), - LocationData("Back in the Saddle", "Back in the Saddle: Reach the Sublevel", SC2HOTS_LOC_ID_OFFSET + 204, LocationType.EXTRA), - LocationData("Back in the Saddle", "Back in the Saddle: Door Section Cleared", SC2HOTS_LOC_ID_OFFSET + 205, LocationType.EXTRA, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Rendezvous", "Rendezvous: Victory", SC2HOTS_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Right Queen", SC2HOTS_LOC_ID_OFFSET + 301, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Center Queen", SC2HOTS_LOC_ID_OFFSET + 302, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Left Queen", SC2HOTS_LOC_ID_OFFSET + 303, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Hold Out Finished", SC2HOTS_LOC_ID_OFFSET + 304, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Victory", SC2HOTS_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: First Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("Harvest of Screams", "Harvest of Screams: North Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: West Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 403, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Lost Brood", SC2HOTS_LOC_ID_OFFSET + 404, LocationType.EXTRA), - LocationData("Harvest of Screams", "Harvest of Screams: Northeast Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 405, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Northwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 406, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Southwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 407, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Nafash", SC2HOTS_LOC_ID_OFFSET + 408, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Victory", SC2HOTS_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: East Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 501, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Center Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) or adv_tactics), - LocationData("Shoot the Messenger", "Shoot the Messenger: West Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 503, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Destroy 4 Shuttles", SC2HOTS_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Frozen Expansion", SC2HOTS_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Southwest Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 506, LocationType.EXTRA), - LocationData("Shoot the Messenger", "Shoot the Messenger: Southeast Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) or adv_tactics), - LocationData("Shoot the Messenger", "Shoot the Messenger: West Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 508, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: East Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 509, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state)), - LocationData("Enemy Within", "Enemy Within: Victory", SC2HOTS_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.zerg_pass_vents(state) - and (logic.story_tech_granted - or state.has_any({ItemNames.ZERGLING_RAPTOR_STRAIN, ItemNames.ROACH, - ItemNames.HYDRALISK, ItemNames.INFESTOR}, player)) - ), - LocationData("Enemy Within", "Enemy Within: Infest Giant Ursadon", SC2HOTS_LOC_ID_OFFSET + 601, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: First Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 602, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Second Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 603, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Third Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 604, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Warp Drive", SC2HOTS_LOC_ID_OFFSET + 605, LocationType.EXTRA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Stasis Quadrant", SC2HOTS_LOC_ID_OFFSET + 606, LocationType.EXTRA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Domination", "Domination: Victory", SC2HOTS_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Domination", "Domination: Center Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: North Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Repel Zagara", SC2HOTS_LOC_ID_OFFSET + 703, LocationType.EXTRA), - LocationData("Domination", "Domination: Close Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 704, LocationType.EXTRA), - LocationData("Domination", "Domination: South Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 705, LocationType.EXTRA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Southwest Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 706, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Southeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 707, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Domination", "Domination: North Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 708, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Northeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Victory", SC2HOTS_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: West Biomass", SC2HOTS_LOC_ID_OFFSET + 801, LocationType.VANILLA), - LocationData("Fire in the Sky", "Fire in the Sky: North Biomass", SC2HOTS_LOC_ID_OFFSET + 802, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: South Biomass", SC2HOTS_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Destroy 3 Gorgons", SC2HOTS_LOC_ID_OFFSET + 804, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Close Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 805, LocationType.EXTRA), - LocationData("Fire in the Sky", "Fire in the Sky: South Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 806, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Fire in the Sky", "Fire in the Sky: North Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 807, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: West Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 808, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: East Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 809, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Old Soldiers", "Old Soldiers: Victory", SC2HOTS_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: East Science Lab", SC2HOTS_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: North Science Lab", SC2HOTS_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: Get Nuked", SC2HOTS_LOC_ID_OFFSET + 903, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Entrance Gate", SC2HOTS_LOC_ID_OFFSET + 904, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Citadel Gate", SC2HOTS_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: South Expansion", SC2HOTS_LOC_ID_OFFSET + 906, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Rich Mineral Expansion", SC2HOTS_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: Victory", SC2HOTS_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: Center Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1001, LocationType.VANILLA), - LocationData("Waking the Ancient", "Waking the Ancient: East Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - (adv_tactics and logic.zerg_basic_anti_air(state) - or logic.zerg_competent_anti_air(state))), - LocationData("Waking the Ancient", "Waking the Ancient: South Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1003, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - (adv_tactics and logic.zerg_basic_anti_air(state) - or logic.zerg_competent_anti_air(state))), - LocationData("Waking the Ancient", "Waking the Ancient: Finish Feeding", SC2HOTS_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: South Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1005, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: East Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1006, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: South Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1007, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: East Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1008, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Victory", SC2HOTS_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Tyrannozor", SC2HOTS_LOC_ID_OFFSET + 1101, LocationType.VANILLA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Reach the Pool", SC2HOTS_LOC_ID_OFFSET + 1102, LocationType.VANILLA), - LocationData("The Crucible", "The Crucible: 15 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1103, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: 5 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1104, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Pincer Attack", SC2HOTS_LOC_ID_OFFSET + 1105, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Yagdra Claims Brakk's Pack", SC2HOTS_LOC_ID_OFFSET + 1106, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Supreme", "Supreme: Victory", SC2HOTS_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: First Relic", SC2HOTS_LOC_ID_OFFSET + 1201, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Second Relic", SC2HOTS_LOC_ID_OFFSET + 1202, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Third Relic", SC2HOTS_LOC_ID_OFFSET + 1203, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Fourth Relic", SC2HOTS_LOC_ID_OFFSET + 1204, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Yagdra", SC2HOTS_LOC_ID_OFFSET + 1205, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Kraith", SC2HOTS_LOC_ID_OFFSET + 1206, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Slivan", SC2HOTS_LOC_ID_OFFSET + 1207, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Infested", "Infested: Victory", SC2HOTS_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - ((logic.zerg_competent_anti_air(state) and state.has(ItemNames.INFESTOR, player)) or - (adv_tactics and logic.zerg_basic_anti_air(state)))), - LocationData("Infested", "Infested: East Science Facility", SC2HOTS_LOC_ID_OFFSET + 1301, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: Center Science Facility", SC2HOTS_LOC_ID_OFFSET + 1302, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: West Science Facility", SC2HOTS_LOC_ID_OFFSET + 1303, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: First Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1304, LocationType.EXTRA), - LocationData("Infested", "Infested: Second Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1305, LocationType.EXTRA), - LocationData("Infested", "Infested: Base Garrison", SC2HOTS_LOC_ID_OFFSET + 1306, LocationType.EXTRA), - LocationData("Infested", "Infested: East Garrison", SC2HOTS_LOC_ID_OFFSET + 1307, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Mid Garrison", SC2HOTS_LOC_ID_OFFSET + 1308, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: North Garrison", SC2HOTS_LOC_ID_OFFSET + 1309, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Close Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1310, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Far Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1311, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Hand of Darkness", "Hand of Darkness: Victory", SC2HOTS_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: North Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1401, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: South Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1402, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 1 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1403, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 2 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 3 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1405, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 4 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1406, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 5 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1407, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 6 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1408, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 7 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1409, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Victory", SC2HOTS_LOC_ID_OFFSET + 1500, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Crystal", SC2HOTS_LOC_ID_OFFSET + 1501, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Crystal", SC2HOTS_LOC_ID_OFFSET + 1502, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: South Crystal", SC2HOTS_LOC_ID_OFFSET + 1503, LocationType.VANILLA), - LocationData("Phantoms of the Void", "Phantoms of the Void: Base Established", SC2HOTS_LOC_ID_OFFSET + 1504, LocationType.EXTRA), - LocationData("Phantoms of the Void", "Phantoms of the Void: Close Temple", SC2HOTS_LOC_ID_OFFSET + 1505, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Mid Temple", SC2HOTS_LOC_ID_OFFSET + 1506, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Southeast Temple", SC2HOTS_LOC_ID_OFFSET + 1507, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Temple", SC2HOTS_LOC_ID_OFFSET + 1508, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Temple", SC2HOTS_LOC_ID_OFFSET + 1509, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("With Friends Like These", "With Friends Like These: Victory", SC2HOTS_LOC_ID_OFFSET + 1600, LocationType.VICTORY), - LocationData("With Friends Like These", "With Friends Like These: Pirate Capital Ship", SC2HOTS_LOC_ID_OFFSET + 1601, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: First Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1602, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: Second Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1603, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: Third Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1604, LocationType.VANILLA), - LocationData("Conviction", "Conviction: Victory", SC2HOTS_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.two_kerrigan_actives(state) and - (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless), - LocationData("Conviction", "Conviction: First Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1701, LocationType.VANILLA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Conviction", "Conviction: Second Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1702, LocationType.VANILLA, - lambda state: logic.two_kerrigan_actives(state) and - (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless), - LocationData("Conviction", "Conviction: Power Coupling", SC2HOTS_LOC_ID_OFFSET + 1703, LocationType.EXTRA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Conviction", "Conviction: Door Blasted", SC2HOTS_LOC_ID_OFFSET + 1704, LocationType.EXTRA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Planetfall", "Planetfall: Victory", SC2HOTS_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: East Gate", SC2HOTS_LOC_ID_OFFSET + 1801, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Northwest Gate", SC2HOTS_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: North Gate", SC2HOTS_LOC_ID_OFFSET + 1803, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 1 Bile Launcher Deployed", SC2HOTS_LOC_ID_OFFSET + 1804, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 2 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1805, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 3 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1806, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 4 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1807, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 5 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1808, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Sons of Korhal", SC2HOTS_LOC_ID_OFFSET + 1809, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Night Wolves", SC2HOTS_LOC_ID_OFFSET + 1810, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: West Expansion", SC2HOTS_LOC_ID_OFFSET + 1811, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Mid Expansion", SC2HOTS_LOC_ID_OFFSET + 1812, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Victory", SC2HOTS_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: First Power Link", SC2HOTS_LOC_ID_OFFSET + 1901, LocationType.VANILLA), - LocationData("Death From Above", "Death From Above: Second Power Link", SC2HOTS_LOC_ID_OFFSET + 1902, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Third Power Link", SC2HOTS_LOC_ID_OFFSET + 1903, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Expansion Command Center", SC2HOTS_LOC_ID_OFFSET + 1904, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Main Path Command Center", SC2HOTS_LOC_ID_OFFSET + 1905, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Reckoning", "The Reckoning: Victory", SC2HOTS_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: South Lane", SC2HOTS_LOC_ID_OFFSET + 2001, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: North Lane", SC2HOTS_LOC_ID_OFFSET + 2002, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: East Lane", SC2HOTS_LOC_ID_OFFSET + 2003, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: Odin", SC2HOTS_LOC_ID_OFFSET + 2004, LocationType.EXTRA, - lambda state: logic.the_reckoning_requirement(state)), - - # LotV Prologue - LocationData("Dark Whispers", "Dark Whispers: Victory", SC2LOTV_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: First Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 101, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: Second Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: First Pylon", SC2LOTV_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: Second Pylon", SC2LOTV_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: Victory", SC2LOTV_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: South Rock Formation", SC2LOTV_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: West Rock Formation", SC2LOTV_LOC_ID_OFFSET + 202, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: East Rock Formation", SC2LOTV_LOC_ID_OFFSET + 203, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state) \ - and logic.protoss_can_attack_behind_chasm(state)), - LocationData("Evil Awoken", "Evil Awoken: Victory", SC2LOTV_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: adv_tactics or logic.protoss_stalker_upgrade(state)), - LocationData("Evil Awoken", "Evil Awoken: Temple Investigated", SC2LOTV_LOC_ID_OFFSET + 301, LocationType.EXTRA), - LocationData("Evil Awoken", "Evil Awoken: Void Catalyst", SC2LOTV_LOC_ID_OFFSET + 302, LocationType.EXTRA), - LocationData("Evil Awoken", "Evil Awoken: First Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 303, LocationType.VANILLA), - LocationData("Evil Awoken", "Evil Awoken: Second Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 304, LocationType.VANILLA), - LocationData("Evil Awoken", "Evil Awoken: Third Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 305, LocationType.VANILLA), - - - # LotV - LocationData("For Aiur!", "For Aiur!: Victory", SC2LOTV_LOC_ID_OFFSET + 400, LocationType.VICTORY), - LocationData("For Aiur!", "For Aiur!: Southwest Hive", SC2LOTV_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: Northwest Hive", SC2LOTV_LOC_ID_OFFSET + 402, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: Northeast Hive", SC2LOTV_LOC_ID_OFFSET + 403, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: East Hive", SC2LOTV_LOC_ID_OFFSET + 404, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: West Conduit", SC2LOTV_LOC_ID_OFFSET + 405, LocationType.EXTRA), - LocationData("For Aiur!", "For Aiur!: Middle Conduit", SC2LOTV_LOC_ID_OFFSET + 406, LocationType.EXTRA), - LocationData("For Aiur!", "For Aiur!: Northeast Conduit", SC2LOTV_LOC_ID_OFFSET + 407, LocationType.EXTRA), - LocationData("The Growing Shadow", "The Growing Shadow: Victory", SC2LOTV_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: Close Pylon", SC2LOTV_LOC_ID_OFFSET + 501, LocationType.VANILLA), - LocationData("The Growing Shadow", "The Growing Shadow: East Pylon", SC2LOTV_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: West Pylon", SC2LOTV_LOC_ID_OFFSET + 503, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: Nexus", SC2LOTV_LOC_ID_OFFSET + 504, LocationType.EXTRA), - LocationData("The Growing Shadow", "The Growing Shadow: Templar Base", SC2LOTV_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Victory", SC2LOTV_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Close Warp Gate", SC2LOTV_LOC_ID_OFFSET + 601, LocationType.VANILLA), - LocationData("The Spear of Adun", "The Spear of Adun: West Warp Gate", SC2LOTV_LOC_ID_OFFSET + 602, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: North Warp Gate", SC2LOTV_LOC_ID_OFFSET + 603, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: North Power Cell", SC2LOTV_LOC_ID_OFFSET + 604, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: East Power Cell", SC2LOTV_LOC_ID_OFFSET + 605, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: South Power Cell", SC2LOTV_LOC_ID_OFFSET + 606, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Southeast Power Cell", SC2LOTV_LOC_ID_OFFSET + 607, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Victory", SC2LOTV_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Mid EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Southeast EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: North EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Mid Stabilizer", SC2LOTV_LOC_ID_OFFSET + 704, LocationType.EXTRA), - LocationData("Sky Shield", "Sky Shield: Southwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 705, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Northwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 706, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Northeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 707, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Southeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 708, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: West Raynor Base", SC2LOTV_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: East Raynor Base", SC2LOTV_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Brothers in Arms", "Brothers in Arms: Victory", SC2LOTV_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.brothers_in_arms_requirement(state)), - LocationData("Brothers in Arms", "Brothers in Arms: Mid Science Facility", SC2LOTV_LOC_ID_OFFSET + 801, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) or logic.take_over_ai_allies), - LocationData("Brothers in Arms", "Brothers in Arms: North Science Facility", SC2LOTV_LOC_ID_OFFSET + 802, LocationType.VANILLA, - lambda state: logic.brothers_in_arms_requirement(state) - or logic.take_over_ai_allies - and logic.advanced_tactics - and ( - logic.terran_common_unit(state) - or logic.protoss_common_unit(state) - ) - ), - LocationData("Brothers in Arms", "Brothers in Arms: South Science Facility", SC2LOTV_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.brothers_in_arms_requirement(state)), - LocationData("Amon's Reach", "Amon's Reach: Victory", SC2LOTV_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: Close Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 901, LocationType.VANILLA), - LocationData("Amon's Reach", "Amon's Reach: North Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: East Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 903, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: West Launch Bay", SC2LOTV_LOC_ID_OFFSET + 904, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: South Launch Bay", SC2LOTV_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: Northwest Launch Bay", SC2LOTV_LOC_ID_OFFSET + 906, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: East Launch Bay", SC2LOTV_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Last Stand", "Last Stand: Victory", SC2LOTV_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: West Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1001, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: North Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: East Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1003, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: 1 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: 1.5 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1005, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state) and ( - state.has_all({ItemNames.KHAYDARIN_MONOLITH, ItemNames.PHOTON_CANNON, ItemNames.SHIELD_BATTERY}, player) - or state.has_any({ItemNames.SOA_SOLAR_LANCE, ItemNames.SOA_DEPLOY_FENIX}, player) - )), - LocationData("Forbidden Weapon", "Forbidden Weapon: Victory", SC2LOTV_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: South Solarite", SC2LOTV_LOC_ID_OFFSET + 1101, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: North Solarite", SC2LOTV_LOC_ID_OFFSET + 1102, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: Northwest Solarite", SC2LOTV_LOC_ID_OFFSET + 1103, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Victory", SC2LOTV_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Mid Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1201, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: West Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1202, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: South Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1203, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: East Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1204, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: North Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1205, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Titanic Warp Prism", SC2LOTV_LOC_ID_OFFSET + 1206, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Victory", SC2LOTV_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: First Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1301, LocationType.EXTRA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Second Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1302, LocationType.EXTRA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: First Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1303, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Second Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1304, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Third Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1305, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Victory", SC2LOTV_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Artanis", SC2LOTV_LOC_ID_OFFSET + 1401, LocationType.EXTRA), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1402, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1403, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1405, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: South Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1406, LocationType.VANILLA), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Mid Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1407, LocationType.VANILLA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: North Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1408, LocationType.VANILLA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Victory", SC2LOTV_LOC_ID_OFFSET + 1500, LocationType.VICTORY, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Zerg Cleared", SC2LOTV_LOC_ID_OFFSET + 1501, LocationType.EXTRA), - LocationData("Unsealing the Past", "Unsealing the Past: First Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1502, LocationType.EXTRA, - lambda state: logic.advanced_tactics \ - or logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Second Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1503, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Third Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1504, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Fourth Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1505, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: South Power Core", SC2LOTV_LOC_ID_OFFSET + 1506, LocationType.VANILLA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: East Power Core", SC2LOTV_LOC_ID_OFFSET + 1507, LocationType.VANILLA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Purification", "Purification: Victory", SC2LOTV_LOC_ID_OFFSET + 1600, LocationType.VICTORY, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1601, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: Northeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1602, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: Southeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1603, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1604, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1605, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1606, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1607, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: Mid Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1608, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1609, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1610, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1611, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: South Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1612, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: Purifier Warden", SC2LOTV_LOC_ID_OFFSET + 1613, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Victory", SC2LOTV_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: First Terrazine Fog", SC2LOTV_LOC_ID_OFFSET + 1701, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Southwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1702, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: West Guardian", SC2LOTV_LOC_ID_OFFSET + 1703, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Northwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1704, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Northeast Guardian", SC2LOTV_LOC_ID_OFFSET + 1705, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: North Mothership", SC2LOTV_LOC_ID_OFFSET + 1706, LocationType.VANILLA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: South Mothership", SC2LOTV_LOC_ID_OFFSET + 1707, LocationType.VANILLA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Rak'Shir", "Rak'Shir: Victory", SC2LOTV_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: North Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1801, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: Southwest Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: East Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1803, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Templar's Charge", "Templar's Charge: Victory", SC2LOTV_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Northwest Power Core", SC2LOTV_LOC_ID_OFFSET + 1901, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Northeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1902, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Southeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1903, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: West Hybrid Stasis Chamber", SC2LOTV_LOC_ID_OFFSET + 1904, LocationType.VANILLA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Southeast Hybrid Stasis Chamber", SC2LOTV_LOC_ID_OFFSET + 1905, LocationType.VANILLA, - lambda state: logic.protoss_fleet(state)), - LocationData("Templar's Return", "Templar's Return: Victory", SC2LOTV_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Citadel: First Gate", SC2LOTV_LOC_ID_OFFSET + 2001, LocationType.EXTRA), - LocationData("Templar's Return", "Templar's Return: Citadel: Second Gate", SC2LOTV_LOC_ID_OFFSET + 2002, LocationType.EXTRA), - LocationData("Templar's Return", "Templar's Return: Citadel: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2003, LocationType.VANILLA), - LocationData("Templar's Return", "Templar's Return: Temple Grounds: Gather Army", SC2LOTV_LOC_ID_OFFSET + 2004, LocationType.VANILLA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Temple Grounds: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2005, LocationType.VANILLA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Caverns: Purifier", SC2LOTV_LOC_ID_OFFSET + 2006, LocationType.EXTRA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Caverns: Dark Templar", SC2LOTV_LOC_ID_OFFSET + 2007, LocationType.EXTRA, - lambda state: logic.templars_return_requirement(state)), - LocationData("The Host", "The Host: Victory", SC2LOTV_LOC_ID_OFFSET + 2100, LocationType.VICTORY, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Southeast Void Shard", SC2LOTV_LOC_ID_OFFSET + 2101, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: South Void Shard", SC2LOTV_LOC_ID_OFFSET + 2102, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Southwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2103, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: North Void Shard", SC2LOTV_LOC_ID_OFFSET + 2104, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Northwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2105, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Nerazim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2106, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Tal'darim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2107, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Purifier Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2108, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("Salvation", "Salvation: Victory", SC2LOTV_LOC_ID_OFFSET + 2200, LocationType.VICTORY, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Fabrication Matrix", SC2LOTV_LOC_ID_OFFSET + 2201, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Assault Cluster", SC2LOTV_LOC_ID_OFFSET + 2202, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Hull Breach", SC2LOTV_LOC_ID_OFFSET + 2203, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Core Critical", SC2LOTV_LOC_ID_OFFSET + 2204, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - - # Epilogue - LocationData("Into the Void", "Into the Void: Victory", SC2LOTV_LOC_ID_OFFSET + 2300, LocationType.VICTORY, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Corruption Source", SC2LOTV_LOC_ID_OFFSET + 2301, LocationType.EXTRA), - LocationData("Into the Void", "Into the Void: Southwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2302, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Northwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2303, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Southeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2304, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Northeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2305, LocationType.VANILLA), - LocationData("The Essence of Eternity", "The Essence of Eternity: Victory", SC2LOTV_LOC_ID_OFFSET + 2400, LocationType.VICTORY, - lambda state: logic.essence_of_eternity_requirement(state)), - LocationData("The Essence of Eternity", "The Essence of Eternity: Void Trashers", SC2LOTV_LOC_ID_OFFSET + 2401, LocationType.EXTRA), - LocationData("Amon's Fall", "Amon's Fall: Victory", SC2LOTV_LOC_ID_OFFSET + 2500, LocationType.VICTORY, - lambda state: logic.amons_fall_requirement(state)), - - # Nova Covert Ops - LocationData("The Escape", "The Escape: Victory", SC2NCO_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Rifle", SC2NCO_LOC_ID_OFFSET + 101, LocationType.VANILLA, - lambda state: logic.the_escape_first_stage_requirement(state)), - LocationData("The Escape", "The Escape: Grenades", SC2NCO_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: logic.the_escape_first_stage_requirement(state)), - LocationData("The Escape", "The Escape: Agent Delta", SC2NCO_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Agent Pierce", SC2NCO_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Agent Stone", SC2NCO_LOC_ID_OFFSET + 105, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("Sudden Strike", "Sudden Strike: Victory", SC2NCO_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.sudden_strike_requirement(state)), - LocationData("Sudden Strike", "Sudden Strike: Research Center", SC2NCO_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.sudden_strike_can_reach_objectives(state)), - LocationData("Sudden Strike", "Sudden Strike: Weaponry Labs", SC2NCO_LOC_ID_OFFSET + 202, LocationType.VANILLA, - lambda state: logic.sudden_strike_can_reach_objectives(state)), - LocationData("Sudden Strike", "Sudden Strike: Brutalisk", SC2NCO_LOC_ID_OFFSET + 203, LocationType.EXTRA, - lambda state: logic.sudden_strike_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Victory", SC2NCO_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.enemy_intelligence_third_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: West Garrison", SC2NCO_LOC_ID_OFFSET + 301, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Close Garrison", SC2NCO_LOC_ID_OFFSET + 302, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Northeast Garrison", SC2NCO_LOC_ID_OFFSET + 303, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Southeast Garrison", SC2NCO_LOC_ID_OFFSET + 304, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state) - and logic.enemy_intelligence_cliff_garrison(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: South Garrison", SC2NCO_LOC_ID_OFFSET + 305, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: All Garrisons", SC2NCO_LOC_ID_OFFSET + 306, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state) - and logic.enemy_intelligence_cliff_garrison(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Forces Rescued", SC2NCO_LOC_ID_OFFSET + 307, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Communications Hub", SC2NCO_LOC_ID_OFFSET + 308, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_second_stage_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: Victory", SC2NCO_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: West Hatchery", SC2NCO_LOC_ID_OFFSET + 401, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: North Hatchery", SC2NCO_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 403, LocationType.VANILLA), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Northwest Hatchery", SC2NCO_LOC_ID_OFFSET + 404, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Southwest Hatchery", SC2NCO_LOC_ID_OFFSET + 405, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 406, LocationType.VANILLA), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Shield Projector", SC2NCO_LOC_ID_OFFSET + 407, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: East Shield Projector", SC2NCO_LOC_ID_OFFSET + 408, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Shield Projector", SC2NCO_LOC_ID_OFFSET + 409, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: West Shield Projector", SC2NCO_LOC_ID_OFFSET + 410, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: Fleet Beacon", SC2NCO_LOC_ID_OFFSET + 411, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Victory", SC2NCO_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 1 Terrazine Node Collected", SC2NCO_LOC_ID_OFFSET + 501, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 2 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 502, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 3 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 503, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 4 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 5 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: HERC Outpost", SC2NCO_LOC_ID_OFFSET + 506, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Umojan Mine", SC2NCO_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Blightbringer", SC2NCO_LOC_ID_OFFSET + 508, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state) - and logic.nova_ranged_weapon(state) - and state.has_any( - {ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PULSE_GRENADES, ItemNames.NOVA_STIM_INFUSION, - ItemNames.NOVA_HOLO_DECOY}, player)), - LocationData("Night Terrors", "Night Terrors: Science Facility", SC2NCO_LOC_ID_OFFSET + 509, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Eradicators", SC2NCO_LOC_ID_OFFSET + 510, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state) - and logic.nova_any_weapon(state)), - LocationData("Flashpoint", "Flashpoint: Victory", SC2NCO_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Close North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 601, LocationType.EXTRA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - or logic.terran_common_unit(state)), - LocationData("Flashpoint", "Flashpoint: Close East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 602, LocationType.EXTRA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - or logic.terran_common_unit(state)), - LocationData("Flashpoint", "Flashpoint: Far North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 603, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Far East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 604, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Experimental Weapon", SC2NCO_LOC_ID_OFFSET + 605, LocationType.VANILLA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Northwest Subway Entrance", SC2NCO_LOC_ID_OFFSET + 606, LocationType.VANILLA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Southeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 607, LocationType.VANILLA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Northeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 608, LocationType.VANILLA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Expansion Hatchery", SC2NCO_LOC_ID_OFFSET + 609, LocationType.EXTRA, - lambda state: state.has(ItemNames.LIBERATOR_RAID_ARTILLERY, player) and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Baneling Spawns", SC2NCO_LOC_ID_OFFSET + 610, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Mutalisk Spawns", SC2NCO_LOC_ID_OFFSET + 611, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Nydus Worm Spawns", SC2NCO_LOC_ID_OFFSET + 612, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Lurker Spawns", SC2NCO_LOC_ID_OFFSET + 613, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Brood Lord Spawns", SC2NCO_LOC_ID_OFFSET + 614, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Ultralisk Spawns", SC2NCO_LOC_ID_OFFSET + 615, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Victory", SC2NCO_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.enemy_shadow_victory(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Domination Visor", SC2NCO_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.enemy_shadow_domination(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Resupply Crate", SC2NCO_LOC_ID_OFFSET + 702, LocationType.EXTRA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Facility Access", SC2NCO_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Northwest Door Lock", SC2NCO_LOC_ID_OFFSET + 704, LocationType.VANILLA, - lambda state: logic.enemy_shadow_door_controls(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Southeast Door Lock", SC2NCO_LOC_ID_OFFSET + 705, LocationType.VANILLA, - lambda state: logic.enemy_shadow_door_controls(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blazefire Gunblade", SC2NCO_LOC_ID_OFFSET + 706, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state) - and (story_tech_granted - or state.has(ItemNames.NOVA_BLINK, player) - or (adv_tactics and state.has_all({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_JUMP_SUIT_MODULE}, player)) - ) - ), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blink Suit", SC2NCO_LOC_ID_OFFSET + 707, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Advanced Weaponry", SC2NCO_LOC_ID_OFFSET + 708, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Entrance Resupply Crate", SC2NCO_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: West Resupply Crate", SC2NCO_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: North Resupply Crate", SC2NCO_LOC_ID_OFFSET + 711, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: East Resupply Crate", SC2NCO_LOC_ID_OFFSET + 712, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: South Resupply Crate", SC2NCO_LOC_ID_OFFSET + 713, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("Dark Skies", "Dark Skies: Victory", SC2NCO_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: First Squadron of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 801, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Remainder of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 802, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Ji'nara", SC2NCO_LOC_ID_OFFSET + 803, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Science Facility", SC2NCO_LOC_ID_OFFSET + 804, LocationType.VANILLA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("End Game", "End Game: Victory", SC2NCO_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.end_game_requirement(state) and logic.nova_any_weapon(state)), - LocationData("End Game", "End Game: Xanthos", SC2NCO_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.end_game_requirement(state)), - ] - - beat_events = [] - # Filtering out excluded locations - if world is not None: - excluded_location_types = get_location_types(world, LocationInclusion.option_disabled) - plando_locations = get_plando_locations(world) - exclude_locations = get_option_value(world, "exclude_locations") - location_table = [location for location in location_table - if (location.type is LocationType.VICTORY or location.name not in exclude_locations) - and location.type not in excluded_location_types - or location.name in plando_locations] - for i, location_data in enumerate(location_table): - # Removing all item-based logic on No Logic - if logic_level == RequiredTactics.option_no_logic: - location_data = location_data._replace(rule=Location.access_rule) - location_table[i] = location_data - # Generating Beat event locations - if location_data.name.endswith((": Victory", ": Defeat")): - beat_events.append( - location_data._replace(name="Beat " + location_data.name.rsplit(": ", 1)[0], code=None) - ) - return tuple(location_table + beat_events) - -lookup_location_id_to_type = {loc.code: loc.type for loc in get_locations(None) if loc.code is not None} \ No newline at end of file diff --git a/worlds/sc2/MissionTables.py b/worlds/sc2/MissionTables.py deleted file mode 100644 index 08e1f133..00000000 --- a/worlds/sc2/MissionTables.py +++ /dev/null @@ -1,739 +0,0 @@ -from typing import NamedTuple, Dict, List, Set, Union, Literal, Iterable, Callable -from enum import IntEnum, Enum - - -class SC2Race(IntEnum): - ANY = 0 - TERRAN = 1 - ZERG = 2 - PROTOSS = 3 - - -class MissionPools(IntEnum): - STARTER = 0 - EASY = 1 - MEDIUM = 2 - HARD = 3 - VERY_HARD = 4 - FINAL = 5 - - -class SC2CampaignGoalPriority(IntEnum): - """ - Campaign's priority to goal election - """ - NONE = 0 - MINI_CAMPAIGN = 1 # A goal shouldn't be in a mini-campaign if there's at least one 'big' campaign - HARD = 2 # A campaign ending with a hard mission - VERY_HARD = 3 # A campaign ending with a very hard mission - EPILOGUE = 4 # Epilogue shall be always preferred as the goal if present - - -class SC2Campaign(Enum): - - def __new__(cls, *args, **kwargs): - value = len(cls.__members__) + 1 - obj = object.__new__(cls) - obj._value_ = value - return obj - - def __init__(self, campaign_id: int, name: str, goal_priority: SC2CampaignGoalPriority, race: SC2Race): - self.id = campaign_id - self.campaign_name = name - self.goal_priority = goal_priority - self.race = race - - def __lt__(self, other: "SC2Campaign"): - return self.id < other.id - - GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY - WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN - PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS - HOTS = 3, "Heart of the Swarm", SC2CampaignGoalPriority.HARD, SC2Race.ZERG - PROLOGUE = 4, "Whispers of Oblivion (Legacy of the Void: Prologue)", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS - LOTV = 5, "Legacy of the Void", SC2CampaignGoalPriority.VERY_HARD, SC2Race.PROTOSS - EPILOGUE = 6, "Into the Void (Legacy of the Void: Epilogue)", SC2CampaignGoalPriority.EPILOGUE, SC2Race.ANY - NCO = 7, "Nova Covert Ops", SC2CampaignGoalPriority.HARD, SC2Race.TERRAN - - -class SC2Mission(Enum): - - def __new__(cls, *args, **kwargs): - value = len(cls.__members__) + 1 - obj = object.__new__(cls) - obj._value_ = value - return obj - - def __init__(self, mission_id: int, name: str, campaign: SC2Campaign, area: str, race: SC2Race, pool: MissionPools, map_file: str, build: bool = True): - self.id = mission_id - self.mission_name = name - self.campaign = campaign - self.area = area - self.race = race - self.pool = pool - self.map_file = map_file - self.build = build - - # Wings of Liberty - LIBERATION_DAY = 1, "Liberation Day", SC2Campaign.WOL, "Mar Sara", SC2Race.ANY, MissionPools.STARTER, "ap_liberation_day", False - THE_OUTLAWS = 2, "The Outlaws", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_the_outlaws" - ZERO_HOUR = 3, "Zero Hour", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_zero_hour" - EVACUATION = 4, "Evacuation", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_evacuation" - OUTBREAK = 5, "Outbreak", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_outbreak" - SAFE_HAVEN = 6, "Safe Haven", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_safe_haven" - HAVENS_FALL = 7, "Haven's Fall", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_havens_fall" - SMASH_AND_GRAB = 8, "Smash and Grab", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.EASY, "ap_smash_and_grab" - THE_DIG = 9, "The Dig", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_dig" - THE_MOEBIUS_FACTOR = 10, "The Moebius Factor", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_moebius_factor" - SUPERNOVA = 11, "Supernova", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_supernova" - MAW_OF_THE_VOID = 12, "Maw of the Void", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_maw_of_the_void" - DEVILS_PLAYGROUND = 13, "Devil's Playground", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.EASY, "ap_devils_playground" - WELCOME_TO_THE_JUNGLE = 14, "Welcome to the Jungle", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_welcome_to_the_jungle" - BREAKOUT = 15, "Breakout", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_breakout", False - GHOST_OF_A_CHANCE = 16, "Ghost of a Chance", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_ghost_of_a_chance", False - THE_GREAT_TRAIN_ROBBERY = 17, "The Great Train Robbery", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_great_train_robbery" - CUTTHROAT = 18, "Cutthroat", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_cutthroat" - ENGINE_OF_DESTRUCTION = 19, "Engine of Destruction", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.HARD, "ap_engine_of_destruction" - MEDIA_BLITZ = 20, "Media Blitz", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_media_blitz" - PIERCING_OF_THE_SHROUD = 21, "Piercing the Shroud", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.STARTER, "ap_piercing_the_shroud", False - GATES_OF_HELL = 26, "Gates of Hell", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_gates_of_hell" - BELLY_OF_THE_BEAST = 27, "Belly of the Beast", SC2Campaign.WOL, "Char", SC2Race.ANY, MissionPools.STARTER, "ap_belly_of_the_beast", False - SHATTER_THE_SKY = 28, "Shatter the Sky", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_shatter_the_sky" - ALL_IN = 29, "All-In", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_all_in" - - # Prophecy - WHISPERS_OF_DOOM = 22, "Whispers of Doom", SC2Campaign.PROPHECY, "_1", SC2Race.ANY, MissionPools.STARTER, "ap_whispers_of_doom", False - A_SINISTER_TURN = 23, "A Sinister Turn", SC2Campaign.PROPHECY, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_a_sinister_turn" - ECHOES_OF_THE_FUTURE = 24, "Echoes of the Future", SC2Campaign.PROPHECY, "_3", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_echoes_of_the_future" - IN_UTTER_DARKNESS = 25, "In Utter Darkness", SC2Campaign.PROPHECY, "_4", SC2Race.PROTOSS, MissionPools.HARD, "ap_in_utter_darkness" - - # Heart of the Swarm - LAB_RAT = 30, "Lab Rat", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.STARTER, "ap_lab_rat" - BACK_IN_THE_SADDLE = 31, "Back in the Saddle", SC2Campaign.HOTS, "Umoja", SC2Race.ANY, MissionPools.STARTER, "ap_back_in_the_saddle", False - RENDEZVOUS = 32, "Rendezvous", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.EASY, "ap_rendezvous" - HARVEST_OF_SCREAMS = 33, "Harvest of Screams", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_harvest_of_screams" - SHOOT_THE_MESSENGER = 34, "Shoot the Messenger", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_shoot_the_messenger" - ENEMY_WITHIN = 35, "Enemy Within", SC2Campaign.HOTS, "Kaldir", SC2Race.ANY, MissionPools.EASY, "ap_enemy_within", False - DOMINATION = 36, "Domination", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.EASY, "ap_domination" - FIRE_IN_THE_SKY = 37, "Fire in the Sky", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_fire_in_the_sky" - OLD_SOLDIERS = 38, "Old Soldiers", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_old_soldiers" - WAKING_THE_ANCIENT = 39, "Waking the Ancient", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_waking_the_ancient" - THE_CRUCIBLE = 40, "The Crucible", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_crucible" - SUPREME = 41, "Supreme", SC2Campaign.HOTS, "Zerus", SC2Race.ANY, MissionPools.MEDIUM, "ap_supreme", False - INFESTED = 42, "Infested", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_infested" - HAND_OF_DARKNESS = 43, "Hand of Darkness", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_hand_of_darkness" - PHANTOMS_OF_THE_VOID = 44, "Phantoms of the Void", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_phantoms_of_the_void" - WITH_FRIENDS_LIKE_THESE = 45, "With Friends Like These", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.STARTER, "ap_with_friends_like_these", False - CONVICTION = 46, "Conviction", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.MEDIUM, "ap_conviction", False - PLANETFALL = 47, "Planetfall", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_planetfall" - DEATH_FROM_ABOVE = 48, "Death From Above", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_death_from_above" - THE_RECKONING = 49, "The Reckoning", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_the_reckoning" - - # Prologue - DARK_WHISPERS = 50, "Dark Whispers", SC2Campaign.PROLOGUE, "_1", SC2Race.PROTOSS, MissionPools.EASY, "ap_dark_whispers" - GHOSTS_IN_THE_FOG = 51, "Ghosts in the Fog", SC2Campaign.PROLOGUE, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_ghosts_in_the_fog" - EVIL_AWOKEN = 52, "Evil Awoken", SC2Campaign.PROLOGUE, "_3", SC2Race.PROTOSS, MissionPools.STARTER, "ap_evil_awoken", False - - # LotV - FOR_AIUR = 53, "For Aiur!", SC2Campaign.LOTV, "Aiur", SC2Race.ANY, MissionPools.STARTER, "ap_for_aiur", False - THE_GROWING_SHADOW = 54, "The Growing Shadow", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_growing_shadow" - THE_SPEAR_OF_ADUN = 55, "The Spear of Adun", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_spear_of_adun" - SKY_SHIELD = 56, "Sky Shield", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.EASY, "ap_sky_shield" - BROTHERS_IN_ARMS = 57, "Brothers in Arms", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_brothers_in_arms" - AMON_S_REACH = 58, "Amon's Reach", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.EASY, "ap_amon_s_reach" - LAST_STAND = 59, "Last Stand", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.HARD, "ap_last_stand" - FORBIDDEN_WEAPON = 60, "Forbidden Weapon", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_forbidden_weapon" - TEMPLE_OF_UNIFICATION = 61, "Temple of Unification", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_temple_of_unification" - THE_INFINITE_CYCLE = 62, "The Infinite Cycle", SC2Campaign.LOTV, "Ulnar", SC2Race.ANY, MissionPools.HARD, "ap_the_infinite_cycle", False - HARBINGER_OF_OBLIVION = 63, "Harbinger of Oblivion", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_harbinger_of_oblivion" - UNSEALING_THE_PAST = 64, "Unsealing the Past", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_unsealing_the_past" - PURIFICATION = 65, "Purification", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_purification" - STEPS_OF_THE_RITE = 66, "Steps of the Rite", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_steps_of_the_rite" - RAK_SHIR = 67, "Rak'Shir", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_rak_shir" - TEMPLAR_S_CHARGE = 68, "Templar's Charge", SC2Campaign.LOTV, "Moebius", SC2Race.PROTOSS, MissionPools.HARD, "ap_templar_s_charge" - TEMPLAR_S_RETURN = 69, "Templar's Return", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_templar_s_return", False - THE_HOST = 70, "The Host", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.HARD, "ap_the_host", - SALVATION = 71, "Salvation", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_salvation" - - # Epilogue - INTO_THE_VOID = 72, "Into the Void", SC2Campaign.EPILOGUE, "_1", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_into_the_void" - THE_ESSENCE_OF_ETERNITY = 73, "The Essence of Eternity", SC2Campaign.EPILOGUE, "_2", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_essence_of_eternity" - AMON_S_FALL = 74, "Amon's Fall", SC2Campaign.EPILOGUE, "_3", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_amon_s_fall" - - # Nova Covert Ops - THE_ESCAPE = 75, "The Escape", SC2Campaign.NCO, "_1", SC2Race.ANY, MissionPools.MEDIUM, "ap_the_escape", False - SUDDEN_STRIKE = 76, "Sudden Strike", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.EASY, "ap_sudden_strike" - ENEMY_INTELLIGENCE = 77, "Enemy Intelligence", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_enemy_intelligence" - TROUBLE_IN_PARADISE = 78, "Trouble In Paradise", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_trouble_in_paradise" - NIGHT_TERRORS = 79, "Night Terrors", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_night_terrors" - FLASHPOINT = 80, "Flashpoint", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_flashpoint" - IN_THE_ENEMY_S_SHADOW = 81, "In the Enemy's Shadow", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_in_the_enemy_s_shadow", False - DARK_SKIES = 82, "Dark Skies", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.HARD, "ap_dark_skies" - END_GAME = 83, "End Game", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_end_game" - - -class MissionConnection: - campaign: SC2Campaign - connect_to: int # -1 connects to Menu - - def __init__(self, connect_to, campaign = SC2Campaign.GLOBAL): - self.campaign = campaign - self.connect_to = connect_to - - def _asdict(self): - return { - "campaign": self.campaign.id, - "connect_to": self.connect_to - } - - -class MissionInfo(NamedTuple): - mission: SC2Mission - required_world: List[Union[MissionConnection, Dict[Literal["campaign", "connect_to"], int]]] - category: str - number: int = 0 # number of worlds need beaten - completion_critical: bool = False # missions needed to beat game - or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed - ui_vertical_padding: int = 0 - - -class FillMission(NamedTuple): - type: MissionPools - connect_to: List[MissionConnection] - category: str - number: int = 0 # number of worlds need beaten - completion_critical: bool = False # missions needed to beat game - or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed - removal_priority: int = 0 # how many missions missing from the pool required to remove this mission - - - -def vanilla_shuffle_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.WOL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7, removal_priority=1), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Artifact", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Artifact", number=11, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.WOL)], "Artifact", number=14, completion_critical=True, removal_priority=7), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.WOL)], "Artifact", completion_critical=True, removal_priority=6), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Covert", number=4), - FillMission(MissionPools.MEDIUM, [MissionConnection(12, SC2Campaign.WOL)], "Covert"), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=3), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=2), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Rebellion", number=6), - FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(18, SC2Campaign.WOL)], "Rebellion", removal_priority=8), - FillMission(MissionPools.HARD, [MissionConnection(19, SC2Campaign.WOL)], "Rebellion", removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(22, SC2Campaign.WOL), MissionConnection(23, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True) - ], - SC2Campaign.PROPHECY: [ - FillMission(MissionPools.MEDIUM, [MissionConnection(8, SC2Campaign.WOL)], "_1"), - FillMission(MissionPools.HARD, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2", removal_priority=2), - FillMission(MissionPools.HARD, [MissionConnection(1, SC2Campaign.PROPHECY)], "_3", removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(2, SC2Campaign.PROPHECY)], "_4"), - ], - SC2Campaign.HOTS: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.HOTS)], "Umoja", completion_critical=True, removal_priority=1), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Kaldir", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Kaldir", completion_critical=True, removal_priority=2), - FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.HOTS)], "Kaldir", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Char", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(6, SC2Campaign.HOTS)], "Char", completion_critical=True, removal_priority=3), - FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.HOTS)], "Char", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS)], "Zerus", completion_critical=True, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(9, SC2Campaign.HOTS)], "Zerus", completion_critical=True, removal_priority=4), - FillMission(MissionPools.MEDIUM, [MissionConnection(10, SC2Campaign.HOTS)], "Zerus", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(15, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(14, SC2Campaign.HOTS), MissionConnection(16, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(18, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - ], - SC2Campaign.PROLOGUE: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2", removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.PROLOGUE)], "_3") - ], - SC2Campaign.LOTV: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True, removal_priority=3), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Korhal", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.LOTV)], "Korhal", completion_critical=True, removal_priority=7), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Shakuras", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV)], "Shakuras", completion_critical=True, removal_priority=6), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.LOTV)], "Ulnar", completion_critical=True, removal_priority=1), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.LOTV)], "Purifier", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV)], "Moebius", completion_critical=True, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True, removal_priority=2), - FillMission(MissionPools.FINAL, [MissionConnection(17, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - ], - SC2Campaign.EPILOGUE: [ - FillMission(MissionPools.VERY_HARD, [MissionConnection(24, SC2Campaign.WOL), MissionConnection(19, SC2Campaign.HOTS), MissionConnection(18, SC2Campaign.LOTV)], "_1", completion_critical=True), - FillMission(MissionPools.VERY_HARD, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True, removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.EPILOGUE)], "_3", completion_critical=True), - ], - SC2Campaign.NCO: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=6), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=7), - FillMission(MissionPools.HARD, [MissionConnection(3, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=3), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=2), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(7, SC2Campaign.NCO)], "_3", completion_critical=True), - ] - } - - -def mini_campaign_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.WOL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Artifact", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Artifact", number=4, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Covert", number=2), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.WOL)], "Covert"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Rebellion", number=3), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(10, SC2Campaign.WOL), MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True) - ], - SC2Campaign.PROPHECY: [ - FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.WOL)], "_1"), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2"), - ], - SC2Campaign.HOTS: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Kaldir"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.HOTS)], "Kaldir"), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Char"), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Char"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.HOTS)], "Zerus", number=3), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS)], "Zerus"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Skygeirr Station", number=5), - FillMission(MissionPools.HARD, [MissionConnection(7, SC2Campaign.HOTS)], "Skygeirr Station"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Dominion Space", number=5), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.HOTS)], "Dominion Space"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Korhal", completion_critical=True, number=8), - FillMission(MissionPools.FINAL, [MissionConnection(11, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - ], - SC2Campaign.PROLOGUE: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2") - ], - SC2Campaign.LOTV: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur",completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Korhal", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.LOTV)], "Shakuras", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV), MissionConnection(3, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(8, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - ], - SC2Campaign.EPILOGUE: [ - FillMission(MissionPools.VERY_HARD, [MissionConnection(12, SC2Campaign.WOL), MissionConnection(12, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.LOTV)], "_1", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True), - ], - SC2Campaign.NCO: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_2", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_3", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(3, SC2Campaign.NCO)], "_3", completion_critical=True), - ] - } - - -def gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1)], "III", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2)], "IV", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3)], "V", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4)], "VI", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(5)], "Final", completion_critical=True) - ] - } - - -def mini_gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1)], "III", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(2)], "Final", completion_critical=True) - ] - } - - -def grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(6), MissionConnection( 3)], "_1", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(7)], "_1", or_requirements=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(4)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(5), MissionConnection(10), MissionConnection(7)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(3), MissionConnection(6), MissionConnection(11)], "_2", or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(4), MissionConnection(9), MissionConnection(12)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(5), MissionConnection(8), MissionConnection(10), MissionConnection(13)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(6), MissionConnection(9), MissionConnection(11), MissionConnection(14)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(7), MissionConnection(10)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(8), MissionConnection(13)], "_4", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(9), MissionConnection(12), MissionConnection(14)], "_4", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(10), MissionConnection(13)], "_4", or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(11), MissionConnection(14)], "_4", or_requirements=True) - ] - } - -def mini_grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(5)], "_1", or_requirements=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(3)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(4)], "_2", or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3), MissionConnection(7)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(4), MissionConnection(6)], "_3", or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(5), MissionConnection(7)], "_3", or_requirements=True) - ] - } - -def tiny_grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.FINAL, [MissionConnection(1), MissionConnection(2)], "_2", or_requirements=True), - ] - } - -def blitz_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I"), - FillMission(MissionPools.EASY, [MissionConnection(-1)], "I"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True) - ] - } - - -mission_orders: List[Callable[[], Dict[SC2Campaign, List[FillMission]]]] = [ - vanilla_shuffle_order, - vanilla_shuffle_order, - mini_campaign_order, - grid_order, - mini_grid_order, - blitz_order, - gauntlet_order, - mini_gauntlet_order, - tiny_grid_order -] - - -vanilla_mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = { - SC2Campaign.WOL: { - SC2Mission.LIBERATION_DAY.mission_name: MissionInfo(SC2Mission.LIBERATION_DAY, [], SC2Mission.LIBERATION_DAY.area, completion_critical=True), - SC2Mission.THE_OUTLAWS.mission_name: MissionInfo(SC2Mission.THE_OUTLAWS, [MissionConnection(1, SC2Campaign.WOL)], SC2Mission.THE_OUTLAWS.area, completion_critical=True), - SC2Mission.ZERO_HOUR.mission_name: MissionInfo(SC2Mission.ZERO_HOUR, [MissionConnection(2, SC2Campaign.WOL)], SC2Mission.ZERO_HOUR.area, completion_critical=True), - SC2Mission.EVACUATION.mission_name: MissionInfo(SC2Mission.EVACUATION, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.EVACUATION.area), - SC2Mission.OUTBREAK.mission_name: MissionInfo(SC2Mission.OUTBREAK, [MissionConnection(4, SC2Campaign.WOL)], SC2Mission.OUTBREAK.area), - SC2Mission.SAFE_HAVEN.mission_name: MissionInfo(SC2Mission.SAFE_HAVEN, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.SAFE_HAVEN.area, number=7), - SC2Mission.HAVENS_FALL.mission_name: MissionInfo(SC2Mission.HAVENS_FALL, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.HAVENS_FALL.area, number=7), - SC2Mission.SMASH_AND_GRAB.mission_name: MissionInfo(SC2Mission.SMASH_AND_GRAB, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.SMASH_AND_GRAB.area, completion_critical=True), - SC2Mission.THE_DIG.mission_name: MissionInfo(SC2Mission.THE_DIG, [MissionConnection(8, SC2Campaign.WOL)], SC2Mission.THE_DIG.area, number=8, completion_critical=True), - SC2Mission.THE_MOEBIUS_FACTOR.mission_name: MissionInfo(SC2Mission.THE_MOEBIUS_FACTOR, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.THE_MOEBIUS_FACTOR.area, number=11, completion_critical=True), - SC2Mission.SUPERNOVA.mission_name: MissionInfo(SC2Mission.SUPERNOVA, [MissionConnection(10, SC2Campaign.WOL)], SC2Mission.SUPERNOVA.area, number=14, completion_critical=True), - SC2Mission.MAW_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.MAW_OF_THE_VOID, [MissionConnection(11, SC2Campaign.WOL)], SC2Mission.MAW_OF_THE_VOID.area, completion_critical=True), - SC2Mission.DEVILS_PLAYGROUND.mission_name: MissionInfo(SC2Mission.DEVILS_PLAYGROUND, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.DEVILS_PLAYGROUND.area, number=4), - SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name: MissionInfo(SC2Mission.WELCOME_TO_THE_JUNGLE, [MissionConnection(13, SC2Campaign.WOL)], SC2Mission.WELCOME_TO_THE_JUNGLE.area), - SC2Mission.BREAKOUT.mission_name: MissionInfo(SC2Mission.BREAKOUT, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.BREAKOUT.area, number=8), - SC2Mission.GHOST_OF_A_CHANCE.mission_name: MissionInfo(SC2Mission.GHOST_OF_A_CHANCE, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.GHOST_OF_A_CHANCE.area, number=8), - SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name: MissionInfo(SC2Mission.THE_GREAT_TRAIN_ROBBERY, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area, number=6), - SC2Mission.CUTTHROAT.mission_name: MissionInfo(SC2Mission.CUTTHROAT, [MissionConnection(17, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area), - SC2Mission.ENGINE_OF_DESTRUCTION.mission_name: MissionInfo(SC2Mission.ENGINE_OF_DESTRUCTION, [MissionConnection(18, SC2Campaign.WOL)], SC2Mission.ENGINE_OF_DESTRUCTION.area), - SC2Mission.MEDIA_BLITZ.mission_name: MissionInfo(SC2Mission.MEDIA_BLITZ, [MissionConnection(19, SC2Campaign.WOL)], SC2Mission.MEDIA_BLITZ.area), - SC2Mission.PIERCING_OF_THE_SHROUD.mission_name: MissionInfo(SC2Mission.PIERCING_OF_THE_SHROUD, [MissionConnection(20, SC2Campaign.WOL)], SC2Mission.PIERCING_OF_THE_SHROUD.area), - SC2Mission.GATES_OF_HELL.mission_name: MissionInfo(SC2Mission.GATES_OF_HELL, [MissionConnection(12, SC2Campaign.WOL)], SC2Mission.GATES_OF_HELL.area, completion_critical=True), - SC2Mission.BELLY_OF_THE_BEAST.mission_name: MissionInfo(SC2Mission.BELLY_OF_THE_BEAST, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.BELLY_OF_THE_BEAST.area, completion_critical=True), - SC2Mission.SHATTER_THE_SKY.mission_name: MissionInfo(SC2Mission.SHATTER_THE_SKY, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.SHATTER_THE_SKY.area, completion_critical=True), - SC2Mission.ALL_IN.mission_name: MissionInfo(SC2Mission.ALL_IN, [MissionConnection(23, SC2Campaign.WOL), MissionConnection(24, SC2Campaign.WOL)], SC2Mission.ALL_IN.area, or_requirements=True, completion_critical=True) - }, - SC2Campaign.PROPHECY: { - SC2Mission.WHISPERS_OF_DOOM.mission_name: MissionInfo(SC2Mission.WHISPERS_OF_DOOM, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.WHISPERS_OF_DOOM.area), - SC2Mission.A_SINISTER_TURN.mission_name: MissionInfo(SC2Mission.A_SINISTER_TURN, [MissionConnection(1, SC2Campaign.PROPHECY)], SC2Mission.A_SINISTER_TURN.area), - SC2Mission.ECHOES_OF_THE_FUTURE.mission_name: MissionInfo(SC2Mission.ECHOES_OF_THE_FUTURE, [MissionConnection(2, SC2Campaign.PROPHECY)], SC2Mission.ECHOES_OF_THE_FUTURE.area), - SC2Mission.IN_UTTER_DARKNESS.mission_name: MissionInfo(SC2Mission.IN_UTTER_DARKNESS, [MissionConnection(3, SC2Campaign.PROPHECY)], SC2Mission.IN_UTTER_DARKNESS.area) - }, - SC2Campaign.HOTS: { - SC2Mission.LAB_RAT.mission_name: MissionInfo(SC2Mission.LAB_RAT, [], SC2Mission.LAB_RAT.area, completion_critical=True), - SC2Mission.BACK_IN_THE_SADDLE.mission_name: MissionInfo(SC2Mission.BACK_IN_THE_SADDLE, [MissionConnection(1, SC2Campaign.HOTS)], SC2Mission.BACK_IN_THE_SADDLE.area, completion_critical=True), - SC2Mission.RENDEZVOUS.mission_name: MissionInfo(SC2Mission.RENDEZVOUS, [MissionConnection(2, SC2Campaign.HOTS)], SC2Mission.RENDEZVOUS.area, completion_critical=True), - SC2Mission.HARVEST_OF_SCREAMS.mission_name: MissionInfo(SC2Mission.HARVEST_OF_SCREAMS, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.HARVEST_OF_SCREAMS.area), - SC2Mission.SHOOT_THE_MESSENGER.mission_name: MissionInfo(SC2Mission.SHOOT_THE_MESSENGER, [MissionConnection(4, SC2Campaign.HOTS)], SC2Mission.SHOOT_THE_MESSENGER.area), - SC2Mission.ENEMY_WITHIN.mission_name: MissionInfo(SC2Mission.ENEMY_WITHIN, [MissionConnection(5, SC2Campaign.HOTS)], SC2Mission.ENEMY_WITHIN.area), - SC2Mission.DOMINATION.mission_name: MissionInfo(SC2Mission.DOMINATION, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.DOMINATION.area), - SC2Mission.FIRE_IN_THE_SKY.mission_name: MissionInfo(SC2Mission.FIRE_IN_THE_SKY, [MissionConnection(7, SC2Campaign.HOTS)], SC2Mission.FIRE_IN_THE_SKY.area), - SC2Mission.OLD_SOLDIERS.mission_name: MissionInfo(SC2Mission.OLD_SOLDIERS, [MissionConnection(8, SC2Campaign.HOTS)], SC2Mission.OLD_SOLDIERS.area), - SC2Mission.WAKING_THE_ANCIENT.mission_name: MissionInfo(SC2Mission.WAKING_THE_ANCIENT, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS)], SC2Mission.WAKING_THE_ANCIENT.area, completion_critical=True, or_requirements=True), - SC2Mission.THE_CRUCIBLE.mission_name: MissionInfo(SC2Mission.THE_CRUCIBLE, [MissionConnection(10, SC2Campaign.HOTS)], SC2Mission.THE_CRUCIBLE.area, completion_critical=True), - SC2Mission.SUPREME.mission_name: MissionInfo(SC2Mission.SUPREME, [MissionConnection(11, SC2Campaign.HOTS)], SC2Mission.SUPREME.area, completion_critical=True), - SC2Mission.INFESTED.mission_name: MissionInfo(SC2Mission.INFESTED, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.INFESTED.area), - SC2Mission.HAND_OF_DARKNESS.mission_name: MissionInfo(SC2Mission.HAND_OF_DARKNESS, [MissionConnection(13, SC2Campaign.HOTS)], SC2Mission.HAND_OF_DARKNESS.area), - SC2Mission.PHANTOMS_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.PHANTOMS_OF_THE_VOID, [MissionConnection(14, SC2Campaign.HOTS)], SC2Mission.PHANTOMS_OF_THE_VOID.area), - SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name: MissionInfo(SC2Mission.WITH_FRIENDS_LIKE_THESE, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.WITH_FRIENDS_LIKE_THESE.area), - SC2Mission.CONVICTION.mission_name: MissionInfo(SC2Mission.CONVICTION, [MissionConnection(16, SC2Campaign.HOTS)], SC2Mission.CONVICTION.area), - SC2Mission.PLANETFALL.mission_name: MissionInfo(SC2Mission.PLANETFALL, [MissionConnection(15, SC2Campaign.HOTS), MissionConnection(17, SC2Campaign.HOTS)], SC2Mission.PLANETFALL.area, completion_critical=True), - SC2Mission.DEATH_FROM_ABOVE.mission_name: MissionInfo(SC2Mission.DEATH_FROM_ABOVE, [MissionConnection(18, SC2Campaign.HOTS)], SC2Mission.DEATH_FROM_ABOVE.area, completion_critical=True), - SC2Mission.THE_RECKONING.mission_name: MissionInfo(SC2Mission.THE_RECKONING, [MissionConnection(19, SC2Campaign.HOTS)], SC2Mission.THE_RECKONING.area, completion_critical=True), - }, - SC2Campaign.PROLOGUE: { - SC2Mission.DARK_WHISPERS.mission_name: MissionInfo(SC2Mission.DARK_WHISPERS, [], SC2Mission.DARK_WHISPERS.area), - SC2Mission.GHOSTS_IN_THE_FOG.mission_name: MissionInfo(SC2Mission.GHOSTS_IN_THE_FOG, [MissionConnection(1, SC2Campaign.PROLOGUE)], SC2Mission.GHOSTS_IN_THE_FOG.area), - SC2Mission.EVIL_AWOKEN.mission_name: MissionInfo(SC2Mission.EVIL_AWOKEN, [MissionConnection(2, SC2Campaign.PROLOGUE)], SC2Mission.EVIL_AWOKEN.area) - }, - SC2Campaign.LOTV: { - SC2Mission.FOR_AIUR.mission_name: MissionInfo(SC2Mission.FOR_AIUR, [], SC2Mission.FOR_AIUR.area, completion_critical=True), - SC2Mission.THE_GROWING_SHADOW.mission_name: MissionInfo(SC2Mission.THE_GROWING_SHADOW, [MissionConnection(1, SC2Campaign.LOTV)], SC2Mission.THE_GROWING_SHADOW.area, completion_critical=True), - SC2Mission.THE_SPEAR_OF_ADUN.mission_name: MissionInfo(SC2Mission.THE_SPEAR_OF_ADUN, [MissionConnection(2, SC2Campaign.LOTV)], SC2Mission.THE_SPEAR_OF_ADUN.area, completion_critical=True), - SC2Mission.SKY_SHIELD.mission_name: MissionInfo(SC2Mission.SKY_SHIELD, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.SKY_SHIELD.area, completion_critical=True), - SC2Mission.BROTHERS_IN_ARMS.mission_name: MissionInfo(SC2Mission.BROTHERS_IN_ARMS, [MissionConnection(4, SC2Campaign.LOTV)], SC2Mission.BROTHERS_IN_ARMS.area, completion_critical=True), - SC2Mission.AMON_S_REACH.mission_name: MissionInfo(SC2Mission.AMON_S_REACH, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.AMON_S_REACH.area, completion_critical=True), - SC2Mission.LAST_STAND.mission_name: MissionInfo(SC2Mission.LAST_STAND, [MissionConnection(6, SC2Campaign.LOTV)], SC2Mission.LAST_STAND.area, completion_critical=True), - SC2Mission.FORBIDDEN_WEAPON.mission_name: MissionInfo(SC2Mission.FORBIDDEN_WEAPON, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], SC2Mission.FORBIDDEN_WEAPON.area, completion_critical=True, or_requirements=True), - SC2Mission.TEMPLE_OF_UNIFICATION.mission_name: MissionInfo(SC2Mission.TEMPLE_OF_UNIFICATION, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV), MissionConnection(8, SC2Campaign.LOTV)], SC2Mission.TEMPLE_OF_UNIFICATION.area, completion_critical=True), - SC2Mission.THE_INFINITE_CYCLE.mission_name: MissionInfo(SC2Mission.THE_INFINITE_CYCLE, [MissionConnection(9, SC2Campaign.LOTV)], SC2Mission.THE_INFINITE_CYCLE.area, completion_critical=True), - SC2Mission.HARBINGER_OF_OBLIVION.mission_name: MissionInfo(SC2Mission.HARBINGER_OF_OBLIVION, [MissionConnection(10, SC2Campaign.LOTV)], SC2Mission.HARBINGER_OF_OBLIVION.area, completion_critical=True), - SC2Mission.UNSEALING_THE_PAST.mission_name: MissionInfo(SC2Mission.UNSEALING_THE_PAST, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.UNSEALING_THE_PAST.area, completion_critical=True), - SC2Mission.PURIFICATION.mission_name: MissionInfo(SC2Mission.PURIFICATION, [MissionConnection(12, SC2Campaign.LOTV)], SC2Mission.PURIFICATION.area, completion_critical=True), - SC2Mission.STEPS_OF_THE_RITE.mission_name: MissionInfo(SC2Mission.STEPS_OF_THE_RITE, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.STEPS_OF_THE_RITE.area, completion_critical=True), - SC2Mission.RAK_SHIR.mission_name: MissionInfo(SC2Mission.RAK_SHIR, [MissionConnection(14, SC2Campaign.LOTV)], SC2Mission.RAK_SHIR.area, completion_critical=True), - SC2Mission.TEMPLAR_S_CHARGE.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_CHARGE, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_CHARGE.area, completion_critical=True, or_requirements=True), - SC2Mission.TEMPLAR_S_RETURN.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_RETURN, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV), MissionConnection(16, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_RETURN.area, completion_critical=True), - SC2Mission.THE_HOST.mission_name: MissionInfo(SC2Mission.THE_HOST, [MissionConnection(17, SC2Campaign.LOTV)], SC2Mission.THE_HOST.area, completion_critical=True), - SC2Mission.SALVATION.mission_name: MissionInfo(SC2Mission.SALVATION, [MissionConnection(18, SC2Campaign.LOTV)], SC2Mission.SALVATION.area, completion_critical=True), - }, - SC2Campaign.EPILOGUE: { - SC2Mission.INTO_THE_VOID.mission_name: MissionInfo(SC2Mission.INTO_THE_VOID, [MissionConnection(25, SC2Campaign.WOL), MissionConnection(20, SC2Campaign.HOTS), MissionConnection(19, SC2Campaign.LOTV)], SC2Mission.INTO_THE_VOID.area, completion_critical=True), - SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name: MissionInfo(SC2Mission.THE_ESSENCE_OF_ETERNITY, [MissionConnection(1, SC2Campaign.EPILOGUE)], SC2Mission.THE_ESSENCE_OF_ETERNITY.area, completion_critical=True), - SC2Mission.AMON_S_FALL.mission_name: MissionInfo(SC2Mission.AMON_S_FALL, [MissionConnection(2, SC2Campaign.EPILOGUE)], SC2Mission.AMON_S_FALL.area, completion_critical=True), - }, - SC2Campaign.NCO: { - SC2Mission.THE_ESCAPE.mission_name: MissionInfo(SC2Mission.THE_ESCAPE, [], SC2Mission.THE_ESCAPE.area, completion_critical=True), - SC2Mission.SUDDEN_STRIKE.mission_name: MissionInfo(SC2Mission.SUDDEN_STRIKE, [MissionConnection(1, SC2Campaign.NCO)], SC2Mission.SUDDEN_STRIKE.area, completion_critical=True), - SC2Mission.ENEMY_INTELLIGENCE.mission_name: MissionInfo(SC2Mission.ENEMY_INTELLIGENCE, [MissionConnection(2, SC2Campaign.NCO)], SC2Mission.ENEMY_INTELLIGENCE.area, completion_critical=True), - SC2Mission.TROUBLE_IN_PARADISE.mission_name: MissionInfo(SC2Mission.TROUBLE_IN_PARADISE, [MissionConnection(3, SC2Campaign.NCO)], SC2Mission.TROUBLE_IN_PARADISE.area, completion_critical=True), - SC2Mission.NIGHT_TERRORS.mission_name: MissionInfo(SC2Mission.NIGHT_TERRORS, [MissionConnection(4, SC2Campaign.NCO)], SC2Mission.NIGHT_TERRORS.area, completion_critical=True), - SC2Mission.FLASHPOINT.mission_name: MissionInfo(SC2Mission.FLASHPOINT, [MissionConnection(5, SC2Campaign.NCO)], SC2Mission.FLASHPOINT.area, completion_critical=True), - SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name: MissionInfo(SC2Mission.IN_THE_ENEMY_S_SHADOW, [MissionConnection(6, SC2Campaign.NCO)], SC2Mission.IN_THE_ENEMY_S_SHADOW.area, completion_critical=True), - SC2Mission.DARK_SKIES.mission_name: MissionInfo(SC2Mission.DARK_SKIES, [MissionConnection(7, SC2Campaign.NCO)], SC2Mission.DARK_SKIES.area, completion_critical=True), - SC2Mission.END_GAME.mission_name: MissionInfo(SC2Mission.END_GAME, [MissionConnection(8, SC2Campaign.NCO)], SC2Mission.END_GAME.area, completion_critical=True), - } -} - -lookup_id_to_mission: Dict[int, SC2Mission] = { - mission.id: mission for mission in SC2Mission -} - -lookup_name_to_mission: Dict[str, SC2Mission] = { - mission.mission_name: mission for mission in SC2Mission -} - -lookup_id_to_campaign: Dict[int, SC2Campaign] = { - campaign.id: campaign for campaign in SC2Campaign -} - - -campaign_mission_table: Dict[SC2Campaign, Set[SC2Mission]] = { - campaign: set() for campaign in SC2Campaign -} -for mission in SC2Mission: - campaign_mission_table[mission.campaign].add(mission) - - -def get_campaign_difficulty(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> MissionPools: - """ - - :param campaign: - :param excluded_missions: - :return: Campaign's the most difficult non-excluded mission - """ - excluded_mission_set = set(excluded_missions) - included_missions = campaign_mission_table[campaign].difference(excluded_mission_set) - return max([mission.pool for mission in included_missions]) - - -def get_campaign_goal_priority(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> SC2CampaignGoalPriority: - """ - Gets a modified campaign goal priority. - If all the campaign's goal missions are excluded, it's ineligible to have the goal - If the campaign's very hard missions are excluded, the priority is lowered to hard - :param campaign: - :param excluded_missions: - :return: - """ - if excluded_missions is None: - return campaign.goal_priority - else: - goal_missions = set(get_campaign_potential_goal_missions(campaign)) - excluded_mission_set = set(excluded_missions) - remaining_goals = goal_missions.difference(excluded_mission_set) - if remaining_goals == set(): - # All potential goals are excluded, the campaign can't be a goal - return SC2CampaignGoalPriority.NONE - elif campaign.goal_priority == SC2CampaignGoalPriority.VERY_HARD: - # Check if a very hard campaign doesn't get rid of it's last very hard mission - difficulty = get_campaign_difficulty(campaign, excluded_missions) - if difficulty == MissionPools.VERY_HARD: - return SC2CampaignGoalPriority.VERY_HARD - else: - return SC2CampaignGoalPriority.HARD - else: - return campaign.goal_priority - - -class SC2CampaignGoal(NamedTuple): - mission: SC2Mission - location: str - - -campaign_final_mission_locations: Dict[SC2Campaign, SC2CampaignGoal] = { - SC2Campaign.WOL: SC2CampaignGoal(SC2Mission.ALL_IN, "All-In: Victory"), - SC2Campaign.PROPHECY: SC2CampaignGoal(SC2Mission.IN_UTTER_DARKNESS, "In Utter Darkness: Kills"), - SC2Campaign.HOTS: None, - SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"), - SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"), - SC2Campaign.EPILOGUE: None, - SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, "End Game: Victory"), -} - -campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = { - SC2Campaign.WOL: { - SC2Mission.MAW_OF_THE_VOID: "Maw of the Void: Victory", - SC2Mission.ENGINE_OF_DESTRUCTION: "Engine of Destruction: Victory", - SC2Mission.SUPERNOVA: "Supernova: Victory", - SC2Mission.GATES_OF_HELL: "Gates of Hell: Victory", - SC2Mission.SHATTER_THE_SKY: "Shatter the Sky: Victory" - }, - SC2Campaign.PROPHECY: None, - SC2Campaign.HOTS: { - SC2Mission.THE_RECKONING: "The Reckoning: Victory", - SC2Mission.THE_CRUCIBLE: "The Crucible: Victory", - SC2Mission.HAND_OF_DARKNESS: "Hand of Darkness: Victory", - SC2Mission.PHANTOMS_OF_THE_VOID: "Phantoms of the Void: Victory", - SC2Mission.PLANETFALL: "Planetfall: Victory", - SC2Mission.DEATH_FROM_ABOVE: "Death From Above: Victory" - }, - SC2Campaign.PROLOGUE: { - SC2Mission.GHOSTS_IN_THE_FOG: "Ghosts in the Fog: Victory" - }, - SC2Campaign.LOTV: { - SC2Mission.THE_HOST: "The Host: Victory", - SC2Mission.TEMPLAR_S_CHARGE: "Templar's Charge: Victory" - }, - SC2Campaign.EPILOGUE: { - SC2Mission.AMON_S_FALL: "Amon's Fall: Victory", - SC2Mission.INTO_THE_VOID: "Into the Void: Victory", - SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory", - }, - SC2Campaign.NCO: { - SC2Mission.FLASHPOINT: "Flashpoint: Victory", - SC2Mission.DARK_SKIES: "Dark Skies: Victory", - SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory", - SC2Mission.TROUBLE_IN_PARADISE: "Trouble In Paradise: Victory" - } -} - -campaign_race_exceptions: Dict[SC2Mission, SC2Race] = { - SC2Mission.WITH_FRIENDS_LIKE_THESE: SC2Race.TERRAN -} - - -def get_goal_location(mission: SC2Mission) -> Union[str, None]: - """ - - :param mission: - :return: Goal location assigned to the goal mission - """ - campaign = mission.campaign - primary_campaign_goal = campaign_final_mission_locations[campaign] - if primary_campaign_goal is not None: - if primary_campaign_goal.mission == mission: - return primary_campaign_goal.location - - campaign_alt_goals = campaign_alt_final_mission_locations[campaign] - if campaign_alt_goals is not None and mission in campaign_alt_goals: - return campaign_alt_goals.get(mission) - - return mission.mission_name + ": Victory" - - -def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]: - """ - - :param campaign: - :return: All missions that can be the campaign's goal - """ - missions: List[SC2Mission] = list() - primary_goal_mission = campaign_final_mission_locations[campaign] - if primary_goal_mission is not None: - missions.append(primary_goal_mission.mission) - alt_goal_locations = campaign_alt_final_mission_locations[campaign] - if alt_goal_locations is not None: - for mission in alt_goal_locations.keys(): - missions.append(mission) - - return missions - - -def get_no_build_missions() -> List[SC2Mission]: - return [mission for mission in SC2Mission if not mission.build] diff --git a/worlds/sc2/Options.py b/worlds/sc2/Options.py deleted file mode 100644 index 88febb70..00000000 --- a/worlds/sc2/Options.py +++ /dev/null @@ -1,908 +0,0 @@ -from dataclasses import dataclass, fields, Field -from typing import FrozenSet, Union, Set - -from Options import Choice, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range, PerGameCommonOptions -from .MissionTables import SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_no_build_missions, \ - campaign_mission_table -from worlds.AutoWorld import World - - -class GameDifficulty(Choice): - """ - The difficulty of the campaign, affects enemy AI, starting units, and game speed. - - For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level - lower than the vanilla game - """ - display_name = "Game Difficulty" - option_casual = 0 - option_normal = 1 - option_hard = 2 - option_brutal = 3 - default = 1 - - -class GameSpeed(Choice): - """Optional setting to override difficulty-based game speed.""" - display_name = "Game Speed" - option_default = 0 - option_slower = 1 - option_slow = 2 - option_normal = 3 - option_fast = 4 - option_faster = 5 - default = option_default - - -class DisableForcedCamera(Toggle): - """ - Prevents the game from moving or locking the camera without the player's consent. - """ - display_name = "Disable Forced Camera Movement" - - -class SkipCutscenes(Toggle): - """ - Skips all cutscenes and prevents dialog from blocking progress. - """ - display_name = "Skip Cutscenes" - - -class AllInMap(Choice): - """Determines what version of All-In (WoL final map) that will be generated for the campaign.""" - display_name = "All In Map" - option_ground = 0 - option_air = 1 - - -class MissionOrder(Choice): - """ - Determines the order the missions are played in. The last three mission orders end in a random mission. - Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns. - Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within. - Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches. - Medium Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards bottom-right mission to win. - Mini Grid (9): A 3x3 version of Grid. Complete the bottom-right mission to win. - Blitz (12): 12 random missions that open up very quickly. Complete the bottom-right mission to win. - Gauntlet (7): Linear series of 7 random missions to complete the campaign. - Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign. - Tiny Grid (4): A 2x2 version of Grid. Complete the bottom-right mission to win. - Grid (variable): A grid that will resize to use all non-excluded missions. Corners may be omitted to make the grid more square. Complete the bottom-right mission to win. - """ - display_name = "Mission Order" - option_vanilla = 0 - option_vanilla_shuffled = 1 - option_mini_campaign = 2 - option_medium_grid = 3 - option_mini_grid = 4 - option_blitz = 5 - option_gauntlet = 6 - option_mini_gauntlet = 7 - option_tiny_grid = 8 - option_grid = 9 - - -class MaximumCampaignSize(Range): - """ - Sets an upper bound on how many missions to include when a variable-size mission order is selected. - If a set-size mission order is selected, does nothing. - """ - display_name = "Maximum Campaign Size" - range_start = 1 - range_end = 83 - default = 83 - - -class GridTwoStartPositions(Toggle): - """ - If turned on and 'grid' mission order is selected, removes a mission from the starting - corner sets the adjacent two missions as the starter missions. - """ - display_name = "Start with two unlocked missions on grid" - default = Toggle.option_false - - -class ColorChoice(Choice): - option_white = 0 - option_red = 1 - option_blue = 2 - option_teal = 3 - option_purple = 4 - option_yellow = 5 - option_orange = 6 - option_green = 7 - option_light_pink = 8 - option_violet = 9 - option_light_grey = 10 - option_dark_green = 11 - option_brown = 12 - option_light_green = 13 - option_dark_grey = 14 - option_pink = 15 - option_rainbow = 16 - option_default = 17 - default = option_default - - -class PlayerColorTerranRaynor(ColorChoice): - """Determines in-game team color for playable Raynor's Raiders (Terran) factions.""" - display_name = "Terran Player Color (Raynor)" - - -class PlayerColorProtoss(ColorChoice): - """Determines in-game team color for playable Protoss factions.""" - display_name = "Protoss Player Color" - - -class PlayerColorZerg(ColorChoice): - """Determines in-game team color for playable Zerg factions before Kerrigan becomes Primal Kerrigan.""" - display_name = "Zerg Player Color" - - -class PlayerColorZergPrimal(ColorChoice): - """Determines in-game team color for playable Zerg factions after Kerrigan becomes Primal Kerrigan.""" - display_name = "Zerg Player Color (Primal)" - - -class EnableWolMissions(DefaultOnToggle): - """ - Enables missions from main Wings of Liberty campaign. - """ - display_name = "Enable Wings of Liberty missions" - - -class EnableProphecyMissions(DefaultOnToggle): - """ - Enables missions from Prophecy mini-campaign. - """ - display_name = "Enable Prophecy missions" - - -class EnableHotsMissions(DefaultOnToggle): - """ - Enables missions from Heart of the Swarm campaign. - """ - display_name = "Enable Heart of the Swarm missions" - - -class EnableLotVPrologueMissions(DefaultOnToggle): - """ - Enables missions from Prologue campaign. - """ - display_name = "Enable Prologue (Legacy of the Void) missions" - - -class EnableLotVMissions(DefaultOnToggle): - """ - Enables missions from Legacy of the Void campaign. - """ - display_name = "Enable Legacy of the Void (main campaign) missions" - - -class EnableEpilogueMissions(DefaultOnToggle): - """ - Enables missions from Epilogue campaign. - These missions are considered very hard. - - Enabling Wings of Liberty, Heart of the Swarm and Legacy of the Void is strongly recommended in order to play Epilogue. - Not recommended for short mission orders. - See also: Exclude Very Hard Missions - """ - display_name = "Enable Epilogue missions" - - -class EnableNCOMissions(DefaultOnToggle): - """ - Enables missions from Nova Covert Ops campaign. - - Note: For best gameplay experience it's recommended to also enable Wings of Liberty campaign. - """ - display_name = "Enable Nova Covert Ops missions" - - -class ShuffleCampaigns(DefaultOnToggle): - """ - Shuffles the missions between campaigns if enabled. - Only available for Vanilla Shuffled and Mini Campaign mission order - """ - display_name = "Shuffle Campaigns" - - -class ShuffleNoBuild(DefaultOnToggle): - """ - Determines if the no-build missions are included in the shuffle. - If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order. - """ - display_name = "Shuffle No-Build Missions" - - -class StarterUnit(Choice): - """ - Unlocks a random unit at the start of the game. - - Off: No units are provided, the first unit must be obtained from the randomizer - Balanced: A unit that doesn't give the player too much power early on is given - Any Starter Unit: Any starter unit can be given - """ - display_name = "Starter Unit" - option_off = 0 - option_balanced = 1 - option_any_starter_unit = 2 - - -class RequiredTactics(Choice): - """ - Determines the maximum tactical difficulty of the world (separate from mission difficulty). Higher settings - increase randomness. - - Standard: All missions can be completed with good micro and macro. - Advanced: Completing missions may require relying on starting units and micro-heavy units. - No Logic: Units and upgrades may be placed anywhere. LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES! - Locks Grant Story Tech option to true. - """ - display_name = "Required Tactics" - option_standard = 0 - option_advanced = 1 - option_no_logic = 2 - - -class GenericUpgradeMissions(Range): - """Determines the percentage of missions in the mission order that must be completed before - level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions, - and level 3 requires triple the amount. The required amounts are always rounded down. - If set to 0, upgrades are instead added to the item pool and must be found to be used.""" - display_name = "Generic Upgrade Missions" - range_start = 0 - range_end = 100 - default = 0 - - -class GenericUpgradeResearch(Choice): - """Determines how weapon and armor upgrades affect missions once unlocked. - - Vanilla: Upgrades must be researched as normal. - Auto In No-Build: In No-Build missions, upgrades are automatically researched. - In all other missions, upgrades must be researched as normal. - Auto In Build: In No-Build missions, upgrades are unavailable as normal. - In all other missions, upgrades are automatically researched. - Always Auto: Upgrades are automatically researched in all missions.""" - display_name = "Generic Upgrade Research" - option_vanilla = 0 - option_auto_in_no_build = 1 - option_auto_in_build = 2 - option_always_auto = 3 - - -class GenericUpgradeItems(Choice): - """Determines how weapon and armor upgrades are split into items. All options produce 3 levels of each item. - Does nothing if upgrades are unlocked by completed mission counts. - - Individual Items: All weapon and armor upgrades are each an item, - resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each. - Bundle Weapon And Armor: All types of weapon upgrades are one item per race, - and all types of armor upgrades are one item per race, - resulting in 18 total items. - Bundle Unit Class: Weapon and armor upgrades are merged, - but upgrades are bundled separately for each race: - Infantry, Vehicle, and Starship upgrades for Terran (9 items), - Ground and Flyer upgrades for Zerg (6 items), - Ground and Air upgrades for Protoss (6 items), - resulting in 21 total items. - Bundle All: All weapon and armor upgrades are one item per race, - resulting in 9 total items.""" - display_name = "Generic Upgrade Items" - option_individual_items = 0 - option_bundle_weapon_and_armor = 1 - option_bundle_unit_class = 2 - option_bundle_all = 3 - - -class NovaCovertOpsItems(Toggle): - """ - If turned on, the equipment upgrades from Nova Covert Ops may be present in the world. - - If Nova Covert Ops campaign is enabled, this option is locked to be turned on. - """ - display_name = "Nova Covert Ops Items" - default = Toggle.option_true - - -class BroodWarItems(Toggle): - """If turned on, returning items from StarCraft: Brood War may appear in the world.""" - display_name = "Brood War Items" - default = Toggle.option_true - - -class ExtendedItems(Toggle): - """If turned on, original items that did not appear in Campaign mode may appear in the world.""" - display_name = "Extended Items" - default = Toggle.option_true - - -# Current maximum number of upgrades for a unit -MAX_UPGRADES_OPTION = 12 - - -class EnsureGenericItems(Range): - """ - Specifies a minimum percentage of the generic item pool that will be present for the slot. - The generic item pool is the pool of all generically useful items after all exclusions. - Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades, - Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities - Increasing this percentage will make units less common. - """ - display_name = "Ensure Generic Items" - range_start = 0 - range_end = 100 - default = 25 - - -class MinNumberOfUpgrades(Range): - """ - Set a minimum to the number of upgrades a unit/structure can have. - Note that most units have 4 or 6 upgrades. - If a unit has fewer upgrades than the minimum, it will have all of its upgrades. - - Doesn't affect shared unit upgrades. - """ - display_name = "Minimum number of upgrades per unit/structure" - range_start = 0 - range_end = MAX_UPGRADES_OPTION - default = 2 - - -class MaxNumberOfUpgrades(Range): - """ - Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited. - Note that most unit have 4 to 6 upgrades. - - Doesn't affect shared unit upgrades. - """ - display_name = "Maximum number of upgrades per unit/structure" - range_start = -1 - range_end = MAX_UPGRADES_OPTION - default = -1 - - -class KerriganPresence(Choice): - """ - Determines whether Kerrigan is playable outside of missions that require her. - - Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game. - Not Present: Kerrigan is not playable, unless the mission requires her to be present. Other hero units stay playable, - and locations normally requiring Kerrigan can be checked by any unit. - Kerrigan level items, active abilities and passive abilities affecting her will not appear. - In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true - Not Present And No Passives: In addition to the above, Kerrigan's passive abilities affecting other units (such as Twin Drones) will not appear. - - Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled. - """ - display_name = "Kerrigan Presence" - option_vanilla = 0 - option_not_present = 1 - option_not_present_and_no_passives = 2 - - -class KerriganLevelsPerMissionCompleted(Range): - """ - Determines how many levels Kerrigan gains when a mission is beaten. - - NOTE: Setting this too low can result in generation failures if The Infinite Cycle or Supreme are in the mission pool. - """ - display_name = "Levels Per Mission Beaten" - range_start = 0 - range_end = 20 - default = 0 - - -class KerriganLevelsPerMissionCompletedCap(Range): - """ - Limits how many total levels Kerrigan can gain from beating missions. This does not affect levels gained from items. - Set to -1 to disable this limit. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Levels Per Mission Beaten Cap" - range_start = -1 - range_end = 140 - default = -1 - - -class KerriganLevelItemSum(Range): - """ - Determines the sum of the level items in the world. This does not affect levels gained from beating missions. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Kerrigan Level Item Sum" - range_start = 0 - range_end = 140 - default = 70 - - -class KerriganLevelItemDistribution(Choice): - """Determines the amount and size of Kerrigan level items. - - Vanilla: Uses the distribution in the vanilla campaign. - This entails 32 individual levels and 6 packs of varying sizes. - This distribution always adds up to 70, ignoring the Level Item Sum setting. - Smooth: Uses a custom, condensed distribution of 10 items between sizes 4 and 10, - intended to fit more levels into settings with little room for filler while keeping some variance in level gains. - This distribution always adds up to 70, ignoring the Level Item Sum setting. - Size 70: Uses items worth 70 levels each. - Size 35: Uses items worth 35 levels each. - Size 14: Uses items worth 14 levels each. - Size 10: Uses items worth 10 levels each. - Size 7: Uses items worth 7 levels each. - Size 5: Uses items worth 5 levels each. - Size 2: Uses items worth 2 level eachs. - Size 1: Uses individual levels. As there are not enough locations in the game for this distribution, - this will result in a greatly reduced total level, and is likely to remove many other items.""" - display_name = "Kerrigan Level Item Distribution" - option_vanilla = 0 - option_smooth = 1 - option_size_70 = 2 - option_size_35 = 3 - option_size_14 = 4 - option_size_10 = 5 - option_size_7 = 6 - option_size_5 = 7 - option_size_2 = 8 - option_size_1 = 9 - default = option_smooth - - -class KerriganTotalLevelCap(Range): - """ - Limits how many total levels Kerrigan can gain from any source. Depending on your other settings, - there may be more levels available in the world, but they will not affect Kerrigan. - Set to -1 to disable this limit. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Total Level Cap" - range_start = -1 - range_end = 140 - default = -1 - - -class StartPrimaryAbilities(Range): - """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with. - If set to 4, a Tier 7 ability is also included.""" - display_name = "Starting Primary Abilities" - range_start = 0 - range_end = 4 - default = 0 - - -class KerriganPrimalStatus(Choice): - """Determines when Kerrigan appears in her Primal Zerg form. - This greatly increases her energy regeneration. - - Vanilla: Kerrigan is human in missions that canonically appear before The Crucible, - and zerg thereafter. - Always Zerg: Kerrigan is always zerg. - Always Human: Kerrigan is always human. - Level 35: Kerrigan is human until reaching level 35, and zerg thereafter. - Half Completion: Kerrigan is human until half of the missions in the world are completed, - and zerg thereafter. - Item: Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter.""" - display_name = "Kerrigan Primal Status" - option_vanilla = 0 - option_always_zerg = 1 - option_always_human = 2 - option_level_35 = 3 - option_half_completion = 4 - option_item = 5 - - -class SpearOfAdunPresence(Choice): - """ - Determines in which missions Spear of Adun calldowns will be available. - Affects only abilities used from Spear of Adun top menu. - - Not Present: Spear of Adun calldowns are unavailable. - LotV Protoss: Spear of Adun calldowns are only available in LotV main campaign - Protoss: Spear od Adun calldowns are available in any Protoss mission - Everywhere: Spear od Adun calldowns are available in any mission of any race - """ - display_name = "Spear of Adun Presence" - option_not_present = 0 - option_lotv_protoss = 1 - option_protoss = 2 - option_everywhere = 3 - default = option_lotv_protoss - - # Fix case - @classmethod - def get_option_name(cls, value: int) -> str: - if value == SpearOfAdunPresence.option_lotv_protoss: - return "LotV Protoss" - else: - return super().get_option_name(value) - - -class SpearOfAdunPresentInNoBuild(Toggle): - """ - Determines if Spear of Adun calldowns are available in no-build missions. - - If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence". - If turned off, Spear of Adun calldown powers are unavailable in all no-build missions - """ - display_name = "Spear of Adun Present in No-Build" - - -class SpearOfAdunAutonomouslyCastAbilityPresence(Choice): - """ - Determines availability of Spear of Adun powers, that are autonomously cast. - Affects abilities like Reconstruction Beam or Overwatch - - Not Presents: Autocasts are not available. - LotV Protoss: Spear of Adun autocasts are only available in LotV main campaign - Protoss: Spear od Adun autocasts are available in any Protoss mission - Everywhere: Spear od Adun autocasts are available in any mission of any race - """ - display_name = "Spear of Adun Autonomously Cast Powers Presence" - option_not_present = 0 - option_lotv_protoss = 1 - option_protoss = 2 - option_everywhere = 3 - default = option_lotv_protoss - - # Fix case - @classmethod - def get_option_name(cls, value: int) -> str: - if value == SpearOfAdunPresence.option_lotv_protoss: - return "LotV Protoss" - else: - return super().get_option_name(value) - - -class SpearOfAdunAutonomouslyCastPresentInNoBuild(Toggle): - """ - Determines if Spear of Adun autocasts are available in no-build missions. - - If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Autonomously Cast Powers Presence". - If turned off, Spear of Adun autocasts are unavailable in all no-build missions - """ - display_name = "Spear of Adun Autonomously Cast Powers Present in No-Build" - - -class GrantStoryTech(Toggle): - """ - If set true, grants special tech required for story mission completion for duration of the mission. - Otherwise, you need to find these tech by a normal means as items. - Affects story missions like Back in the Saddle and Supreme - - Locked to true if Required Tactics is set to no logic. - """ - display_name = "Grant Story Tech" - - -class GrantStoryLevels(Choice): - """ - If enabled, grants Kerrigan the required minimum levels for the following missions: - Supreme: 35 - The Infinite Cycle: 70 - The bonus levels only apply during the listed missions, and can exceed the Total Level Cap. - - If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail. - To prevent this, either increase the amount of levels in the world, or enable this option. - - If disabled and Required Tactics is set to no logic, this option is forced to Minimum. - - Disabled: Kerrigan does not get bonus levels for these missions, - instead the levels must be gained from items or beating missions. - Additive: Kerrigan gains bonus levels equal to the mission's required level. - Minimum: Kerrigan is either at her real level, or at the mission's required level, - depending on which is higher. - """ - display_name = "Grant Story Levels" - option_disabled = 0 - option_additive = 1 - option_minimum = 2 - default = option_minimum - - -class TakeOverAIAllies(Toggle): - """ - On maps supporting this feature allows you to take control over an AI Ally. - """ - display_name = "Take Over AI Allies" - - -class LockedItems(ItemSet): - """Guarantees that these items will be unlockable""" - display_name = "Locked Items" - - -class ExcludedItems(ItemSet): - """Guarantees that these items will not be unlockable""" - display_name = "Excluded Items" - - -class ExcludedMissions(OptionSet): - """Guarantees that these missions will not appear in the campaign - Doesn't apply to vanilla mission order. - It may be impossible to build a valid campaign if too many missions are excluded.""" - display_name = "Excluded Missions" - valid_keys = {mission.mission_name for mission in SC2Mission} - - -class ExcludeVeryHardMissions(Choice): - """ - Excludes Very Hard missions outside of Epilogue campaign (All-In, Salvation, and all Epilogue missions are considered Very Hard). - Doesn't apply to "Vanilla" mission order. - - Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20, - excluded for any other order - Yes: Non-Epilogue Very Hard missions are excluded and won't be generated - No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders. - - See also: Excluded Missions, Enable Epilogue Missions, Maximum Campaign Size - """ - display_name = "Exclude Very Hard Missions" - option_default = 0 - option_true = 1 - option_false = 2 - - @classmethod - def get_option_name(cls, value): - return ["Default", "Yes", "No"][int(value)] - - -class LocationInclusion(Choice): - option_enabled = 0 - option_resources = 1 - option_disabled = 2 - - -class VanillaLocations(LocationInclusion): - """ - Enables or disables item rewards for completing vanilla objectives. - Vanilla objectives are bonus objectives from the vanilla game, - along with some additional objectives to balance the missions. - Enable these locations for a balanced experience. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Vanilla Locations" - - -class ExtraLocations(LocationInclusion): - """ - Enables or disables item rewards for mission progress and minor objectives. - This includes mandatory mission objectives, - collecting reinforcements and resource pickups, - destroying structures, and overcoming minor challenges. - Enables these locations to add more checks and items to your world. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Extra Locations" - - -class ChallengeLocations(LocationInclusion): - """ - Enables or disables item rewards for completing challenge tasks. - Challenges are tasks that are more difficult than completing the mission, and are often based on achievements. - You might be required to visit the same mission later after getting stronger in order to finish these tasks. - Enable these locations to increase the difficulty of completing the multiworld. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Challenge Locations" - - -class MasteryLocations(LocationInclusion): - """ - Enables or disables item rewards for overcoming especially difficult challenges. - These challenges are often based on Mastery achievements and Feats of Strength. - Enable these locations to add the most difficult checks to the world. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Mastery Locations" - - -class MineralsPerItem(Range): - """ - Configures how many minerals are given per resource item. - """ - display_name = "Minerals Per Item" - range_start = 0 - range_end = 500 - default = 25 - - -class VespenePerItem(Range): - """ - Configures how much vespene gas is given per resource item. - """ - display_name = "Vespene Per Item" - range_start = 0 - range_end = 500 - default = 25 - - -class StartingSupplyPerItem(Range): - """ - Configures how much starting supply per is given per item. - """ - display_name = "Starting Supply Per Item" - range_start = 0 - range_end = 200 - default = 5 - - -@dataclass -class Starcraft2Options(PerGameCommonOptions): - game_difficulty: GameDifficulty - game_speed: GameSpeed - disable_forced_camera: DisableForcedCamera - skip_cutscenes: SkipCutscenes - all_in_map: AllInMap - mission_order: MissionOrder - maximum_campaign_size: MaximumCampaignSize - grid_two_start_positions: GridTwoStartPositions - player_color_terran_raynor: PlayerColorTerranRaynor - player_color_protoss: PlayerColorProtoss - player_color_zerg: PlayerColorZerg - player_color_zerg_primal: PlayerColorZergPrimal - enable_wol_missions: EnableWolMissions - enable_prophecy_missions: EnableProphecyMissions - enable_hots_missions: EnableHotsMissions - enable_lotv_prologue_missions: EnableLotVPrologueMissions - enable_lotv_missions: EnableLotVMissions - enable_epilogue_missions: EnableEpilogueMissions - enable_nco_missions: EnableNCOMissions - shuffle_campaigns: ShuffleCampaigns - shuffle_no_build: ShuffleNoBuild - starter_unit: StarterUnit - required_tactics: RequiredTactics - ensure_generic_items: EnsureGenericItems - min_number_of_upgrades: MinNumberOfUpgrades - max_number_of_upgrades: MaxNumberOfUpgrades - generic_upgrade_missions: GenericUpgradeMissions - generic_upgrade_research: GenericUpgradeResearch - generic_upgrade_items: GenericUpgradeItems - kerrigan_presence: KerriganPresence - kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted - kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap - kerrigan_level_item_sum: KerriganLevelItemSum - kerrigan_level_item_distribution: KerriganLevelItemDistribution - kerrigan_total_level_cap: KerriganTotalLevelCap - start_primary_abilities: StartPrimaryAbilities - kerrigan_primal_status: KerriganPrimalStatus - spear_of_adun_presence: SpearOfAdunPresence - spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild - spear_of_adun_autonomously_cast_ability_presence: SpearOfAdunAutonomouslyCastAbilityPresence - spear_of_adun_autonomously_cast_present_in_no_build: SpearOfAdunAutonomouslyCastPresentInNoBuild - grant_story_tech: GrantStoryTech - grant_story_levels: GrantStoryLevels - take_over_ai_allies: TakeOverAIAllies - locked_items: LockedItems - excluded_items: ExcludedItems - excluded_missions: ExcludedMissions - exclude_very_hard_missions: ExcludeVeryHardMissions - nco_items: NovaCovertOpsItems - bw_items: BroodWarItems - ext_items: ExtendedItems - vanilla_locations: VanillaLocations - extra_locations: ExtraLocations - challenge_locations: ChallengeLocations - mastery_locations: MasteryLocations - minerals_per_item: MineralsPerItem - vespene_per_item: VespenePerItem - starting_supply_per_item: StartingSupplyPerItem - - -def get_option_value(world: World, name: str) -> Union[int, FrozenSet]: - if world is None: - field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0] - return field.type.default - - player_option = getattr(world.options, name) - - return player_option.value - - -def get_enabled_campaigns(world: World) -> Set[SC2Campaign]: - enabled_campaigns = set() - if get_option_value(world, "enable_wol_missions"): - enabled_campaigns.add(SC2Campaign.WOL) - if get_option_value(world, "enable_prophecy_missions"): - enabled_campaigns.add(SC2Campaign.PROPHECY) - if get_option_value(world, "enable_hots_missions"): - enabled_campaigns.add(SC2Campaign.HOTS) - if get_option_value(world, "enable_lotv_prologue_missions"): - enabled_campaigns.add(SC2Campaign.PROLOGUE) - if get_option_value(world, "enable_lotv_missions"): - enabled_campaigns.add(SC2Campaign.LOTV) - if get_option_value(world, "enable_epilogue_missions"): - enabled_campaigns.add(SC2Campaign.EPILOGUE) - if get_option_value(world, "enable_nco_missions"): - enabled_campaigns.add(SC2Campaign.NCO) - return enabled_campaigns - - -def get_disabled_campaigns(world: World) -> Set[SC2Campaign]: - all_campaigns = set(SC2Campaign) - enabled_campaigns = get_enabled_campaigns(world) - disabled_campaigns = all_campaigns.difference(enabled_campaigns) - disabled_campaigns.remove(SC2Campaign.GLOBAL) - return disabled_campaigns - - -def get_excluded_missions(world: World) -> Set[SC2Mission]: - mission_order_type = get_option_value(world, "mission_order") - excluded_mission_names = get_option_value(world, "excluded_missions") - shuffle_no_build = get_option_value(world, "shuffle_no_build") - disabled_campaigns = get_disabled_campaigns(world) - - excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names]) - - # Excluding Very Hard missions depending on options - if (get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_true - ) or ( - get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_default - and ( - mission_order_type not in [MissionOrder.option_vanilla_shuffled, MissionOrder.option_grid] - or ( - mission_order_type == MissionOrder.option_grid - and get_option_value(world, "maximum_campaign_size") < 20 - ) - ) - ): - excluded_missions = excluded_missions.union( - [mission for mission in SC2Mission if - mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE] - ) - # Omitting No-Build missions if not shuffling no-build - if not shuffle_no_build: - excluded_missions = excluded_missions.union(get_no_build_missions()) - # Omitting missions not in enabled campaigns - for campaign in disabled_campaigns: - excluded_missions = excluded_missions.union(campaign_mission_table[campaign]) - - return excluded_missions - - -campaign_depending_orders = [ - MissionOrder.option_vanilla, - MissionOrder.option_vanilla_shuffled, - MissionOrder.option_mini_campaign -] - -kerrigan_unit_available = [ - KerriganPresence.option_vanilla, -] \ No newline at end of file diff --git a/worlds/sc2/PoolFilter.py b/worlds/sc2/PoolFilter.py deleted file mode 100644 index f5f6faa9..00000000 --- a/worlds/sc2/PoolFilter.py +++ /dev/null @@ -1,661 +0,0 @@ -from typing import Callable, Dict, List, Set, Union, Tuple, Optional -from BaseClasses import Item, Location -from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \ - progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment -from .MissionTables import mission_orders, MissionInfo, MissionPools, \ - get_campaign_goal_priority, campaign_final_mission_locations, campaign_alt_final_mission_locations, \ - SC2Campaign, SC2Race, SC2CampaignGoalPriority, SC2Mission -from .Options import get_option_value, MissionOrder, \ - get_enabled_campaigns, get_disabled_campaigns, RequiredTactics, kerrigan_unit_available, GrantStoryTech, \ - TakeOverAIAllies, SpearOfAdunPresence, SpearOfAdunAutonomouslyCastAbilityPresence, campaign_depending_orders, \ - ShuffleCampaigns, get_excluded_missions, ShuffleNoBuild, ExtraLocations, GrantStoryLevels -from . import ItemNames -from worlds.AutoWorld import World - -# Items with associated upgrades -UPGRADABLE_ITEMS = {item.parent_item for item in get_full_item_list().values() if item.parent_item} - -BARRACKS_UNITS = { - ItemNames.MARINE, ItemNames.MEDIC, ItemNames.FIREBAT, ItemNames.MARAUDER, - ItemNames.REAPER, ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.HERC, -} -FACTORY_UNITS = { - ItemNames.HELLION, ItemNames.VULTURE, ItemNames.GOLIATH, ItemNames.DIAMONDBACK, - ItemNames.SIEGE_TANK, ItemNames.THOR, ItemNames.PREDATOR, ItemNames.WIDOW_MINE, - ItemNames.CYCLONE, ItemNames.WARHOUND, -} -STARPORT_UNITS = { - ItemNames.MEDIVAC, ItemNames.WRAITH, ItemNames.VIKING, ItemNames.BANSHEE, - ItemNames.BATTLECRUISER, ItemNames.HERCULES, ItemNames.SCIENCE_VESSEL, ItemNames.RAVEN, - ItemNames.LIBERATOR, ItemNames.VALKYRIE, -} - - -def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]: - - """ - Returns a semi-randomly pruned tuple of no-build, easy, medium, and hard mission sets - """ - world: World = world - mission_order_type = get_option_value(world, "mission_order") - shuffle_no_build = get_option_value(world, "shuffle_no_build") - enabled_campaigns = get_enabled_campaigns(world) - grant_story_tech = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - grant_story_levels = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled - extra_locations = get_option_value(world, "extra_locations") - excluded_missions: Set[SC2Mission] = get_excluded_missions(world) - mission_pools: Dict[MissionPools, List[SC2Mission]] = {} - for mission in SC2Mission: - if not mission_pools.get(mission.pool): - mission_pools[mission.pool] = list() - mission_pools[mission.pool].append(mission) - # A bit of safeguard: - for mission_pool in MissionPools: - if not mission_pools.get(mission_pool): - mission_pools[mission_pool] = [] - - if mission_order_type == MissionOrder.option_vanilla: - # Vanilla uses the entire mission pool - goal_priorities: Dict[SC2Campaign, SC2CampaignGoalPriority] = {campaign: get_campaign_goal_priority(campaign) for campaign in enabled_campaigns} - goal_level = max(goal_priorities.values()) - candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] - candidate_campaigns.sort(key=lambda it: it.id) - goal_campaign = world.random.choice(candidate_campaigns) - if campaign_final_mission_locations[goal_campaign] is not None: - mission_pools[MissionPools.FINAL] = [campaign_final_mission_locations[goal_campaign].mission] - else: - mission_pools[MissionPools.FINAL] = [list(campaign_alt_final_mission_locations[goal_campaign].keys())[0]] - remove_final_mission_from_other_pools(mission_pools) - return mission_pools - - # Finding the goal map - goal_mission: Optional[SC2Mission] = None - if mission_order_type in campaign_depending_orders: - # Prefer long campaigns over shorter ones and harder missions over easier ones - goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} - goal_level = max(goal_priorities.values()) - candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] - candidate_campaigns.sort(key=lambda it: it.id) - - goal_campaign = world.random.choice(candidate_campaigns) - primary_goal = campaign_final_mission_locations[goal_campaign] - if primary_goal is None or primary_goal.mission in excluded_missions: - # No primary goal or its mission is excluded - candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) - candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] - if len(candidate_missions) == 0: - raise Exception("There are no valid goal missions. Please exclude fewer missions.") - goal_mission = world.random.choice(candidate_missions) - else: - goal_mission = primary_goal.mission - else: - # Find one of the missions with the hardest difficulty - available_missions: List[SC2Mission] = \ - [mission for mission in SC2Mission - if (mission not in excluded_missions and mission.campaign in enabled_campaigns)] - available_missions.sort(key=lambda it: it.id) - # Loop over pools, from hardest to easiest - for mission_pool in range(MissionPools.VERY_HARD, MissionPools.STARTER - 1, -1): - pool_missions: List[SC2Mission] = [mission for mission in available_missions if mission.pool == mission_pool] - if pool_missions: - goal_mission = world.random.choice(pool_missions) - break - if goal_mission is None: - raise Exception("There are no valid goal missions. Please exclude fewer missions.") - - # Excluding missions - for difficulty, mission_pool in mission_pools.items(): - mission_pools[difficulty] = [mission for mission in mission_pool if mission not in excluded_missions] - mission_pools[MissionPools.FINAL] = [goal_mission] - - # Mission pool changes - adv_tactics = get_option_value(world, "required_tactics") != RequiredTactics.option_standard - - def move_mission(mission: SC2Mission, current_pool, new_pool): - if mission in mission_pools[current_pool]: - mission_pools[current_pool].remove(mission) - mission_pools[new_pool].append(mission) - # WoL - if shuffle_no_build == ShuffleNoBuild.option_false or adv_tactics: - # Replacing No Build missions with Easy missions - # WoL - move_mission(SC2Mission.ZERO_HOUR, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.EVACUATION, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.DEVILS_PLAYGROUND, MissionPools.EASY, MissionPools.STARTER) - # LotV - move_mission(SC2Mission.THE_GROWING_SHADOW, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_SPEAR_OF_ADUN, MissionPools.EASY, MissionPools.STARTER) - if extra_locations == ExtraLocations.option_enabled: - move_mission(SC2Mission.SKY_SHIELD, MissionPools.EASY, MissionPools.STARTER) - # Pushing this to Easy - move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.MEDIUM, MissionPools.EASY) - if shuffle_no_build == ShuffleNoBuild.option_false: - # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only - move_mission(SC2Mission.OUTBREAK, MissionPools.EASY, MissionPools.MEDIUM) - # Pushing extra Normal missions to Easy - move_mission(SC2Mission.ECHOES_OF_THE_FUTURE, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.CUTTHROAT, MissionPools.MEDIUM, MissionPools.EASY) - # Additional changes on Advanced Tactics - if adv_tactics: - # WoL - move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.SMASH_AND_GRAB, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_MOEBIUS_FACTOR, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.WELCOME_TO_THE_JUNGLE, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.ENGINE_OF_DESTRUCTION, MissionPools.HARD, MissionPools.MEDIUM) - # LotV - move_mission(SC2Mission.AMON_S_REACH, MissionPools.EASY, MissionPools.STARTER) - # Prophecy needs to be adjusted on tiny grid - if enabled_campaigns == {SC2Campaign.PROPHECY} and mission_order_type == MissionOrder.option_tiny_grid: - move_mission(SC2Mission.A_SINISTER_TURN, MissionPools.MEDIUM, MissionPools.EASY) - # Prologue's only valid starter is the goal mission - if enabled_campaigns == {SC2Campaign.PROLOGUE} \ - or mission_order_type in campaign_depending_orders \ - and get_option_value(world, "shuffle_campaigns") == ShuffleCampaigns.option_false: - move_mission(SC2Mission.DARK_WHISPERS, MissionPools.EASY, MissionPools.STARTER) - # HotS - kerriganless = get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \ - or SC2Campaign.HOTS not in enabled_campaigns - if adv_tactics: - # Medium -> Easy - for mission in (SC2Mission.FIRE_IN_THE_SKY, SC2Mission.WAKING_THE_ANCIENT, SC2Mission.CONVICTION): - move_mission(mission, MissionPools.MEDIUM, MissionPools.EASY) - # Hard -> Medium - move_mission(SC2Mission.PHANTOMS_OF_THE_VOID, MissionPools.HARD, MissionPools.MEDIUM) - if not kerriganless: - # Additional starter mission assuming player starts with minimal anti-air - move_mission(SC2Mission.WAKING_THE_ANCIENT, MissionPools.EASY, MissionPools.STARTER) - if grant_story_tech: - # Additional starter mission if player is granted story tech - move_mission(SC2Mission.ENEMY_WITHIN, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_ESCAPE, MissionPools.MEDIUM, MissionPools.STARTER) - move_mission(SC2Mission.IN_THE_ENEMY_S_SHADOW, MissionPools.MEDIUM, MissionPools.STARTER) - if (grant_story_tech and grant_story_levels) or kerriganless: - # The player has, all the stuff he needs, provided under these settings - move_mission(SC2Mission.SUPREME, MissionPools.MEDIUM, MissionPools.STARTER) - move_mission(SC2Mission.THE_INFINITE_CYCLE, MissionPools.HARD, MissionPools.STARTER) - if get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true: - move_mission(SC2Mission.HARBINGER_OF_OBLIVION, MissionPools.MEDIUM, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) < 2 and not kerriganless or adv_tactics: - # Conditionally moving Easy missions to Starter - move_mission(SC2Mission.HARVEST_OF_SCREAMS, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.DOMINATION, MissionPools.EASY, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) < 2: - move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) + len(mission_pools[MissionPools.EASY]) < 2: - # Flashpoint needs just a few items at start but competent comp at the end - move_mission(SC2Mission.FLASHPOINT, MissionPools.HARD, MissionPools.EASY) - - remove_final_mission_from_other_pools(mission_pools) - return mission_pools - - -def remove_final_mission_from_other_pools(mission_pools: Dict[MissionPools, List[SC2Mission]]): - final_missions = mission_pools[MissionPools.FINAL] - for pool, missions in mission_pools.items(): - if pool == MissionPools.FINAL: - continue - for final_mission in final_missions: - while final_mission in missions: - missions.remove(final_mission) - - -def get_item_upgrades(inventory: List[Item], parent_item: Union[Item, str]) -> List[Item]: - item_name = parent_item.name if isinstance(parent_item, Item) else parent_item - return [ - inv_item for inv_item in inventory - if get_full_item_list()[inv_item.name].parent_item == item_name - ] - - -def get_item_quantity(item: Item, world: World): - if (not get_option_value(world, "nco_items")) \ - and SC2Campaign.NCO in get_disabled_campaigns(world) \ - and item.name in progressive_if_nco: - return 1 - if (not get_option_value(world, "ext_items")) \ - and item.name in progressive_if_ext: - return 1 - return get_full_item_list()[item.name].quantity - - -def copy_item(item: Item): - return Item(item.name, item.classification, item.code, item.player) - - -def num_missions(world: World) -> int: - mission_order_type = get_option_value(world, "mission_order") - if mission_order_type != MissionOrder.option_grid: - mission_order = mission_orders[mission_order_type]() - misssions = [mission for campaign in mission_order for mission in mission_order[campaign]] - return len(misssions) - 1 # Menu - else: - mission_pools = filter_missions(world) - return sum(len(pool) for _, pool in mission_pools.items()) - - -class ValidInventory: - - def has(self, item: str, player: int): - return item in self.logical_inventory - - def has_any(self, items: Set[str], player: int): - return any(item in self.logical_inventory for item in items) - - def has_all(self, items: Set[str], player: int): - return all(item in self.logical_inventory for item in items) - - def has_group(self, item_group: str, player: int, count: int = 1): - return False # Deliberately fails here, as item pooling is not aware about mission layout - - def count_group(self, item_name_group: str, player: int) -> int: - return 0 # For item filtering assume no missions are beaten - - def count(self, item: str, player: int) -> int: - return len([inventory_item for inventory_item in self.logical_inventory if inventory_item == item]) - - def has_units_per_structure(self) -> bool: - return len(BARRACKS_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \ - len(FACTORY_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \ - len(STARPORT_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure - - def generate_reduced_inventory(self, inventory_size: int, mission_requirements: List[Tuple[str, Callable]]) -> List[Item]: - """Attempts to generate a reduced inventory that can fulfill the mission requirements.""" - inventory: List[Item] = list(self.item_pool) - locked_items: List[Item] = list(self.locked_items) - item_list = get_full_item_list() - self.logical_inventory = [ - item.name for item in inventory + locked_items + self.existing_items - if item_list[item.name].is_important_for_filtering() # Track all Progression items and those with complex rules for filtering - ] - requirements = mission_requirements - parent_items = self.item_children.keys() - parent_lookup = {child: parent for parent, children in self.item_children.items() for child in children} - minimum_upgrades = get_option_value(self.world, "min_number_of_upgrades") - - def attempt_removal(item: Item) -> bool: - inventory.remove(item) - # Only run logic checks when removing logic items - if item.name in self.logical_inventory: - self.logical_inventory.remove(item.name) - if not all(requirement(self) for (_, requirement) in mission_requirements): - # If item cannot be removed, lock or revert - self.logical_inventory.append(item.name) - for _ in range(get_item_quantity(item, self.world)): - locked_items.append(copy_item(item)) - return False - return True - - # Limit the maximum number of upgrades - maxNbUpgrade = get_option_value(self.world, "max_number_of_upgrades") - if maxNbUpgrade != -1: - unit_avail_upgrades = {} - # Needed to take into account locked/existing items - unit_nb_upgrades = {} - for item in inventory: - cItem = item_list[item.name] - if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: - unit_avail_upgrades[item.name] = [] - unit_nb_upgrades[item.name] = 0 - elif cItem.parent_item is not None: - if cItem.parent_item not in unit_avail_upgrades: - unit_avail_upgrades[cItem.parent_item] = [item] - unit_nb_upgrades[cItem.parent_item] = 1 - else: - unit_avail_upgrades[cItem.parent_item].append(item) - unit_nb_upgrades[cItem.parent_item] += 1 - # For those two categories, we count them but dont include them in removal - for item in locked_items + self.existing_items: - cItem = item_list[item.name] - if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: - unit_avail_upgrades[item.name] = [] - unit_nb_upgrades[item.name] = 0 - elif cItem.parent_item is not None: - if cItem.parent_item not in unit_avail_upgrades: - unit_nb_upgrades[cItem.parent_item] = 1 - else: - unit_nb_upgrades[cItem.parent_item] += 1 - # Making sure that the upgrades being removed is random - shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys()) - self.world.random.shuffle(shuffled_unit_upgrade_list) - for unit in shuffled_unit_upgrade_list: - while (unit_nb_upgrades[unit] > maxNbUpgrade) \ - and (len(unit_avail_upgrades[unit]) > 0): - itemCandidate = self.world.random.choice(unit_avail_upgrades[unit]) - success = attempt_removal(itemCandidate) - # Whatever it succeed to remove the iventory or it fails and thus - # lock it, the upgrade is no longer available for removal - unit_avail_upgrades[unit].remove(itemCandidate) - if success: - unit_nb_upgrades[unit] -= 1 - - # Locking minimum upgrades for items that have already been locked/placed when minimum required - if minimum_upgrades > 0: - known_items = self.existing_items + locked_items - known_parents = [item for item in known_items if item in parent_items] - for parent in known_parents: - child_items = self.item_children[parent] - removable_upgrades = [item for item in inventory if item in child_items] - locked_upgrade_count = sum(1 if item in child_items else 0 for item in known_items) - self.world.random.shuffle(removable_upgrades) - while len(removable_upgrades) > 0 and locked_upgrade_count < minimum_upgrades: - item_to_lock = removable_upgrades.pop() - inventory.remove(item_to_lock) - locked_items.append(copy_item(item_to_lock)) - locked_upgrade_count += 1 - - if self.min_units_per_structure > 0 and self.has_units_per_structure(): - requirements.append(("Minimum units per structure", lambda state: state.has_units_per_structure())) - - # Determining if the full-size inventory can complete campaign - failed_locations: List[str] = [location for (location, requirement) in requirements if not requirement(self)] - if len(failed_locations) > 0: - raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") - - # Optionally locking generic items - generic_items = [item for item in inventory if item.name in second_pass_placeable_items] - reserved_generic_percent = get_option_value(self.world, "ensure_generic_items") / 100 - reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) - removable_generic_items = [] - self.world.random.shuffle(generic_items) - for item in generic_items[:reserved_generic_amount]: - locked_items.append(copy_item(item)) - inventory.remove(item) - if item.name not in self.logical_inventory and item.name not in self.locked_items: - removable_generic_items.append(item) - - # Main cull process - unused_items: List[str] = [] # Reusable items for the second pass - while len(inventory) + len(locked_items) > inventory_size: - if len(inventory) == 0: - # There are more items than locations and all of them are already locked due to YAML or logic. - # First, drop non-logic generic items to free up space - while len(removable_generic_items) > 0 and len(locked_items) > inventory_size: - removed_item = removable_generic_items.pop() - locked_items.remove(removed_item) - # If there still isn't enough space, push locked items into start inventory - self.world.random.shuffle(locked_items) - while len(locked_items) > inventory_size: - item: Item = locked_items.pop() - self.multiworld.push_precollected(item) - break - # Select random item from removable items - item = self.world.random.choice(inventory) - # Do not remove item if it would drop upgrades below minimum - if minimum_upgrades > 0: - parent_item = parent_lookup.get(item, None) - if parent_item: - count = sum(1 if item in self.item_children[parent_item] else 0 for item in inventory + locked_items) - if count <= minimum_upgrades: - if parent_item in inventory: - # Attempt to remove parent instead, if possible - item = parent_item - else: - # Lock remaining upgrades - for item in self.item_children[parent_item]: - if item in inventory: - inventory.remove(item) - locked_items.append(copy_item(item)) - continue - - # Drop child items when removing a parent - if item in parent_items: - items_to_remove = [item for item in self.item_children[item] if item in inventory] - success = attempt_removal(item) - if success: - while len(items_to_remove) > 0: - item_to_remove = items_to_remove.pop() - if item_to_remove not in inventory: - continue - attempt_removal(item_to_remove) - else: - # Unimportant upgrades may be added again in the second pass - if attempt_removal(item): - unused_items.append(item.name) - - pool_items: List[str] = [item.name for item in (inventory + locked_items + self.existing_items)] - unused_items = [ - unused_item for unused_item in unused_items - if item_list[unused_item].parent_item is None - or item_list[unused_item].parent_item in pool_items - ] - - # Removing extra dependencies - # WoL - logical_inventory_set = set(self.logical_inventory) - if not spider_mine_sources & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Spider Mine)")] - if not BARRACKS_UNITS & logical_inventory_set: - inventory = [ - item for item in inventory - if not (item.name.startswith(ItemNames.TERRAN_INFANTRY_UPGRADE_PREFIX) - or item.name == ItemNames.ORBITAL_STRIKE)] - unused_items = [ - item_name for item_name in unused_items - if not (item_name.startswith( - ItemNames.TERRAN_INFANTRY_UPGRADE_PREFIX) - or item_name == ItemNames.ORBITAL_STRIKE)] - if not FACTORY_UNITS & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_VEHICLE_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.TERRAN_VEHICLE_UPGRADE_PREFIX)] - if not STARPORT_UNITS & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_SHIP_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.TERRAN_SHIP_UPGRADE_PREFIX)] - # HotS - # Baneling without sources => remove Baneling and upgrades - if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory - and ItemNames.ZERGLING not in self.logical_inventory - and ItemNames.KERRIGAN_SPAWN_BANELINGS not in self.logical_inventory - ): - inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.ZERGLING_BANELING_ASPECT] - # Spawn Banelings without Zergling => remove Baneling unit, keep upgrades except macro ones - if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory - and ItemNames.ZERGLING not in self.logical_inventory - and ItemNames.KERRIGAN_SPAWN_BANELINGS in self.logical_inventory - ): - inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT] - inventory = [item for item in inventory if item.name != ItemNames.BANELING_RAPID_METAMORPH] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.BANELING_RAPID_METAMORPH] - if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.SCOURGE} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - locked_items = [item for item in locked_items if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - # T3 items removal rules - remove morph and its upgrades if the basic unit isn't in - if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Mutalisk/Corruptor)")] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Mutalisk/Corruptor)")] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT] - if ItemNames.ROACH not in logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ROACH_RAVAGER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ROACH_RAVAGER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ROACH_RAVAGER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.ROACH_RAVAGER_ASPECT] - if ItemNames.HYDRALISK not in logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Hydralisk)")] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_LURKER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_IMPALER_ASPECT] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Hydralisk)")] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.HYDRALISK_LURKER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.HYDRALISK_IMPALER_ASPECT] - # LotV - # Shared unit upgrades between several units - if not {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Stalker/Instigator/Slayer)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Stalker/Instigator/Slayer)")] - if not {ItemNames.PHOENIX, ItemNames.MIRAGE} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Phoenix/Mirage)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Phoenix/Mirage)")] - if not {ItemNames.VOID_RAY, ItemNames.DESTROYER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Void Ray/Destroyer)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Void Ray/Destroyer)")] - if not {ItemNames.IMMORTAL, ItemNames.ANNIHILATOR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Immortal/Annihilator)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Immortal/Annihilator)")] - if not {ItemNames.DARK_TEMPLAR, ItemNames.AVENGER, ItemNames.BLOOD_HUNTER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Dark Templar/Avenger/Blood Hunter)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Dark Templar/Avenger/Blood Hunter)")] - if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Archon)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Archon)")] - logical_inventory_set.difference_update([item_name for item_name in logical_inventory_set if item_name.endswith("(Archon)")]) - if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ARCHON_HIGH_ARCHON} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(High Templar/Signifier)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(High Templar/Signifier)")] - if ItemNames.SUPPLICANT not in logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ASCENDANT_POWER_OVERWHELMING] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ASCENDANT_POWER_OVERWHELMING] - if not {ItemNames.DARK_ARCHON, ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Dark Archon)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Dark Archon)")] - if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Sentry/Energizer/Havoc)")] - if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC, ItemNames.SHIELD_BATTERY} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc/Shield Battery)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Sentry/Energizer/Havoc/Shield Battery)")] - if not {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Zealot/Sentinel/Centurion)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Zealot/Sentinel/Centurion)")] - # Static defense upgrades only if static defense present - if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE, ItemNames.SHIELD_BATTERY} & logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ENHANCED_TARGETING] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ENHANCED_TARGETING] - if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE} & logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.OPTIMIZED_ORDNANCE] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.OPTIMIZED_ORDNANCE] - - # Cull finished, adding locked items back into inventory - inventory += locked_items - - # Replacing empty space with generically useful items - replacement_items = [item for item in self.item_pool - if (item not in inventory - and item not in self.locked_items - and ( - item.name in second_pass_placeable_items - or item.name in unused_items))] - self.world.random.shuffle(replacement_items) - while len(inventory) < inventory_size and len(replacement_items) > 0: - item = replacement_items.pop() - inventory.append(item) - - return inventory - - def __init__(self, world: World , - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item], - used_races: Set[SC2Race], nova_equipment_used: bool): - self.multiworld = world.multiworld - self.player = world.player - self.world: World = world - self.logical_inventory = list() - self.locked_items = locked_items[:] - self.existing_items = existing_items - soa_presence = get_option_value(world, "spear_of_adun_presence") - soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - # Initial filter of item pool - self.item_pool = [] - item_quantities: dict[str, int] = dict() - # Inventory restrictiveness based on number of missions with checks - mission_count = num_missions(world) - self.min_units_per_structure = int(mission_count / 7) - min_upgrades = 1 if mission_count < 10 else 2 - for item in item_pool: - item_info = get_full_item_list()[item.name] - if item_info.race != SC2Race.ANY and item_info.race not in used_races: - if soa_presence == SpearOfAdunPresence.option_everywhere \ - and item.name in spear_of_adun_calldowns: - # Add SoA powers regardless of used races as it's present everywhere - self.item_pool.append(item) - if soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere \ - and item.name in spear_of_adun_castable_passives: - self.item_pool.append(item) - # Drop any item belonging to a race not used in the campaign - continue - if item.name in nova_equipment and not nova_equipment_used: - # Drop Nova equipment if there's no NCO mission generated - continue - if item_info.type == "Upgrade": - # Locking upgrades based on mission duration - if item.name not in item_quantities: - item_quantities[item.name] = 0 - item_quantities[item.name] += 1 - if item_quantities[item.name] <= min_upgrades: - self.locked_items.append(item) - else: - self.item_pool.append(item) - elif item_info.type == "Goal": - self.locked_items.append(item) - else: - self.item_pool.append(item) - self.item_children: Dict[Item, List[Item]] = dict() - for item in self.item_pool + locked_items + existing_items: - if item.name in UPGRADABLE_ITEMS: - self.item_children[item] = get_item_upgrades(self.item_pool, item) - - -def filter_items(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], location_cache: List[Location], - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item]) -> List[Item]: - """ - Returns a semi-randomly pruned set of items based on number of available locations. - The returned inventory must be capable of logically accessing every location in the world. - """ - open_locations = [location for location in location_cache if location.item is None] - inventory_size = len(open_locations) - used_races = get_used_races(mission_req_table, world) - nova_equipment_used = is_nova_equipment_used(mission_req_table) - mission_requirements = [(location.name, location.access_rule) for location in location_cache] - valid_inventory = ValidInventory(world, item_pool, existing_items, locked_items, used_races, nova_equipment_used) - - valid_items = valid_inventory.generate_reduced_inventory(inventory_size, mission_requirements) - return valid_items - - -def get_used_races(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], world: World) -> Set[SC2Race]: - grant_story_tech = get_option_value(world, "grant_story_tech") - take_over_ai_allies = get_option_value(world, "take_over_ai_allies") - kerrigan_presence = get_option_value(world, "kerrigan_presence") in kerrigan_unit_available \ - and SC2Campaign.HOTS in get_enabled_campaigns(world) - missions = missions_in_mission_table(mission_req_table) - - # By missions - races = set([mission.race for mission in missions]) - - # Conditionally logic-less no-builds (They're set to SC2Race.ANY): - if grant_story_tech == GrantStoryTech.option_false: - if SC2Mission.ENEMY_WITHIN in missions: - # Zerg units need to be unlocked - races.add(SC2Race.ZERG) - if kerrigan_presence \ - and not missions.isdisjoint({SC2Mission.BACK_IN_THE_SADDLE, SC2Mission.SUPREME, SC2Mission.CONVICTION, SC2Mission.THE_INFINITE_CYCLE}): - # You need some Kerrigan abilities (they're granted if Kerriganless or story tech granted) - races.add(SC2Race.ZERG) - - # If you take over the AI Ally, you need to have its race stuff - if take_over_ai_allies == TakeOverAIAllies.option_true \ - and not missions.isdisjoint({SC2Mission.THE_RECKONING}): - # Jimmy in The Reckoning - races.add(SC2Race.TERRAN) - - return races - -def is_nova_equipment_used(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> bool: - missions = missions_in_mission_table(mission_req_table) - return any([mission.campaign == SC2Campaign.NCO for mission in missions]) - - -def missions_in_mission_table(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> Set[SC2Mission]: - return set([mission.mission for campaign_missions in mission_req_table.values() for mission in - campaign_missions.values()]) diff --git a/worlds/sc2/Regions.py b/worlds/sc2/Regions.py deleted file mode 100644 index 273bc4a5..00000000 --- a/worlds/sc2/Regions.py +++ /dev/null @@ -1,691 +0,0 @@ -from typing import List, Dict, Tuple, Optional, Callable, NamedTuple, Union -import math - -from BaseClasses import MultiWorld, Region, Entrance, Location, CollectionState -from .Locations import LocationData -from .Options import get_option_value, MissionOrder, get_enabled_campaigns, campaign_depending_orders, \ - GridTwoStartPositions -from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, \ - MissionPools, SC2Campaign, get_goal_location, SC2Mission, MissionConnection -from .PoolFilter import filter_missions -from worlds.AutoWorld import World - - -class SC2MissionSlot(NamedTuple): - campaign: SC2Campaign - slot: Union[MissionPools, SC2Mission, None] - - -def create_regions( - world: World, locations: Tuple[LocationData, ...], location_cache: List[Location] -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - """ - Creates region connections by calling the multiworld's `connect()` methods - Returns a 3-tuple containing: - * dict[SC2Campaign, Dict[str, MissionInfo]] mapping a campaign and mission name to its data - * int The number of missions in the world - * str The name of the goal location - """ - mission_order_type: int = get_option_value(world, "mission_order") - - if mission_order_type == MissionOrder.option_vanilla: - return create_vanilla_regions(world, locations, location_cache) - elif mission_order_type == MissionOrder.option_grid: - return create_grid_regions(world, locations, location_cache) - else: - return create_structured_regions(world, locations, location_cache, mission_order_type) - -def create_vanilla_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - - mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - enabled_campaigns = get_enabled_campaigns(world) - names: Dict[str, int] = {} - - # Generating all regions and locations for each enabled campaign - for campaign in sorted(enabled_campaigns): - for region_name in vanilla_mission_req_table[campaign].keys(): - regions.append(create_region(world, locations_per_region, location_cache, region_name)) - world.multiworld.regions += regions - vanilla_mission_reqs = {campaign: missions for campaign, missions in vanilla_mission_req_table.items() if campaign in enabled_campaigns} - - def wol_cleared_missions(state: CollectionState, mission_count: int) -> bool: - return state.has_group("WoL Missions", world.player, mission_count) - - player: int = world.player - if SC2Campaign.WOL in enabled_campaigns: - connect(world, names, 'Menu', 'Liberation Day') - connect(world, names, 'Liberation Day', 'The Outlaws', - lambda state: state.has("Beat Liberation Day", player)) - connect(world, names, 'The Outlaws', 'Zero Hour', - lambda state: state.has("Beat The Outlaws", player)) - connect(world, names, 'Zero Hour', 'Evacuation', - lambda state: state.has("Beat Zero Hour", player)) - connect(world, names, 'Evacuation', 'Outbreak', - lambda state: state.has("Beat Evacuation", player)) - connect(world, names, "Outbreak", "Safe Haven", - lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player)) - connect(world, names, "Outbreak", "Haven's Fall", - lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player)) - connect(world, names, 'Zero Hour', 'Smash and Grab', - lambda state: state.has("Beat Zero Hour", player)) - connect(world, names, 'Smash and Grab', 'The Dig', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Smash and Grab", player)) - connect(world, names, 'The Dig', 'The Moebius Factor', - lambda state: wol_cleared_missions(state, 11) and state.has("Beat The Dig", player)) - connect(world, names, 'The Moebius Factor', 'Supernova', - lambda state: wol_cleared_missions(state, 14) and state.has("Beat The Moebius Factor", player)) - connect(world, names, 'Supernova', 'Maw of the Void', - lambda state: state.has("Beat Supernova", player)) - connect(world, names, 'Zero Hour', "Devil's Playground", - lambda state: wol_cleared_missions(state, 4) and state.has("Beat Zero Hour", player)) - connect(world, names, "Devil's Playground", 'Welcome to the Jungle', - lambda state: state.has("Beat Devil's Playground", player)) - connect(world, names, "Welcome to the Jungle", 'Breakout', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player)) - connect(world, names, "Welcome to the Jungle", 'Ghost of a Chance', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player)) - connect(world, names, "Zero Hour", 'The Great Train Robbery', - lambda state: wol_cleared_missions(state, 6) and state.has("Beat Zero Hour", player)) - connect(world, names, 'The Great Train Robbery', 'Cutthroat', - lambda state: state.has("Beat The Great Train Robbery", player)) - connect(world, names, 'Cutthroat', 'Engine of Destruction', - lambda state: state.has("Beat Cutthroat", player)) - connect(world, names, 'Engine of Destruction', 'Media Blitz', - lambda state: state.has("Beat Engine of Destruction", player)) - connect(world, names, 'Media Blitz', 'Piercing the Shroud', - lambda state: state.has("Beat Media Blitz", player)) - connect(world, names, 'Maw of the Void', 'Gates of Hell', - lambda state: state.has("Beat Maw of the Void", player)) - connect(world, names, 'Gates of Hell', 'Belly of the Beast', - lambda state: state.has("Beat Gates of Hell", player)) - connect(world, names, 'Gates of Hell', 'Shatter the Sky', - lambda state: state.has("Beat Gates of Hell", player)) - connect(world, names, 'Gates of Hell', 'All-In', - lambda state: state.has('Beat Gates of Hell', player) and ( - state.has('Beat Shatter the Sky', player) or state.has('Beat Belly of the Beast', player))) - - if SC2Campaign.PROPHECY in enabled_campaigns: - if SC2Campaign.WOL in enabled_campaigns: - connect(world, names, 'The Dig', 'Whispers of Doom', - lambda state: state.has("Beat The Dig", player)), - else: - vanilla_mission_reqs[SC2Campaign.PROPHECY] = vanilla_mission_reqs[SC2Campaign.PROPHECY].copy() - vanilla_mission_reqs[SC2Campaign.PROPHECY][SC2Mission.WHISPERS_OF_DOOM.mission_name] = MissionInfo( - SC2Mission.WHISPERS_OF_DOOM, [], SC2Mission.WHISPERS_OF_DOOM.area) - connect(world, names, 'Menu', 'Whispers of Doom'), - connect(world, names, 'Whispers of Doom', 'A Sinister Turn', - lambda state: state.has("Beat Whispers of Doom", player)) - connect(world, names, 'A Sinister Turn', 'Echoes of the Future', - lambda state: state.has("Beat A Sinister Turn", player)) - connect(world, names, 'Echoes of the Future', 'In Utter Darkness', - lambda state: state.has("Beat Echoes of the Future", player)) - - if SC2Campaign.HOTS in enabled_campaigns: - connect(world, names, 'Menu', 'Lab Rat'), - connect(world, names, 'Lab Rat', 'Back in the Saddle', - lambda state: state.has("Beat Lab Rat", player)), - connect(world, names, 'Back in the Saddle', 'Rendezvous', - lambda state: state.has("Beat Back in the Saddle", player)), - connect(world, names, 'Rendezvous', 'Harvest of Screams', - lambda state: state.has("Beat Rendezvous", player)), - connect(world, names, 'Harvest of Screams', 'Shoot the Messenger', - lambda state: state.has("Beat Harvest of Screams", player)), - connect(world, names, 'Shoot the Messenger', 'Enemy Within', - lambda state: state.has("Beat Shoot the Messenger", player)), - connect(world, names, 'Rendezvous', 'Domination', - lambda state: state.has("Beat Rendezvous", player)), - connect(world, names, 'Domination', 'Fire in the Sky', - lambda state: state.has("Beat Domination", player)), - connect(world, names, 'Fire in the Sky', 'Old Soldiers', - lambda state: state.has("Beat Fire in the Sky", player)), - connect(world, names, 'Old Soldiers', 'Waking the Ancient', - lambda state: state.has("Beat Old Soldiers", player)), - connect(world, names, 'Enemy Within', 'Waking the Ancient', - lambda state: state.has("Beat Enemy Within", player)), - connect(world, names, 'Waking the Ancient', 'The Crucible', - lambda state: state.has("Beat Waking the Ancient", player)), - connect(world, names, 'The Crucible', 'Supreme', - lambda state: state.has("Beat The Crucible", player)), - connect(world, names, 'Supreme', 'Infested', - lambda state: state.has("Beat Supreme", player) and - state.has("Beat Old Soldiers", player) and - state.has("Beat Enemy Within", player)), - connect(world, names, 'Infested', 'Hand of Darkness', - lambda state: state.has("Beat Infested", player)), - connect(world, names, 'Hand of Darkness', 'Phantoms of the Void', - lambda state: state.has("Beat Hand of Darkness", player)), - connect(world, names, 'Supreme', 'With Friends Like These', - lambda state: state.has("Beat Supreme", player) and - state.has("Beat Old Soldiers", player) and - state.has("Beat Enemy Within", player)), - connect(world, names, 'With Friends Like These', 'Conviction', - lambda state: state.has("Beat With Friends Like These", player)), - connect(world, names, 'Conviction', 'Planetfall', - lambda state: state.has("Beat Conviction", player) and - state.has("Beat Phantoms of the Void", player)), - connect(world, names, 'Planetfall', 'Death From Above', - lambda state: state.has("Beat Planetfall", player)), - connect(world, names, 'Death From Above', 'The Reckoning', - lambda state: state.has("Beat Death From Above", player)), - - if SC2Campaign.PROLOGUE in enabled_campaigns: - connect(world, names, "Menu", "Dark Whispers") - connect(world, names, "Dark Whispers", "Ghosts in the Fog", - lambda state: state.has("Beat Dark Whispers", player)) - connect(world, names, "Ghosts in the Fog", "Evil Awoken", - lambda state: state.has("Beat Ghosts in the Fog", player)) - - if SC2Campaign.LOTV in enabled_campaigns: - connect(world, names, "Menu", "For Aiur!") - connect(world, names, "For Aiur!", "The Growing Shadow", - lambda state: state.has("Beat For Aiur!", player)), - connect(world, names, "The Growing Shadow", "The Spear of Adun", - lambda state: state.has("Beat The Growing Shadow", player)), - connect(world, names, "The Spear of Adun", "Sky Shield", - lambda state: state.has("Beat The Spear of Adun", player)), - connect(world, names, "Sky Shield", "Brothers in Arms", - lambda state: state.has("Beat Sky Shield", player)), - connect(world, names, "Brothers in Arms", "Forbidden Weapon", - lambda state: state.has("Beat Brothers in Arms", player)), - connect(world, names, "The Spear of Adun", "Amon's Reach", - lambda state: state.has("Beat The Spear of Adun", player)), - connect(world, names, "Amon's Reach", "Last Stand", - lambda state: state.has("Beat Amon's Reach", player)), - connect(world, names, "Last Stand", "Forbidden Weapon", - lambda state: state.has("Beat Last Stand", player)), - connect(world, names, "Forbidden Weapon", "Temple of Unification", - lambda state: state.has("Beat Brothers in Arms", player) - and state.has("Beat Last Stand", player) - and state.has("Beat Forbidden Weapon", player)), - connect(world, names, "Temple of Unification", "The Infinite Cycle", - lambda state: state.has("Beat Temple of Unification", player)), - connect(world, names, "The Infinite Cycle", "Harbinger of Oblivion", - lambda state: state.has("Beat The Infinite Cycle", player)), - connect(world, names, "Harbinger of Oblivion", "Unsealing the Past", - lambda state: state.has("Beat Harbinger of Oblivion", player)), - connect(world, names, "Unsealing the Past", "Purification", - lambda state: state.has("Beat Unsealing the Past", player)), - connect(world, names, "Purification", "Templar's Charge", - lambda state: state.has("Beat Purification", player)), - connect(world, names, "Harbinger of Oblivion", "Steps of the Rite", - lambda state: state.has("Beat Harbinger of Oblivion", player)), - connect(world, names, "Steps of the Rite", "Rak'Shir", - lambda state: state.has("Beat Steps of the Rite", player)), - connect(world, names, "Rak'Shir", "Templar's Charge", - lambda state: state.has("Beat Rak'Shir", player)), - connect(world, names, "Templar's Charge", "Templar's Return", - lambda state: state.has("Beat Purification", player) - and state.has("Beat Rak'Shir", player) - and state.has("Beat Templar's Charge", player)), - connect(world, names, "Templar's Return", "The Host", - lambda state: state.has("Beat Templar's Return", player)), - connect(world, names, "The Host", "Salvation", - lambda state: state.has("Beat The Host", player)), - - if SC2Campaign.EPILOGUE in enabled_campaigns: - # TODO: Make this aware about excluded campaigns - connect(world, names, "Salvation", "Into the Void", - lambda state: state.has("Beat Salvation", player) - and state.has("Beat The Reckoning", player) - and state.has("Beat All-In", player)), - connect(world, names, "Into the Void", "The Essence of Eternity", - lambda state: state.has("Beat Into the Void", player)), - connect(world, names, "The Essence of Eternity", "Amon's Fall", - lambda state: state.has("Beat The Essence of Eternity", player)), - - if SC2Campaign.NCO in enabled_campaigns: - connect(world, names, "Menu", "The Escape") - connect(world, names, "The Escape", "Sudden Strike", - lambda state: state.has("Beat The Escape", player)) - connect(world, names, "Sudden Strike", "Enemy Intelligence", - lambda state: state.has("Beat Sudden Strike", player)) - connect(world, names, "Enemy Intelligence", "Trouble In Paradise", - lambda state: state.has("Beat Enemy Intelligence", player)) - connect(world, names, "Trouble In Paradise", "Night Terrors", - lambda state: state.has("Beat Trouble In Paradise", player)) - connect(world, names, "Night Terrors", "Flashpoint", - lambda state: state.has("Beat Night Terrors", player)) - connect(world, names, "Flashpoint", "In the Enemy's Shadow", - lambda state: state.has("Beat Flashpoint", player)) - connect(world, names, "In the Enemy's Shadow", "Dark Skies", - lambda state: state.has("Beat In the Enemy's Shadow", player)) - connect(world, names, "Dark Skies", "End Game", - lambda state: state.has("Beat Dark Skies", player)) - - goal_location = get_goal_location(final_mission) - assert goal_location, f"Unable to find a goal location for mission {final_mission}" - setup_final_location(goal_location, location_cache) - - return (vanilla_mission_reqs, final_mission.id, goal_location) - - -def create_grid_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - - mission_pools = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool] - - num_missions = min(len(mission_pool), get_option_value(world, "maximum_campaign_size")) - remove_top_left: bool = get_option_value(world, "grid_two_start_positions") == GridTwoStartPositions.option_true - - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - names: Dict[str, int] = {} - missions: Dict[Tuple[int, int], SC2Mission] = {} - - grid_size_x, grid_size_y, num_corners_to_remove = get_grid_dimensions(num_missions + remove_top_left) - # pick missions in order along concentric diagonals - # each diagonal will have the same difficulty - # this keeps long sides from possibly stealing lower-difficulty missions from future columns - num_diagonals = grid_size_x + grid_size_y - 1 - diagonal_difficulty = MissionPools.STARTER - missions_to_add = mission_pools[MissionPools.STARTER] - for diagonal in range(num_diagonals): - if diagonal == num_diagonals - 1: - diagonal_difficulty = MissionPools.FINAL - grid_coords = (grid_size_x-1, grid_size_y-1) - missions[grid_coords] = final_mission - break - if diagonal == 0 and remove_top_left: - continue - diagonal_length = min(diagonal + 1, num_diagonals - diagonal, grid_size_x, grid_size_y) - if len(missions_to_add) < diagonal_length: - raise Exception(f"There are not enough {diagonal_difficulty.name} missions to fill the campaign. Please exclude fewer missions.") - for i in range(diagonal_length): - # (0,0) + (0,1)*diagonal + (1,-1)*i + (1,-1)*max(diagonal - grid_size_y + 1, 0) - grid_coords = (i + max(diagonal - grid_size_y + 1, 0), diagonal - i - max(diagonal - grid_size_y + 1, 0)) - if grid_coords == (grid_size_x - 1, 0) and num_corners_to_remove >= 2: - pass - elif grid_coords == (0, grid_size_y - 1) and num_corners_to_remove >= 1: - pass - else: - mission_index = world.random.randint(0, len(missions_to_add) - 1) - missions[grid_coords] = missions_to_add.pop(mission_index) - - if diagonal_difficulty < MissionPools.VERY_HARD: - diagonal_difficulty = MissionPools(diagonal_difficulty.value + 1) - missions_to_add.extend(mission_pools[diagonal_difficulty]) - - # Generating regions and locations from selected missions - for x in range(grid_size_x): - for y in range(grid_size_y): - if missions.get((x, y)): - regions.append(create_region(world, locations_per_region, location_cache, missions[(x, y)].mission_name)) - world.multiworld.regions += regions - - # This pattern is horrifying, why are we using the dict as an ordered dict??? - slot_map: Dict[Tuple[int, int], int] = {} - for index, coords in enumerate(missions): - slot_map[coords] = index + 1 - - mission_req_table: Dict[str, MissionInfo] = {} - for coords, mission in missions.items(): - prepend_vertical = 0 - if not mission: - continue - connections: List[MissionConnection] = [] - if coords == (0, 0) or (remove_top_left and sum(coords) == 1): - # Connect to the "Menu" starting region - connect(world, names, "Menu", mission.mission_name) - else: - for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): - connected_coords = (coords[0] + dx, coords[1] + dy) - if connected_coords in missions: - # connections.append(missions[connected_coords]) - connections.append(MissionConnection(slot_map[connected_coords])) - connect(world, names, missions[connected_coords].mission_name, mission.mission_name, - make_grid_connect_rule(missions, connected_coords, world.player), - ) - if coords[1] == 1 and not missions.get((coords[0], 0)): - prepend_vertical = 1 - mission_req_table[mission.mission_name] = MissionInfo( - mission, - connections, - category=f'_{coords[0] + 1}', - or_requirements=True, - ui_vertical_padding=prepend_vertical, - ) - - final_mission_id = final_mission.id - # Changing the completion condition for alternate final missions into an event - final_location = get_goal_location(final_mission) - setup_final_location(final_location, location_cache) - - return {SC2Campaign.GLOBAL: mission_req_table}, final_mission_id, final_location - - -def make_grid_connect_rule( - missions: Dict[Tuple[int, int], SC2Mission], - connected_coords: Tuple[int, int], - player: int -) -> Callable[[CollectionState], bool]: - return lambda state: state.has(f"Beat {missions[connected_coords].mission_name}", player) - - -def create_structured_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], - mission_order_type: int, -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - - mission_order = mission_orders[mission_order_type]() - enabled_campaigns = get_enabled_campaigns(world) - shuffle_campaigns = get_option_value(world, "shuffle_campaigns") - - mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - - names: Dict[str, int] = {} - - mission_slots: List[SC2MissionSlot] = [] - mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool] - - if mission_order_type in campaign_depending_orders: - # Do slot removal per campaign - for campaign in enabled_campaigns: - campaign_mission_pool = [mission for mission in mission_pool if mission.campaign == campaign] - campaign_mission_pool_size = len(campaign_mission_pool) - - removals = len(mission_order[campaign]) - campaign_mission_pool_size - - for mission in mission_order[campaign]: - # Removing extra missions if mission pool is too small - if 0 < mission.removal_priority <= removals: - mission_slots.append(SC2MissionSlot(campaign, None)) - elif mission.type == MissionPools.FINAL: - if campaign == final_mission.campaign: - # Campaign is elected to be goal - mission_slots.append(SC2MissionSlot(campaign, final_mission)) - else: - # Not the goal, find the most difficult mission in the pool and set the difficulty - campaign_difficulty = max(mission.pool for mission in campaign_mission_pool) - mission_slots.append(SC2MissionSlot(campaign, campaign_difficulty)) - else: - mission_slots.append(SC2MissionSlot(campaign, mission.type)) - else: - order = mission_order[SC2Campaign.GLOBAL] - # Determining if missions must be removed - mission_pool_size = sum(len(mission_pool) for mission_pool in mission_pools.values()) - removals = len(order) - mission_pool_size - - # Initial fill out of mission list and marking All-In mission - for mission in order: - # Removing extra missions if mission pool is too small - if 0 < mission.removal_priority <= removals: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, None)) - elif mission.type == MissionPools.FINAL: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, final_mission)) - else: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, mission.type)) - - no_build_slots = [] - easy_slots = [] - medium_slots = [] - hard_slots = [] - very_hard_slots = [] - - # Search through missions to find slots needed to fill - for i in range(len(mission_slots)): - mission_slot = mission_slots[i] - if mission_slot is None: - continue - if isinstance(mission_slot, SC2MissionSlot): - if mission_slot.slot is None: - continue - if mission_slot.slot == MissionPools.STARTER: - no_build_slots.append(i) - elif mission_slot.slot == MissionPools.EASY: - easy_slots.append(i) - elif mission_slot.slot == MissionPools.MEDIUM: - medium_slots.append(i) - elif mission_slot.slot == MissionPools.HARD: - hard_slots.append(i) - elif mission_slot.slot == MissionPools.VERY_HARD: - very_hard_slots.append(i) - - def pick_mission(slot): - if shuffle_campaigns or mission_order_type not in campaign_depending_orders: - # Pick a mission from any campaign - filler = world.random.randint(0, len(missions_to_add) - 1) - mission = missions_to_add.pop(filler) - slot_campaign = mission_slots[slot].campaign - mission_slots[slot] = SC2MissionSlot(slot_campaign, mission) - else: - # Pick a mission from required campaign - slot_campaign = mission_slots[slot].campaign - campaign_mission_candidates = [mission for mission in missions_to_add if mission.campaign == slot_campaign] - mission = world.random.choice(campaign_mission_candidates) - missions_to_add.remove(mission) - mission_slots[slot] = SC2MissionSlot(slot_campaign, mission) - - # Add no_build missions to the pool and fill in no_build slots - missions_to_add: List[SC2Mission] = mission_pools[MissionPools.STARTER] - if len(no_build_slots) > len(missions_to_add): - raise Exception("There are no valid No-Build missions. Please exclude fewer missions.") - for slot in no_build_slots: - pick_mission(slot) - - # Add easy missions into pool and fill in easy slots - missions_to_add = missions_to_add + mission_pools[MissionPools.EASY] - if len(easy_slots) > len(missions_to_add): - raise Exception("There are not enough Easy missions to fill the campaign. Please exclude fewer missions.") - for slot in easy_slots: - pick_mission(slot) - - # Add medium missions into pool and fill in medium slots - missions_to_add = missions_to_add + mission_pools[MissionPools.MEDIUM] - if len(medium_slots) > len(missions_to_add): - raise Exception("There are not enough Easy and Medium missions to fill the campaign. Please exclude fewer missions.") - for slot in medium_slots: - pick_mission(slot) - - # Add hard missions into pool and fill in hard slots - missions_to_add = missions_to_add + mission_pools[MissionPools.HARD] - if len(hard_slots) > len(missions_to_add): - raise Exception("There are not enough missions to fill the campaign. Please exclude fewer missions.") - for slot in hard_slots: - pick_mission(slot) - - # Add very hard missions into pool and fill in very hard slots - missions_to_add = missions_to_add + mission_pools[MissionPools.VERY_HARD] - if len(very_hard_slots) > len(missions_to_add): - raise Exception("There are not enough missions to fill the campaign. Please exclude fewer missions.") - for slot in very_hard_slots: - pick_mission(slot) - - # Generating regions and locations from selected missions - for mission_slot in mission_slots: - if isinstance(mission_slot.slot, SC2Mission): - regions.append(create_region(world, locations_per_region, location_cache, mission_slot.slot.mission_name)) - world.multiworld.regions += regions - - campaigns: List[SC2Campaign] - if mission_order_type in campaign_depending_orders: - campaigns = list(enabled_campaigns) - else: - campaigns = [SC2Campaign.GLOBAL] - - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {} - campaign_mission_slots: Dict[SC2Campaign, List[SC2MissionSlot]] = \ - { - campaign: [mission_slot for mission_slot in mission_slots if campaign == mission_slot.campaign] - for campaign in campaigns - } - - slot_map: Dict[SC2Campaign, List[int]] = dict() - - for campaign in campaigns: - mission_req_table.update({campaign: dict()}) - - # Mapping original mission slots to shifted mission slots when missions are removed - slot_map[campaign] = [] - slot_offset = 0 - for position, mission in enumerate(campaign_mission_slots[campaign]): - slot_map[campaign].append(position - slot_offset + 1) - if mission is None or mission.slot is None: - slot_offset += 1 - - def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable: - player = world.player - if len(mission_names) > 1: - return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) \ - and state.has_group("Missions", player, missions_req) - else: - return lambda state: state.has(f"Beat {mission_names[0]}", player) \ - and state.has_group("Missions", player, missions_req) - - for campaign in campaigns: - # Loop through missions to create requirements table and connect regions - for i, mission in enumerate(campaign_mission_slots[campaign]): - if mission is None or mission.slot is None: - continue - connections: List[MissionConnection] = [] - all_connections: List[SC2MissionSlot] = [] - connection: MissionConnection - for connection in mission_order[campaign][i].connect_to: - if connection.connect_to == -1: - continue - # If mission normally connects to an excluded campaign, connect to menu instead - if connection.campaign not in campaign_mission_slots: - connection.connect_to = -1 - continue - while campaign_mission_slots[connection.campaign][connection.connect_to].slot is None: - connection.connect_to -= 1 - all_connections.append(campaign_mission_slots[connection.campaign][connection.connect_to]) - for connection in mission_order[campaign][i].connect_to: - if connection.connect_to == -1: - connect(world, names, "Menu", mission.slot.mission_name) - else: - required_mission = campaign_mission_slots[connection.campaign][connection.connect_to] - if ((required_mission is None or required_mission.slot is None) - and not mission_order[campaign][i].completion_critical): # Drop non-critical null slots - continue - while required_mission is None or required_mission.slot is None: # Substituting null slot with prior slot - connection.connect_to -= 1 - required_mission = campaign_mission_slots[connection.campaign][connection.connect_to] - required_missions = [required_mission] if mission_order[campaign][i].or_requirements else all_connections - if isinstance(required_mission.slot, SC2Mission): - required_mission_name = required_mission.slot.mission_name - required_missions_names = [mission.slot.mission_name for mission in required_missions] - connect(world, names, required_mission_name, mission.slot.mission_name, - build_connection_rule(required_missions_names, mission_order[campaign][i].number)) - connections.append(MissionConnection(slot_map[connection.campaign][connection.connect_to], connection.campaign)) - - mission_req_table[campaign].update({mission.slot.mission_name: MissionInfo( - mission.slot, connections, mission_order[campaign][i].category, - number=mission_order[campaign][i].number, - completion_critical=mission_order[campaign][i].completion_critical, - or_requirements=mission_order[campaign][i].or_requirements)}) - - final_mission_id = final_mission.id - # Changing the completion condition for alternate final missions into an event - final_location = get_goal_location(final_mission) - setup_final_location(final_location, location_cache) - - return mission_req_table, final_mission_id, final_location - - -def setup_final_location(final_location, location_cache): - # Final location should be near the end of the cache - for i in range(len(location_cache) - 1, -1, -1): - if location_cache[i].name == final_location: - location_cache[i].address = None - break - - -def create_location(player: int, location_data: LocationData, region: Region, - location_cache: List[Location]) -> Location: - location = Location(player, location_data.name, location_data.code, region) - location.access_rule = location_data.rule - - location_cache.append(location) - - return location - - -def create_region(world: World, locations_per_region: Dict[str, List[LocationData]], - location_cache: List[Location], name: str) -> Region: - region = Region(name, world.player, world.multiworld) - - if name in locations_per_region: - for location_data in locations_per_region[name]: - location = create_location(world.player, location_data, region, location_cache) - region.locations.append(location) - - return region - - -def connect(world: World, used_names: Dict[str, int], source: str, target: str, - rule: Optional[Callable] = None): - source_region = world.get_region(source) - target_region = world.get_region(target) - - if target not in used_names: - used_names[target] = 1 - name = target - else: - used_names[target] += 1 - name = target + (' ' * used_names[target]) - - connection = Entrance(world.player, name, source_region) - - if rule: - connection.access_rule = rule - - source_region.exits.append(connection) - connection.connect(target_region) - - -def get_locations_per_region(locations: Tuple[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 - - -def get_factors(number: int) -> Tuple[int, int]: - """ - Simple factorization into pairs of numbers (x, y) using a sieve method. - Returns the factorization that is most square, i.e. where x + y is minimized. - Factor order is such that x <= y. - """ - assert number > 0 - for divisor in range(math.floor(math.sqrt(number)), 1, -1): - quotient = number // divisor - if quotient * divisor == number: - return divisor, quotient - return 1, number - - -def get_grid_dimensions(size: int) -> Tuple[int, int, int]: - """ - Get the dimensions of a grid mission order from the number of missions, int the format (x, y, error). - * Error will always be 0, 1, or 2, so the missions can be removed from the corners that aren't the start or end. - * Dimensions are chosen such that x <= y, as buttons in the UI are wider than they are tall. - * Dimensions are chosen to be maximally square. That is, x + y + error is minimized. - * If multiple options of the same rating are possible, the one with the larger error is chosen, - as it will appear more square. Compare 3x11 to 5x7-2 for an example of this. - """ - dimension_candidates: List[Tuple[int, int, int]] = [(*get_factors(size + x), x) for x in (2, 1, 0)] - best_dimension = min(dimension_candidates, key=sum) - return best_dimension - diff --git a/worlds/sc2/Rules.py b/worlds/sc2/Rules.py deleted file mode 100644 index 8b9097ea..00000000 --- a/worlds/sc2/Rules.py +++ /dev/null @@ -1,952 +0,0 @@ -from typing import Set - -from BaseClasses import CollectionState -from .Options import get_option_value, RequiredTactics, kerrigan_unit_available, AllInMap, \ - GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, SpearOfAdunAutonomouslyCastAbilityPresence, \ - get_enabled_campaigns, MissionOrder -from .Items import get_basic_units, defense_ratings, zerg_defense_ratings, kerrigan_actives, air_defense_ratings, \ - kerrigan_levels, get_full_item_list -from .MissionTables import SC2Race, SC2Campaign -from . import ItemNames -from worlds.AutoWorld import World - - -class SC2Logic: - - def lock_any_item(self, state: CollectionState, items: Set[str]) -> bool: - """ - Guarantees that at least one of these items will remain in the world. Doesn't affect placement. - Needed for cases when the dynamic pool filtering could remove all the item prerequisites - :param state: - :param items: - :return: - """ - return self.is_item_placement(state) \ - or state.has_any(items, self.player) - - def is_item_placement(self, state): - """ - Tells if it's item placement or item pool filter - :param state: - :return: True for item placement, False for pool filter - """ - # has_group with count = 0 is always true for item placement and always false for SC2 item filtering - return state.has_group("Missions", self.player, 0) - - # WoL - def terran_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_terran_units, self.player) - - def terran_early_tech(self, state: CollectionState): - """ - Basic combat unit that can be deployed quickly from mission start - :param state - :return: - """ - return ( - state.has_any({ItemNames.MARINE, ItemNames.FIREBAT, ItemNames.MARAUDER, ItemNames.REAPER, ItemNames.HELLION}, self.player) - or (self.advanced_tactics and state.has_any({ItemNames.GOLIATH, ItemNames.DIAMONDBACK, ItemNames.VIKING, ItemNames.BANSHEE}, self.player)) - ) - - def terran_air(self, state: CollectionState) -> bool: - """ - Air units or drops on advanced tactics - :param state: - :return: - """ - return (state.has_any({ItemNames.VIKING, ItemNames.WRAITH, ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player) or self.advanced_tactics - and state.has_any({ItemNames.HERCULES, ItemNames.MEDIVAC}, self.player) and self.terran_common_unit(state) - ) - - def terran_air_anti_air(self, state: CollectionState) -> bool: - """ - Air-to-air - :param state: - :return: - """ - return ( - state.has(ItemNames.VIKING, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) - or self.advanced_tactics and state.has_any({ItemNames.WRAITH, ItemNames.VALKYRIE, ItemNames.BATTLECRUISER}, self.player) - ) - - def terran_competent_ground_to_air(self, state: CollectionState) -> bool: - """ - Ground-to-air - :param state: - :return: - """ - return ( - state.has(ItemNames.GOLIATH, self.player) - or state.has(ItemNames.MARINE, self.player) and self.terran_bio_heal(state) - or self.advanced_tactics and state.has(ItemNames.CYCLONE, self.player) - ) - - def terran_competent_anti_air(self, state: CollectionState) -> bool: - """ - Good AA unit - :param state: - :return: - """ - return ( - self.terran_competent_ground_to_air(state) - or self.terran_air_anti_air(state) - ) - - def welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: - """ - Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers - :param state: - :return: - """ - return ( - self.terran_common_unit(state) - and self.terran_competent_ground_to_air(state) - ) or ( - self.advanced_tactics - and state.has_any({ItemNames.MARINE, ItemNames.VULTURE}, self.player) - and self.terran_air_anti_air(state) - ) - - def terran_basic_anti_air(self, state: CollectionState) -> bool: - """ - Basic AA to deal with few air units - :param state: - :return: - """ - return ( - state.has_any({ - ItemNames.MISSILE_TURRET, ItemNames.THOR, ItemNames.WAR_PIGS, ItemNames.SPARTAN_COMPANY, - ItemNames.HELS_ANGELS, ItemNames.BATTLECRUISER, ItemNames.MARINE, ItemNames.WRAITH, - ItemNames.VALKYRIE, ItemNames.CYCLONE, ItemNames.WINGED_NIGHTMARES, ItemNames.BRYNHILDS - }, self.player) - or self.terran_competent_anti_air(state) - or self.advanced_tactics and state.has_any({ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.WIDOW_MINE, ItemNames.LIBERATOR}, self.player) - ) - - def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: - """ - Ability to handle defensive missions - :param state: - :param zerg_enemy: - :param air_enemy: - :return: - """ - defense_score = sum((defense_ratings[item] for item in defense_ratings if state.has(item, self.player))) - # Manned Bunker - if state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and state.has(ItemNames.BUNKER, self.player): - defense_score += 3 - elif zerg_enemy and state.has(ItemNames.FIREBAT, self.player) and state.has(ItemNames.BUNKER, self.player): - defense_score += 2 - # Siege Tank upgrades - if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS}, self.player): - defense_score += 2 - if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_GRADUATING_RANGE}, self.player): - defense_score += 1 - # Widow Mine upgrade - if state.has_all({ItemNames.WIDOW_MINE, ItemNames.WIDOW_MINE_CONCEALMENT}, self.player): - defense_score += 1 - # Viking with splash - if state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player): - defense_score += 2 - - # General enemy-based rules - if zerg_enemy: - defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if state.has(item, self.player))) - if air_enemy: - defense_score += sum((air_defense_ratings[item] for item in air_defense_ratings if state.has(item, self.player))) - if air_enemy and zerg_enemy and state.has(ItemNames.VALKYRIE, self.player): - # Valkyries shred mass Mutas, most common air enemy that's massed in these cases - defense_score += 2 - # Advanced Tactics bumps defense rating requirements down by 2 - if self.advanced_tactics: - defense_score += 2 - return defense_score - - def terran_competent_comp(self, state: CollectionState) -> bool: - """ - Ability to deal with most of hard missions - :param state: - :return: - """ - return ( - ( - (state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and self.terran_bio_heal(state)) - or state.has_any({ItemNames.THOR, ItemNames.BANSHEE, ItemNames.SIEGE_TANK}, self.player) - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) - ) - and self.terran_competent_anti_air(state) - ) or ( - state.has(ItemNames.BATTLECRUISER, self.player) and self.terran_common_unit(state) - ) - - def great_train_robbery_train_stopper(self, state: CollectionState) -> bool: - """ - Ability to deal with trains (moving target with a lot of HP) - :param state: - :return: - """ - return ( - state.has_any({ItemNames.SIEGE_TANK, ItemNames.DIAMONDBACK, ItemNames.MARAUDER, ItemNames.CYCLONE, ItemNames.BANSHEE}, self.player) - or self.advanced_tactics - and ( - state.has_all({ItemNames.REAPER, ItemNames.REAPER_G4_CLUSTERBOMB}, self.player) - or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player) - or state.has_any({ItemNames.VULTURE, ItemNames.LIBERATOR}, self.player) - ) - ) - - def terran_can_rescue(self, state) -> bool: - """ - Rescuing in The Moebius Factor - :param state: - :return: - """ - return state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES, ItemNames.RAVEN, ItemNames.VIKING}, self.player) or self.advanced_tactics - - def terran_beats_protoss_deathball(self, state: CollectionState) -> bool: - """ - Ability to deal with Immortals, Colossi with some air support - :param state: - :return: - """ - return ( - ( - state.has_any({ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player) - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) - ) and self.terran_competent_anti_air(state) - or self.terran_competent_comp(state) and self.terran_air_anti_air(state) - ) - - def marine_medic_upgrade(self, state: CollectionState) -> bool: - """ - Infantry upgrade to infantry-only no-build segments - :param state: - :return: - """ - return state.has_any({ - ItemNames.MARINE_COMBAT_SHIELD, ItemNames.MARINE_MAGRAIL_MUNITIONS, ItemNames.MEDIC_STABILIZER_MEDPACKS - }, self.player) \ - or (state.count(ItemNames.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2 - and state.has_group("Missions", self.player, 1)) - - def terran_survives_rip_field(self, state: CollectionState) -> bool: - """ - Ability to deal with large areas with environment damage - :param state: - :return: - """ - return (state.has(ItemNames.BATTLECRUISER, self.player) - or self.terran_air(state) and self.terran_competent_anti_air(state) and self.terran_sustainable_mech_heal(state)) - - def terran_sustainable_mech_heal(self, state: CollectionState) -> bool: - """ - Can heal mech units without spending resources - :param state: - :return: - """ - return state.has(ItemNames.SCIENCE_VESSEL, self.player) \ - or state.has_all({ItemNames.MEDIC, ItemNames.MEDIC_ADAPTIVE_MEDPACKS}, self.player) \ - or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 \ - or (self.advanced_tactics - and ( - state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) - or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2) - ) - - def terran_bio_heal(self, state: CollectionState) -> bool: - """ - Ability to heal bio units - :param state: - :return: - """ - return state.has_any({ItemNames.MEDIC, ItemNames.MEDIVAC}, self.player) \ - or self.advanced_tactics and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) - - def terran_base_trasher(self, state: CollectionState) -> bool: - """ - Can attack heavily defended bases - :param state: - :return: - """ - return state.has(ItemNames.SIEGE_TANK, self.player) \ - or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) \ - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) \ - or (self.advanced_tactics - and ((state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) - or self.can_nuke(state)) - and ( - state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player) - or state.has_all({ItemNames.BANSHEE, ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY}, self.player)) - ) - ) - - def terran_mobile_detector(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.RAVEN, ItemNames.SCIENCE_VESSEL, ItemNames.PROGRESSIVE_ORBITAL_COMMAND}, self.player) - - def can_nuke(self, state: CollectionState) -> bool: - """ - Ability to launch nukes - :param state: - :return: - """ - return (self.advanced_tactics - and (state.has_any({ItemNames.GHOST, ItemNames.SPECTRE}, self.player) - or state.has_all({ItemNames.THOR, ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT}, self.player))) - - def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool: - """ - Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission - :param state: - :return: - """ - return ( - self.terran_common_unit(state) - and self.terran_competent_anti_air(state) - and ( - self.terran_air_anti_air(state) - or state.has_any({ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player) - ) - and self.terran_defense_rating(state, True) >= 3 - ) - - def engine_of_destruction_requirement(self, state: CollectionState): - return self.marine_medic_upgrade(state) \ - and ( - self.terran_competent_anti_air(state) - and self.terran_common_unit(state) or state.has(ItemNames.WRAITH, self.player) - ) - - def all_in_requirement(self, state: CollectionState): - """ - All-in - :param state: - :return: - """ - beats_kerrigan = state.has_any({ItemNames.MARINE, ItemNames.BANSHEE, ItemNames.GHOST}, self.player) or self.advanced_tactics - if get_option_value(self.world, 'all_in_map') == AllInMap.option_ground: - # Ground - defense_rating = self.terran_defense_rating(state, True, False) - if state.has_any({ItemNames.BATTLECRUISER, ItemNames.BANSHEE}, self.player): - defense_rating += 2 - return defense_rating >= 13 and beats_kerrigan - else: - # Air - defense_rating = self.terran_defense_rating(state, True, True) - return defense_rating >= 9 and beats_kerrigan \ - and state.has_any({ItemNames.VIKING, ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player) \ - and state.has_any({ItemNames.HIVE_MIND_EMULATOR, ItemNames.PSI_DISRUPTER, ItemNames.MISSILE_TURRET}, self.player) - - # HotS - def zerg_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_zerg_units, self.player) - - def zerg_competent_anti_air(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.HYDRALISK, ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.BROOD_QUEEN}, self.player) \ - or state.has_all({ItemNames.SWARM_HOST, ItemNames.SWARM_HOST_PRESSURIZED_GLANDS}, self.player) \ - or state.has_all({ItemNames.SCOURGE, ItemNames.SCOURGE_RESOURCE_EFFICIENCY}, self.player) \ - or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player)) - - def zerg_basic_anti_air(self, state: CollectionState) -> bool: - return self.zerg_competent_anti_air(state) or self.kerrigan_unit_available in kerrigan_unit_available or \ - state.has_any({ItemNames.SWARM_QUEEN, ItemNames.SCOURGE}, self.player) or (self.advanced_tactics and state.has(ItemNames.SPORE_CRAWLER, self.player)) - - def morph_brood_lord(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \ - and state.has(ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, self.player) - - def morph_viper(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \ - and state.has(ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, self.player) - - def morph_impaler_or_lurker(self, state: CollectionState) -> bool: - return state.has(ItemNames.HYDRALISK, self.player) and state.has_any({ItemNames.HYDRALISK_IMPALER_ASPECT, ItemNames.HYDRALISK_LURKER_ASPECT}, self.player) - - def zerg_competent_comp(self, state: CollectionState) -> bool: - advanced = self.advanced_tactics - core_unit = state.has_any({ItemNames.ROACH, ItemNames.ABERRATION, ItemNames.ZERGLING}, self.player) - support_unit = state.has_any({ItemNames.SWARM_QUEEN, ItemNames.HYDRALISK}, self.player) \ - or self.morph_brood_lord(state) \ - or advanced and (state.has_any({ItemNames.INFESTOR, ItemNames.DEFILER}, self.player) or self.morph_viper(state)) - if core_unit and support_unit: - return True - vespene_unit = state.has_any({ItemNames.ULTRALISK, ItemNames.ABERRATION}, self.player) \ - or advanced and self.morph_viper(state) - return vespene_unit and state.has_any({ItemNames.ZERGLING, ItemNames.SWARM_QUEEN}, self.player) - - def spread_creep(self, state: CollectionState) -> bool: - return self.advanced_tactics or state.has(ItemNames.SWARM_QUEEN, self.player) - - def zerg_competent_defense(self, state: CollectionState) -> bool: - return ( - self.zerg_common_unit(state) - and ( - ( - state.has(ItemNames.SWARM_HOST, self.player) - or self.morph_brood_lord(state) - or self.morph_impaler_or_lurker(state) - ) or ( - self.advanced_tactics - and (self.morph_viper(state) - or state.has(ItemNames.SPINE_CRAWLER, self.player)) - ) - ) - ) - - def basic_kerrigan(self, state: CollectionState) -> bool: - # One active ability that can be used to defeat enemies directly on Standard - if not self.advanced_tactics and \ - not state.has_any({ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE, - ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT, - ItemNames.KERRIGAN_SPAWN_BANELINGS}, self.player): - return False - # Two non-ultimate abilities - count = 0 - for item in (ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_HEROIC_FORTITUDE, - ItemNames.KERRIGAN_CHAIN_REACTION, ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT, - ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY): - if state.has(item, self.player): - count += 1 - if count >= 2: - return True - return False - - def two_kerrigan_actives(self, state: CollectionState) -> bool: - count = 0 - for i in range(7): - if state.has_any(kerrigan_actives[i], self.player): - count += 1 - return count >= 2 - - def zerg_pass_vents(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or state.has_any({ItemNames.ZERGLING, ItemNames.HYDRALISK, ItemNames.ROACH}, self.player) \ - or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player)) - - def supreme_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or not self.kerrigan_unit_available \ - or ( - state.has_all({ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_MEND}, self.player) - and self.kerrigan_levels(state, 35) - ) - - def kerrigan_levels(self, state: CollectionState, target: int) -> bool: - if self.story_levels_granted or not self.kerrigan_unit_available: - return True # Levels are granted - if self.kerrigan_levels_per_mission_completed > 0 \ - and self.kerrigan_levels_per_mission_completed_cap > 0 \ - and not self.is_item_placement(state): - # Levels can be granted from mission completion. - # Item pool filtering isn't aware of missions beaten. Assume that missions beaten will fulfill this rule. - return True - # Levels from missions beaten - levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player) - if self.kerrigan_levels_per_mission_completed_cap != -1: - levels = min(levels, self.kerrigan_levels_per_mission_completed_cap) - # Levels from items - for kerrigan_level_item in kerrigan_levels: - level_amount = get_full_item_list()[kerrigan_level_item].number - item_count = state.count(kerrigan_level_item, self.player) - levels += item_count * level_amount - # Total level cap - if self.kerrigan_total_level_cap != -1: - levels = min(levels, self.kerrigan_total_level_cap) - - return levels >= target - - - def the_reckoning_requirement(self, state: CollectionState) -> bool: - if self.take_over_ai_allies: - return self.terran_competent_comp(state) \ - and self.zerg_competent_comp(state) \ - and (self.zerg_competent_anti_air(state) - or self.terran_competent_anti_air(state)) - else: - return self.zerg_competent_comp(state) \ - and self.zerg_competent_anti_air(state) - - # LotV - - def protoss_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_protoss_units, self.player) - - def protoss_basic_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER, ItemNames.SCOUT, - ItemNames.DARK_ARCHON, ItemNames.WRATHWALKER, ItemNames.MOTHERSHIP}, self.player) \ - or state.has_all({ItemNames.WARP_PRISM, ItemNames.WARP_PRISM_PHASE_BLASTER}, self.player) \ - or self.advanced_tactics and state.has_any( - {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR, - ItemNames.SENTRY, ItemNames.ENERGIZER}, self.player) - - def protoss_anti_armor_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player) \ - or (state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player)) - - def protoss_anti_light_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player) - - def protoss_competent_anti_air(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.STALKER, ItemNames.SLAYER, ItemNames.INSTIGATOR, ItemNames.DRAGOON, ItemNames.ADEPT, - ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.TEMPEST}, self.player) \ - or (state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player) - and state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player)) \ - or (self.advanced_tactics - and state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player)) - - def protoss_has_blink(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player) \ - or ( - state.has(ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) - and state.has_any({ItemNames.DARK_TEMPLAR, ItemNames.BLOOD_HUNTER, ItemNames.AVENGER}, self.player) - ) - - def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.SCOUT, ItemNames.TEMPEST, - ItemNames.CARRIER, ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.MOTHERSHIP}, self.player) \ - or self.protoss_has_blink(state) \ - or (state.has(ItemNames.WARP_PRISM, self.player) - and (self.protoss_common_unit(state) or state.has(ItemNames.WARP_PRISM_PHASE_BLASTER, self.player))) \ - or (self.advanced_tactics - and state.has_any({ItemNames.ORACLE, ItemNames.ARBITER}, self.player)) - - def protoss_fleet(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.CARRIER, ItemNames.TEMPEST, ItemNames.VOID_RAY, ItemNames.DESTROYER}, self.player) - - def templars_return_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or ( - state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has_any({ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.REAVER, ItemNames.DARK_TEMPLAR}, self.player) - and state.has_any({ItemNames.SENTRY, ItemNames.HIGH_TEMPLAR}, self.player) - ) - - def brothers_in_arms_requirement(self, state: CollectionState) -> bool: - return ( - self.protoss_common_unit(state) - and self.protoss_anti_armor_anti_air(state) - and self.protoss_hybrid_counter(state) - ) or ( - self.take_over_ai_allies - and ( - self.terran_common_unit(state) - or self.protoss_common_unit(state) - ) - and ( - self.terran_competent_anti_air(state) - or self.protoss_anti_armor_anti_air(state) - ) - and ( - self.protoss_hybrid_counter(state) - or state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.SIEGE_TANK}, self.player) - or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player) - or (state.has(ItemNames.IMMORTAL, self.player) - and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) - and self.terran_bio_heal(state)) - ) - ) - - def protoss_hybrid_counter(self, state: CollectionState) -> bool: - """ - Ground Hybrids - """ - return state.has_any( - {ItemNames.ANNIHILATOR, ItemNames.ASCENDANT, ItemNames.TEMPEST, ItemNames.CARRIER, ItemNames.VOID_RAY, - ItemNames.WRATHWALKER, ItemNames.VANGUARD}, self.player) \ - or (state.has(ItemNames.IMMORTAL, self.player) or self.advanced_tactics) and state.has_any( - {ItemNames.STALKER, ItemNames.DRAGOON, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player) - - def the_infinite_cycle_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or not self.kerrigan_unit_available \ - or ( - self.two_kerrigan_actives(state) - and self.basic_kerrigan(state) - and self.kerrigan_levels(state, 70) - ) - - def protoss_basic_splash(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.ZEALOT, ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, - ItemNames.DARK_TEMPLAR, ItemNames.REAVER, ItemNames.ASCENDANT}, self.player) - - def protoss_static_defense(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH}, self.player) - - def last_stand_requirement(self, state: CollectionState) -> bool: - return self.protoss_common_unit(state) \ - and self.protoss_competent_anti_air(state) \ - and self.protoss_static_defense(state) \ - and ( - self.advanced_tactics - or self.protoss_basic_splash(state) - ) - - def harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: - return self.protoss_anti_armor_anti_air(state) and ( - self.take_over_ai_allies - or ( - self.protoss_common_unit(state) - and self.protoss_hybrid_counter(state) - ) - ) - - def protoss_competent_comp(self, state: CollectionState) -> bool: - return self.protoss_common_unit(state) \ - and self.protoss_competent_anti_air(state) \ - and self.protoss_hybrid_counter(state) \ - and self.protoss_basic_splash(state) - - def protoss_stalker_upgrade(self, state: CollectionState) -> bool: - return ( - state.has_any( - { - ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, - ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION - }, self.player) - and self.lock_any_item(state, {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER}) - ) - - def steps_of_the_rite_requirement(self, state: CollectionState) -> bool: - return self.protoss_competent_comp(state) \ - or ( - self.protoss_common_unit(state) - and self.protoss_competent_anti_air(state) - and self.protoss_static_defense(state) - ) - - def protoss_heal(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.CARRIER, ItemNames.SENTRY, ItemNames.SHIELD_BATTERY, ItemNames.RECONSTRUCTION_BEAM}, self.player) - - def templars_charge_requirement(self, state: CollectionState) -> bool: - return self.protoss_heal(state) \ - and self.protoss_anti_armor_anti_air(state) \ - and ( - self.protoss_fleet(state) - or (self.advanced_tactics - and self.protoss_competent_comp(state) - ) - ) - - def the_host_requirement(self, state: CollectionState) -> bool: - return (self.protoss_fleet(state) - and self.protoss_static_defense(state) - ) or ( - self.protoss_competent_comp(state) - and state.has(ItemNames.SOA_TIME_STOP, self.player) - ) - - def salvation_requirement(self, state: CollectionState) -> bool: - return [ - self.protoss_competent_comp(state), - self.protoss_fleet(state), - self.protoss_static_defense(state) - ].count(True) >= 2 - - def into_the_void_requirement(self, state: CollectionState) -> bool: - return self.protoss_competent_comp(state) \ - or ( - self.take_over_ai_allies - and ( - state.has(ItemNames.BATTLECRUISER, self.player) - or ( - state.has(ItemNames.ULTRALISK, self.player) - and self.protoss_competent_anti_air(state) - ) - ) - ) - - def essence_of_eternity_requirement(self, state: CollectionState) -> bool: - defense_score = self.terran_defense_rating(state, False, True) - if self.take_over_ai_allies and self.protoss_static_defense(state): - defense_score += 2 - return defense_score >= 10 \ - and ( - self.terran_competent_anti_air(state) - or self.take_over_ai_allies - and self.protoss_competent_anti_air(state) - ) \ - and ( - state.has(ItemNames.BATTLECRUISER, self.player) - or (state.has(ItemNames.BANSHEE, self.player) and state.has_any({ItemNames.VIKING, ItemNames.VALKYRIE}, - self.player)) - or self.take_over_ai_allies and self.protoss_fleet(state) - ) \ - and state.has_any({ItemNames.SIEGE_TANK, ItemNames.LIBERATOR}, self.player) - - def amons_fall_requirement(self, state: CollectionState) -> bool: - if self.take_over_ai_allies: - return ( - ( - state.has_any({ItemNames.BATTLECRUISER, ItemNames.CARRIER}, self.player) - ) - or (state.has(ItemNames.ULTRALISK, self.player) - and self.protoss_competent_anti_air(state) - and ( - state.has_any({ItemNames.LIBERATOR, ItemNames.BANSHEE, ItemNames.VALKYRIE, ItemNames.VIKING}, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - or self.protoss_fleet(state) - ) - and (self.terran_sustainable_mech_heal(state) - or (self.spear_of_adun_autonomously_cast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere - and state.has(ItemNames.RECONSTRUCTION_BEAM, self.player)) - ) - ) - ) \ - and self.terran_competent_anti_air(state) \ - and self.protoss_competent_comp(state) \ - and self.zerg_competent_comp(state) - else: - return state.has(ItemNames.MUTALISK, self.player) and self.zerg_competent_comp(state) - - def nova_any_weapon(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE, - ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLAZEFIRE_GUNBLADE}, self.player) - - def nova_ranged_weapon(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE}, - self.player) - - def nova_splash(self, state: CollectionState) -> bool: - return state.has_any({ - ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_BLAZEFIRE_GUNBLADE, ItemNames.NOVA_PULSE_GRENADES - }, self.player) \ - or self.advanced_tactics and state.has_any( - {ItemNames.NOVA_PLASMA_RIFLE, ItemNames.NOVA_MONOMOLECULAR_BLADE}, self.player) - - def nova_dash(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLINK}, self.player) - - def nova_full_stealth(self, state: CollectionState) -> bool: - return state.count(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) >= 2 - - def nova_heal(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_ARMORED_SUIT_MODULE, ItemNames.NOVA_STIM_INFUSION}, self.player) - - def nova_escape_assist(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_BLINK, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_IONIC_FORCE_FIELD}, self.player) - - def the_escape_stuff_granted(self) -> bool: - """ - The NCO first mission requires having too much stuff first before actually able to do anything - :return: - """ - return self.story_tech_granted \ - or (self.mission_order == MissionOrder.option_vanilla and self.enabled_campaigns == {SC2Campaign.NCO}) - - def the_escape_first_stage_requirement(self, state: CollectionState) -> bool: - return self.the_escape_stuff_granted() \ - or (self.nova_ranged_weapon(state) and (self.nova_full_stealth(state) or self.nova_heal(state))) - - def the_escape_requirement(self, state: CollectionState) -> bool: - return self.the_escape_first_stage_requirement(state) \ - and (self.the_escape_stuff_granted() or self.nova_splash(state)) - - def terran_cliffjumper(self, state: CollectionState) -> bool: - return state.has(ItemNames.REAPER, self.player) \ - or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \ - or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player) - - def terran_able_to_snipe_defiler(self, state: CollectionState) -> bool: - return state.has_all({ItemNames.NOVA_JUMP_SUIT_MODULE, ItemNames.NOVA_C20A_CANISTER_RIFLE}, self.player) \ - or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player) - - def sudden_strike_requirement(self, state: CollectionState) -> bool: - return self.sudden_strike_can_reach_objectives(state) \ - and self.terran_able_to_snipe_defiler(state) \ - and state.has_any({ItemNames.SIEGE_TANK, ItemNames.VULTURE}, self.player) \ - and self.nova_splash(state) \ - and (self.terran_defense_rating(state, True, False) >= 2 - or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player)) - - def sudden_strike_can_reach_objectives(self, state: CollectionState) -> bool: - return self.terran_cliffjumper(state) \ - or state.has_any({ItemNames.BANSHEE, ItemNames.VIKING}, self.player) \ - or ( - self.advanced_tactics - and state.has(ItemNames.MEDIVAC, self.player) - and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER, ItemNames.VULTURE, ItemNames.HELLION, - ItemNames.GOLIATH}, self.player) - ) - - def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool: - """ - Has unit usable as a Garrison in Enemy Intelligence - :param state: - :return: - """ - return state.has_any( - {ItemNames.MARINE, ItemNames.REAPER, ItemNames.MARAUDER, ItemNames.GHOST, ItemNames.SPECTRE, - ItemNames.HELLION, ItemNames.GOLIATH, ItemNames.WARHOUND, ItemNames.DIAMONDBACK, ItemNames.VIKING}, - self.player) - - def enemy_intelligence_cliff_garrison(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.REAPER, ItemNames.VIKING, ItemNames.MEDIVAC, ItemNames.HERCULES}, self.player) \ - or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \ - or self.advanced_tactics and state.has_any({ItemNames.HELS_ANGELS, ItemNames.BRYNHILDS}, self.player) - - def enemy_intelligence_first_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_garrisonable_unit(state) \ - and (self.terran_competent_comp(state) - or ( - self.terran_common_unit(state) - and self.terran_competent_anti_air(state) - and state.has(ItemNames.NOVA_NUKE, self.player) - ) - ) \ - and self.terran_defense_rating(state, True, True) >= 5 - - def enemy_intelligence_second_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_first_stage_requirement(state) \ - and self.enemy_intelligence_cliff_garrison(state) \ - and ( - self.story_tech_granted - or ( - self.nova_any_weapon(state) - and ( - self.nova_full_stealth(state) - or (self.nova_heal(state) - and self.nova_splash(state) - and self.nova_ranged_weapon(state)) - ) - ) - ) - - def enemy_intelligence_third_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_second_stage_requirement(state) \ - and ( - self.story_tech_granted - or ( - state.has(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) - and self.nova_dash(state) - ) - ) - - def trouble_in_paradise_requirement(self, state: CollectionState) -> bool: - return self.nova_any_weapon(state) \ - and self.nova_splash(state) \ - and self.terran_beats_protoss_deathball(state) \ - and self.terran_defense_rating(state, True, True) >= 7 - - def night_terrors_requirement(self, state: CollectionState) -> bool: - return self.terran_common_unit(state) \ - and self.terran_competent_anti_air(state) \ - and ( - # These can handle the waves of infested, even volatile ones - state.has(ItemNames.SIEGE_TANK, self.player) - or state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player) - or ( - ( - # Regular infesteds - state.has(ItemNames.FIREBAT, self.player) - or state.has_all({ItemNames.HELLION, ItemNames.HELLION_HELLBAT_ASPECT}, self.player) - or ( - self.advanced_tactics - and state.has_any({ItemNames.PERDITION_TURRET, ItemNames.PLANETARY_FORTRESS}, self.player) - ) - ) - and self.terran_bio_heal(state) - and ( - # Volatile infesteds - state.has(ItemNames.LIBERATOR, self.player) - or ( - self.advanced_tactics - and state.has_any({ItemNames.HERC, ItemNames.VULTURE}, self.player) - ) - ) - ) - ) - - def flashpoint_far_requirement(self, state: CollectionState) -> bool: - return self.terran_competent_comp(state) \ - and self.terran_mobile_detector(state) \ - and self.terran_defense_rating(state, True, False) >= 6 - - def enemy_shadow_tripwires_tool(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_FLASHBANG_GRENADES, ItemNames.NOVA_BLINK, ItemNames.NOVA_DOMINATION}, - self.player) - - def enemy_shadow_door_unlocks_tool(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_BLINK, ItemNames.NOVA_JUMP_SUIT_MODULE}, - self.player) - - def enemy_shadow_domination(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or (self.nova_ranged_weapon(state) - and (self.nova_full_stealth(state) - or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player) - or (self.nova_heal(state) and self.nova_splash(state)) - ) - ) - - def enemy_shadow_first_stage(self, state: CollectionState) -> bool: - return self.enemy_shadow_domination(state) \ - and (self.story_tech_granted - or ((self.nova_full_stealth(state) and self.enemy_shadow_tripwires_tool(state)) - or (self.nova_heal(state) and self.nova_splash(state)) - ) - ) - - def enemy_shadow_second_stage(self, state: CollectionState) -> bool: - return self.enemy_shadow_first_stage(state) \ - and (self.story_tech_granted - or self.nova_splash(state) - or self.nova_heal(state) - or self.nova_escape_assist(state) - ) - - def enemy_shadow_door_controls(self, state: CollectionState) -> bool: - return self.enemy_shadow_second_stage(state) \ - and (self.story_tech_granted or self.enemy_shadow_door_unlocks_tool(state)) - - def enemy_shadow_victory(self, state: CollectionState) -> bool: - return self.enemy_shadow_door_controls(state) \ - and (self.story_tech_granted or self.nova_heal(state)) - - def dark_skies_requirement(self, state: CollectionState) -> bool: - return self.terran_common_unit(state) \ - and self.terran_beats_protoss_deathball(state) \ - and self.terran_defense_rating(state, False, True) >= 8 - - def end_game_requirement(self, state: CollectionState) -> bool: - return self.terran_competent_comp(state) \ - and self.terran_mobile_detector(state) \ - and ( - state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.BANSHEE}, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - ) \ - and (state.has_any({ItemNames.BATTLECRUISER, ItemNames.VIKING, ItemNames.LIBERATOR}, self.player) - or (self.advanced_tactics - and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) - ) - ) - - def __init__(self, world: World): - self.world: World = world - self.player = None if world is None else world.player - self.logic_level = get_option_value(world, 'required_tactics') - self.advanced_tactics = self.logic_level != RequiredTactics.option_standard - self.take_over_ai_allies = get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true - self.kerrigan_unit_available = get_option_value(world, 'kerrigan_presence') in kerrigan_unit_available \ - and SC2Campaign.HOTS in get_enabled_campaigns(world) - self.kerrigan_levels_per_mission_completed = get_option_value(world, "kerrigan_levels_per_mission_completed") - self.kerrigan_levels_per_mission_completed_cap = get_option_value(world, "kerrigan_levels_per_mission_completed_cap") - self.kerrigan_total_level_cap = get_option_value(world, "kerrigan_total_level_cap") - self.story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - self.story_levels_granted = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled - self.basic_terran_units = get_basic_units(world, SC2Race.TERRAN) - self.basic_zerg_units = get_basic_units(world, SC2Race.ZERG) - self.basic_protoss_units = get_basic_units(world, SC2Race.PROTOSS) - self.spear_of_adun_autonomously_cast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - self.enabled_campaigns = get_enabled_campaigns(world) - self.mission_order = get_option_value(world, "mission_order") diff --git a/worlds/sc2/Starcraft2.kv b/worlds/sc2/Starcraft2.kv deleted file mode 100644 index 6b112c2f..00000000 --- a/worlds/sc2/Starcraft2.kv +++ /dev/null @@ -1,28 +0,0 @@ - - scroll_type: ["content", "bars"] - bar_width: dp(12) - effect_cls: "ScrollEffect" - - - cols: 1 - size_hint_y: None - height: self.minimum_height + 15 - padding: [5,0,dp(12),0] - -: - cols: 1 - -: - rows: 1 - -: - cols: 1 - spacing: [0,5] - -: - text_size: self.size - markup: True - halign: 'center' - valign: 'middle' - padding: [5,0,5,0] - outline_width: 1 diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index f11059a5..0201ebf6 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -1,25 +1,49 @@ -import typing from dataclasses import fields +import logging -from typing import List, Set, Iterable, Sequence, Dict, Callable, Union +from typing import * from math import floor, ceil -from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification +from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification, CollectionState +from Options import Accessibility, OptionError from worlds.AutoWorld import WebWorld, World -from . import ItemNames -from .Items import StarcraftItem, filler_items, get_item_table, get_full_item_list, \ - get_basic_units, ItemData, upgrade_included_names, progressive_if_nco, kerrigan_actives, kerrigan_passives, \ - kerrigan_only_passives, progressive_if_ext, not_balanced_starting_units, spear_of_adun_calldowns, \ - spear_of_adun_castable_passives, nova_equipment -from .ItemGroups import item_name_groups -from .Locations import get_locations, LocationType, get_location_types, get_plando_locations -from .Regions import create_regions -from .Options import get_option_value, LocationInclusion, KerriganLevelItemDistribution, \ - KerriganPresence, KerriganPrimalStatus, RequiredTactics, kerrigan_unit_available, StarterUnit, SpearOfAdunPresence, \ - get_enabled_campaigns, SpearOfAdunAutonomouslyCastAbilityPresence, Starcraft2Options -from .PoolFilter import filter_items, get_item_upgrades, UPGRADABLE_ITEMS, missions_in_mission_table, get_used_races -from .MissionTables import MissionInfo, SC2Campaign, lookup_name_to_mission, SC2Mission, \ - SC2Race +from . import location_groups +from .item.item_groups import unreleased_items, war_council_upgrades +from .item.item_tables import ( + get_full_item_list, + not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, +) +from .item import FilterItem, ItemFilterFlags, StarcraftItem, item_groups, item_names, item_tables, item_parents, \ + ZergItemType, ProtossItemType, ItemData +from .locations import ( + get_locations, DEFAULT_LOCATION_LIST, get_location_types, get_location_flags, + get_plando_locations, LocationType, lookup_location_id_to_type +) +from .mission_order.layout_types import Gauntlet +from .options import ( + get_option_value, LocationInclusion, KerriganLevelItemDistribution, + KerriganPresence, KerriganPrimalStatus, kerrigan_unit_available, StarterUnit, SpearOfAdunPresence, + get_enabled_campaigns, SpearOfAdunPassiveAbilityPresence, Starcraft2Options, + GrantStoryTech, GenericUpgradeResearch, RequiredTactics, + upgrade_included_names, EnableVoidTrade, FillerItemsDistribution, MissionOrderScouting, option_groups, + NovaGhostOfAChanceVariant, MissionOrder, VanillaItemsOnly, ExcludeOverpoweredItems, + is_mission_in_soa_presence, +) +from .rules import get_basic_units, SC2Logic +from . import settings +from .pool_filter import filter_items +from .mission_tables import SC2Campaign, SC2Mission, SC2Race, MissionFlag +from .regions import create_mission_order +from .mission_order import SC2MissionOrder +from worlds.LauncherComponents import components, Component, launch as launch_component +logger = logging.getLogger("Starcraft 2") +VICTORY_MODULO = 100 + +def launch_client(*args: str): + from .client import launch + launch_component(launch, name="Starcraft 2 Client", args=args) + +components.append(Component('Starcraft 2 Client', func=launch_client, game_name='Starcraft 2', supports_uri=True)) class Starcraft2WebWorld(WebWorld): setup_en = Tutorial( @@ -40,8 +64,18 @@ class Starcraft2WebWorld(WebWorld): ["Neocerber"] ) - tutorials = [setup_en, setup_fr] + custom_mission_orders_en = Tutorial( + "Custom Mission Order Usage Guide", + "Documentation for the custom_mission_order YAML option", + "English", + "custom_mission_orders_en.md", + "custom_mission_orders/en", + ["Salzkorn"] + ) + + tutorials = [setup_en, setup_fr, custom_mission_orders_en] game_info_languages = ["en", "fr"] + option_groups = option_groups class SC2World(World): @@ -52,90 +86,279 @@ class SC2World(World): game = "Starcraft 2" web = Starcraft2WebWorld() + settings: ClassVar[settings.Starcraft2Settings] item_name_to_id = {name: data.code for name, data in get_full_item_list().items()} - location_name_to_id = {location.name: location.code for location in get_locations(None)} + location_name_to_id = {location.name: location.code for location in DEFAULT_LOCATION_LIST} options_dataclass = Starcraft2Options options: Starcraft2Options - item_name_groups = item_name_groups - locked_locations: typing.List[str] - location_cache: typing.List[Location] - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {} - final_mission_id: int - victory_item: str - required_client_version = 0, 4, 5 + item_name_groups = item_groups.item_name_groups # type: ignore + location_name_groups = location_groups.get_location_groups() + locked_locations: List[str] + """Locations locked to contain specific items, such as victory events or forced resources""" + location_cache: List[Location] + final_missions: List[int] + required_client_version = 0, 6, 4 + custom_mission_order: SC2MissionOrder + logic: Optional['SC2Logic'] + filler_items_distribution: Dict[str, int] def __init__(self, multiworld: MultiWorld, player: int): super(SC2World, self).__init__(multiworld, player) self.location_cache = [] self.locked_locations = [] + self.filler_items_distribution = FillerItemsDistribution.default + self.logic = None - def create_item(self, name: str) -> Item: + def create_item(self, name: str) -> StarcraftItem: data = get_full_item_list()[name] return StarcraftItem(name, data.classification, data.code, self.player) def create_regions(self): - self.mission_req_table, self.final_mission_id, self.victory_item = create_regions( + self.logic = SC2Logic(self) + self.custom_mission_order = create_mission_order( self, get_locations(self), self.location_cache ) + self.logic.nova_used = ( + MissionFlag.Nova in self.custom_mission_order.get_used_flags() + or ( + MissionFlag.WoLNova in self.custom_mission_order.get_used_flags() + and self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + ) + ) + + def create_items(self) -> None: + # Starcraft 2-specific item setup: + # * Filter item pool based on player options + # * Plando starter units + # * Start-inventory units if necessary for logic + # * Plando filler items based on location exclusions + # * If the item pool is less than the location count, add some filler items - def create_items(self): setup_events(self.player, self.locked_locations, self.location_cache) + set_up_filler_items_distribution(self) - excluded_items = get_excluded_items(self) + item_list: List[FilterItem] = create_and_flag_explicit_item_locks_and_excludes(self) + flag_excludes_by_faction_presence(self, item_list) + flag_mission_based_item_excludes(self, item_list) + flag_allowed_orphan_items(self, item_list) + flag_start_inventory(self, item_list) + flag_unused_upgrade_types(self, item_list) + flag_unreleased_items(item_list) + flag_user_excluded_item_sets(self, item_list) + flag_war_council_items(self, item_list) + flag_and_add_resource_locations(self, item_list) + flag_mission_order_required_items(self, item_list) + pruned_items: List[StarcraftItem] = prune_item_pool(self, item_list) - starter_items = assign_starter_items(self, excluded_items, self.locked_locations, self.location_cache) + start_inventory = [item for item in pruned_items if ItemFilterFlags.StartInventory in item.filter_flags] + pool = [item for item in pruned_items if ItemFilterFlags.StartInventory not in item.filter_flags] - fill_resource_locations(self, self.locked_locations, self.location_cache) + # Tell the logic which unit classes are used for required W/A upgrades + used_item_names: Set[str] = {item.name for item in pruned_items} + used_item_names = used_item_names.union(item.name for item in self.multiworld.itempool if item.player == self.player) + assert self.logic is not None + if used_item_names.isdisjoint(item_groups.barracks_wa_group): + self.logic.has_barracks_unit = False + if used_item_names.isdisjoint(item_groups.factory_wa_group): + self.logic.has_factory_unit = False + if used_item_names.isdisjoint(item_groups.starport_wa_group): + self.logic.has_starport_unit = False + if used_item_names.isdisjoint(item_groups.zerg_melee_wa): + self.logic.has_zerg_melee_unit = False + if used_item_names.isdisjoint(item_groups.zerg_ranged_wa): + self.logic.has_zerg_ranged_unit = False + if used_item_names.isdisjoint(item_groups.zerg_air_units): + self.logic.has_zerg_air_unit = False + if used_item_names.isdisjoint(item_groups.protoss_ground_wa): + self.logic.has_protoss_ground_unit = False + if used_item_names.isdisjoint(item_groups.protoss_air_wa): + self.logic.has_protoss_air_unit = False - pool = get_item_pool(self, self.mission_req_table, starter_items, excluded_items, self.location_cache) + pad_item_pool_with_filler(self, len(self.location_cache) - len(self.locked_locations) - len(pool), pool) - fill_item_pool_with_dummy_items(self, self.locked_locations, self.location_cache, pool) + push_precollected_items_to_multiworld(self, start_inventory) self.multiworld.itempool += pool - def set_rules(self): - self.multiworld.completion_condition[self.player] = lambda state: state.has(self.victory_item, self.player) + def set_rules(self) -> None: + if self.options.required_tactics == RequiredTactics.option_no_logic: + # Forcing completed goal and minimal accessibility on no logic + self.options.accessibility.value = Accessibility.option_minimal + required_items = self.custom_mission_order.get_items_to_lock() + self.multiworld.completion_condition[self.player] = lambda state, required_items=required_items: all( # type: ignore + state.has(item, self.player, amount) for (item, amount) in required_items.items() + ) + else: + self.multiworld.completion_condition[self.player] = self.custom_mission_order.get_completion_condition(self.player) def get_filler_item_name(self) -> str: - return self.random.choice(filler_items) + # Assume `self.filler_items_distribution` is validated and has at least one non-zero entry + return self.random.choices(tuple(self.filler_items_distribution), weights=self.filler_items_distribution.values())[0] # type: ignore - def fill_slot_data(self): - slot_data = {} + def fill_slot_data(self) -> Mapping[str, Any]: + slot_data: Dict[str, Any] = {} for option_name in [field.name for field in fields(Starcraft2Options)]: option = get_option_value(self, option_name) if type(option) in {str, int}: slot_data[option_name] = int(option) - slot_req_table = {} - - # Serialize data - for campaign in self.mission_req_table: - slot_req_table[campaign.id] = {} - for mission in self.mission_req_table[campaign]: - slot_req_table[campaign.id][mission] = self.mission_req_table[campaign][mission]._asdict() - # Replace mission objects with mission IDs - slot_req_table[campaign.id][mission]["mission"] = slot_req_table[campaign.id][mission]["mission"].id - - for index in range(len(slot_req_table[campaign.id][mission]["required_world"])): - # TODO this is a band-aid, sometimes the mission_req_table already contains dicts - # as far as I can tell it's related to having multiple vanilla mission orders - if not isinstance(slot_req_table[campaign.id][mission]["required_world"][index], dict): - slot_req_table[campaign.id][mission]["required_world"][index] = slot_req_table[campaign.id][mission]["required_world"][index]._asdict() enabled_campaigns = get_enabled_campaigns(self) slot_data["plando_locations"] = get_plando_locations(self) - slot_data["nova_covert_ops_only"] = (enabled_campaigns == {SC2Campaign.NCO}) - slot_data["mission_req"] = slot_req_table - slot_data["final_mission"] = self.final_mission_id - slot_data["version"] = 3 + slot_data["use_nova_nco_fallback"] = ( + enabled_campaigns == {SC2Campaign.NCO} + and self.options.mission_order == MissionOrder.option_vanilla + ) + if (self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + or ( + self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_auto + and MissionFlag.Nova in self.custom_mission_order.get_used_flags().keys() + ) + ): + slot_data["use_nova_wol_fallback"] = False + else: + slot_data["use_nova_wol_fallback"] = True + slot_data["final_mission_ids"] = self.custom_mission_order.get_final_mission_ids() + slot_data["custom_mission_order"] = self.custom_mission_order.get_slot_data() + slot_data["version"] = 4 if SC2Campaign.HOTS not in enabled_campaigns: slot_data["kerrigan_presence"] = KerriganPresence.option_not_present + + if self.options.mission_order_scouting != MissionOrderScouting.option_none: + mission_item_classification: Dict[str, int] = {} + for location in self.multiworld.get_locations(self.player): + # Event do not hold items + if not location.is_event: + assert location.address is not None + assert location.item is not None + if lookup_location_id_to_type[location.address] == LocationType.VICTORY_CACHE: + # Ensure that if there are multiple items given for finishing a mission and that at least + # one is progressive, the flag kept is progressive. + location_name = self.location_id_to_name[(location.address // VICTORY_MODULO) * VICTORY_MODULO] + old_classification = mission_item_classification.get(location_name, 0) + mission_item_classification[location_name] = old_classification | location.item.classification.as_flag() + else: + mission_item_classification[location.name] = location.item.classification.as_flag() + slot_data["mission_item_classification"] = mission_item_classification + + # Disable trade if there is no trade partner + traders = [ + world + for world in self.multiworld.worlds.values() + if world.game == self.game and world.options.enable_void_trade == EnableVoidTrade.option_true # type: ignore + ] + if len(traders) < 2: + slot_data["enable_void_trade"] = EnableVoidTrade.option_false + return slot_data + def pre_fill(self) -> None: + assert self.logic is not None + self.logic.total_mission_count = self.custom_mission_order.get_mission_count() + if ( + self.options.generic_upgrade_missions > 0 + and self.options.required_tactics != RequiredTactics.option_no_logic + ): + # Attempt to resolve a situation when the option is too high for the mission order rolled + weapon_armor_item_names = [ + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE + ] + def state_with_kerrigan_levels() -> CollectionState: + state: CollectionState = self.multiworld.get_all_state(False) + # Ignore dead ends caused by Kerrigan -> solve those in the next stage + state.collect(self.create_item(item_names.KERRIGAN_LEVELS_70)) + state.update_reachable_regions(self.player) + return state -def setup_events(player: int, locked_locations: typing.List[str], location_cache: typing.List[Location]): + self._fill_needed_items(state_with_kerrigan_levels, weapon_armor_item_names, WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + if ( + self.options.kerrigan_levels_per_mission_completed > 0 + and self.options.required_tactics != RequiredTactics.option_no_logic + ): + # Attempt to solve being locked by Kerrigan level requirements + self._fill_needed_items(lambda: self.multiworld.get_all_state(False), [item_names.KERRIGAN_LEVELS_1], 70) + + + def _fill_needed_items(self, all_state_getter: Callable[[],CollectionState], items_to_use: List[str], max_attempts: int) -> None: + """ + Helper for pre-fill, seeks if the world is actually solvable and inserts items to start inventory if necessary. + :param all_state_getter: + :param items_to_use: + :param max_attempts: + :return: + """ + for attempt in range(0, max_attempts): + all_state: CollectionState = all_state_getter() + location_failed = False + for location in self.location_cache: + if not (all_state.can_reach_location(location.name, self.player) + and all_state.can_reach_region(location.parent_region.name, self.player)): + location_failed = True + break + if location_failed: + for item_name in items_to_use: + item = self.multiworld.create_item(item_name, self.player) + self.multiworld.push_precollected(item) + else: + return + + + def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]) -> None: + """ + Generate information to hint where each mission is actually located in the mission order + :param hint_data: + """ + hint_data[self.player] = {} + for campaign in self.custom_mission_order.mission_order_node.campaigns: + for layout in campaign.layouts: + columns = layout.layout_type.get_visual_layout() + is_single_row_layout = max([len(column) for column in columns]) == 1 + for column_index, column in enumerate(columns): + for row_index, layout_mission in enumerate(column): + slot = layout.missions[layout_mission] + if hasattr(slot, "mission") and slot.mission is not None: + mission = slot.mission + campaign_name = campaign.get_visual_name() + layout_name = layout.get_visual_name() + if isinstance(layout.layout_type, Gauntlet): + # Linearize Gauntlet + column_name = str( + layout_mission + 1 + if layout_mission >= 0 + else layout.layout_type.size + layout_mission + 1 + ) + row_name = "" + else: + column_name = "" if len(columns) == 1 else _get_column_display(column_index, is_single_row_layout) + row_name = "" if is_single_row_layout else str(1 + row_index) + mission_position_name: str = campaign_name + " " + layout_name + " " + column_name + row_name + mission_position_name = mission_position_name.strip().replace(" ", " ") + if mission_position_name != "": + for location in self.get_region(mission.mission_name).get_locations(): + if location.address is not None: + hint_data[self.player][location.address] = mission_position_name + + +def _get_column_display(index: int, single_row_layout: bool) -> str: + """ + Helper function to display column name + :param index: + :param single_row_layout: + :return: + """ + if single_row_layout: + return str(index + 1) + else: + # Convert column name to a letter, from Z continue with AA and so on + f: Callable[[int], str] = lambda x: "" if x == 0 else f((x - 1) // 26) + chr((x - 1) % 26 + ord("A")) + return f(index + 1) + + +def setup_events(player: int, locked_locations: List[str], location_cache: List[Location]) -> None: for location in location_cache: if location.address is None: item = Item(location.name, ItemClassification.progression, None, player) @@ -145,319 +368,661 @@ def setup_events(player: int, locked_locations: typing.List[str], location_cache location.place_locked_item(item) -def get_excluded_items(world: World) -> Set[str]: - excluded_items: Set[str] = set(get_option_value(world, 'excluded_items')) - for item in world.multiworld.precollected_items[world.player]: - excluded_items.add(item.name) - locked_items: Set[str] = set(get_option_value(world, 'locked_items')) - # Starter items are also excluded items - starter_items: Set[str] = set(get_option_value(world, 'start_inventory')) - item_table = get_full_item_list() - soa_presence = get_option_value(world, "spear_of_adun_presence") - soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - enabled_campaigns = get_enabled_campaigns(world) +def create_and_flag_explicit_item_locks_and_excludes(world: SC2World) -> List[FilterItem]: + """ + Handles `excluded_items`, `locked_items`, and `start_inventory` + Returns a list of all possible non-filler items that can be added, with an accompanying flags bitfield. + """ + excluded_items = world.options.excluded_items + unexcluded_items = world.options.unexcluded_items + locked_items = world.options.locked_items + start_inventory = world.options.start_inventory + key_items = world.custom_mission_order.get_items_to_lock() - # Ensure no item is both guaranteed and excluded - invalid_items = excluded_items.intersection(locked_items) - invalid_count = len(invalid_items) - # Don't count starter items that can appear multiple times - invalid_count -= len([item for item in starter_items.intersection(locked_items) if item_table[item].quantity != 1]) - if invalid_count > 0: - raise Exception(f"{invalid_count} item{'s are' if invalid_count > 1 else ' is'} both locked and excluded from generation. Please adjust your excluded items and locked items.") + def resolve_count(count: Optional[int], max_count: int) -> int: + if count == 0: + return max_count + if count is None: + return 0 + if max_count == 0: + return count + return min(count, max_count) + + auto_excludes = {item_name: 1 for item_name in item_groups.legacy_items} + if world.options.exclude_overpowered_items.value == ExcludeOverpoweredItems.option_true: + for item_name in item_groups.overpowered_items: + auto_excludes[item_name] = 1 - def smart_exclude(item_choices: Set[str], choices_to_keep: int): - expected_choices = len(item_choices) - if expected_choices == 0: - return - item_choices = set(item_choices) - starter_choices = item_choices.intersection(starter_items) - excluded_choices = item_choices.intersection(excluded_items) - item_choices.difference_update(excluded_choices) - item_choices.difference_update(locked_items) - candidates = sorted(item_choices) - exclude_amount = min(expected_choices - choices_to_keep - len(excluded_choices) + len(starter_choices), len(candidates)) - if exclude_amount > 0: - excluded_items.update(world.random.sample(candidates, exclude_amount)) + result: List[FilterItem] = [] + for item_name, item_data in item_tables.item_table.items(): + max_count = item_data.quantity + auto_excluded_count = auto_excludes.get(item_name) + excluded_count = excluded_items.get(item_name, auto_excluded_count) + unexcluded_count = unexcluded_items.get(item_name) + locked_count = locked_items.get(item_name) + start_count: Optional[int] = start_inventory.get(item_name) + key_count = key_items.get(item_name, 0) + # specifying 0 in the yaml means exclude / lock all + # start_inventory doesn't allow specifying 0 + # not specifying means don't exclude/lock/start + excluded_count = resolve_count(excluded_count, max_count) + unexcluded_count = resolve_count(unexcluded_count, max_count) + locked_count = resolve_count(locked_count, max_count) + start_count = resolve_count(start_count, max_count) - # Nova gear exclusion if NCO not in campaigns - if SC2Campaign.NCO not in enabled_campaigns: - excluded_items = excluded_items.union(nova_equipment) + excluded_count = max(0, excluded_count - unexcluded_count) - kerrigan_presence = get_option_value(world, "kerrigan_presence") - # Exclude Primal Form item if option is not set or Kerrigan is unavailable - if get_option_value(world, "kerrigan_primal_status") != KerriganPrimalStatus.option_item or \ - (kerrigan_presence in {KerriganPresence.option_not_present, KerriganPresence.option_not_present_and_no_passives}): - excluded_items.add(ItemNames.KERRIGAN_PRIMAL_FORM) + # Priority: start_inventory >> locked_items >> excluded_items >> unspecified + if max_count == 0: + if excluded_count: + logger.warning(f"Item {item_name} was listed as excluded, but as a filler item, it cannot be explicitly excluded.") + excluded_count = 0 + max_count = start_count + locked_count + elif start_count > max_count: + logger.warning(f"Item {item_name} had start amount greater than maximum amount ({start_count} > {max_count}). Capping start amount to max.") + start_count = max_count + locked_count = 0 + excluded_count = 0 + elif locked_count + start_count > max_count: + logger.warning(f"Item {item_name} had locked + start amount greater than maximum amount " + f"({locked_count} + {start_count} > {max_count}). Capping locked amount to max - start.") + locked_count = max_count - start_count + excluded_count = 0 + elif excluded_count + locked_count + start_count > max_count: + logger.warning(f"Item {item_name} had excluded + locked + start amounts greater than maximum amount " + f"({excluded_count} + {locked_count} + {start_count} > {max_count}). Decreasing excluded amount.") + excluded_count = max_count - start_count - locked_count + # Make sure the final count creates enough items to satisfy key requirements + final_count = max(max_count, key_count) + for index in range(final_count): + result.append(FilterItem(item_name, item_data, index)) + if index < start_count: + result[-1].flags |= ItemFilterFlags.StartInventory + if index < locked_count + start_count: + result[-1].flags |= ItemFilterFlags.Locked + if item_name in world.options.non_local_items: + result[-1].flags |= ItemFilterFlags.NonLocal + if index >= max(max_count - excluded_count, key_count): + result[-1].flags |= ItemFilterFlags.UserExcluded + return result - # no Kerrigan & remove all passives => remove all abilities - if kerrigan_presence == KerriganPresence.option_not_present_and_no_passives: - for tier in range(7): - smart_exclude(kerrigan_actives[tier].union(kerrigan_passives[tier]), 0) + +def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes items based on if their faction has a mission present where they can be used""" + missions = get_all_missions(world.custom_mission_order) + if world.options.take_over_ai_allies.value: + terran_missions = [mission for mission in missions if (MissionFlag.Terran|MissionFlag.AiTerranAlly) & mission.flags] + zerg_missions = [mission for mission in missions if (MissionFlag.Zerg|MissionFlag.AiZergAlly) & mission.flags] + protoss_missions = [mission for mission in missions if (MissionFlag.Protoss|MissionFlag.AiProtossAlly) & mission.flags] else: - # no Kerrigan, but keep non-Kerrigan passives - if kerrigan_presence == KerriganPresence.option_not_present: - smart_exclude(kerrigan_only_passives, 0) - for tier in range(7): - smart_exclude(kerrigan_actives[tier], 0) + terran_missions = [mission for mission in missions if MissionFlag.Terran in mission.flags] + zerg_missions = [mission for mission in missions if MissionFlag.Zerg in mission.flags] + protoss_missions = [mission for mission in missions if MissionFlag.Protoss in mission.flags] + terran_build_missions = [mission for mission in terran_missions if MissionFlag.NoBuild not in mission.flags] + zerg_build_missions = [mission for mission in zerg_missions if MissionFlag.NoBuild not in mission.flags] + protoss_build_missions = [mission for mission in protoss_missions if MissionFlag.NoBuild not in mission.flags] + auto_upgrades_in_nobuilds = ( + world.options.generic_upgrade_research.value + in (GenericUpgradeResearch.option_always_auto, GenericUpgradeResearch.option_auto_in_no_build) + ) - # SOA exclusion, other cases are handled by generic race logic - if (soa_presence == SpearOfAdunPresence.option_lotv_protoss and SC2Campaign.LOTV not in enabled_campaigns) \ - or soa_presence == SpearOfAdunPresence.option_not_present: - excluded_items.update(spear_of_adun_calldowns) - if (soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss \ - and SC2Campaign.LOTV not in enabled_campaigns) \ - or soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present: - excluded_items.update(spear_of_adun_castable_passives) + for item in item_list: + # Catch-all for all of a faction's items + if not terran_missions and item.data.race == SC2Race.TERRAN: + if item.name not in item_groups.nova_equipment: + item.flags |= ItemFilterFlags.FilterExcluded + continue + if not zerg_missions and item.data.race == SC2Race.ZERG: + if item.data.type != item_tables.ZergItemType.Ability \ + and item.data.type != ZergItemType.Level: + item.flags |= ItemFilterFlags.FilterExcluded + continue + if not protoss_missions and item.data.race == SC2Race.PROTOSS: + if item.name not in item_groups.soa_items: + item.flags |= ItemFilterFlags.FilterExcluded + continue - return excluded_items + # Faction units + if (not terran_build_missions + and item.data.type in (item_tables.TerranItemType.Unit, item_tables.TerranItemType.Building, item_tables.TerranItemType.Mercenary) + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (not zerg_build_missions + and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit) + ): + if (SC2Mission.ENEMY_WITHIN not in missions + or world.options.grant_story_tech.value == GrantStoryTech.option_grant + or item.name not in (item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.INFESTOR) + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (not protoss_build_missions + and item.data.type in ( + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, + ) + ): + # Note(mm): This doesn't exclude things like automated assimilators or warp gate improvements + # because that item type is mixed in with e.g. Reconstruction Beam and Overwatch + if (SC2Mission.TEMPLAR_S_RETURN not in missions + or world.options.grant_story_tech.value == GrantStoryTech.option_grant + or item.name not in ( + item_names.IMMORTAL, item_names.ANNIHILATOR, + item_names.COLOSSUS, item_names.VANGUARD, item_names.REAVER, item_names.DARK_TEMPLAR, + item_names.SENTRY, item_names.HIGH_TEMPLAR, + ) + ): + item.flags |= ItemFilterFlags.FilterExcluded + + # Faction +attack/armour upgrades + if (item.data.type == item_tables.TerranItemType.Upgrade + and not terran_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.data.type == item_tables.ZergItemType.Upgrade + and not zerg_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.data.type == item_tables.ProtossItemType.Upgrade + and not protoss_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded -def assign_starter_items(world: World, excluded_items: Set[str], locked_locations: List[str], location_cache: typing.List[Location]) -> List[Item]: - starter_items: List[Item] = [] - non_local_items = get_option_value(world, "non_local_items") - starter_unit = get_option_value(world, "starter_unit") - enabled_campaigns = get_enabled_campaigns(world) - first_mission = get_first_mission(world.mission_req_table) - # Ensuring that first mission is completable +def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem]) -> None: + """ + Excludes items based on mission / campaign presence: Nova Gear, Kerrigan abilities, SOA + """ + missions = get_all_missions(world.custom_mission_order) + + kerrigan_missions = [mission for mission in missions if MissionFlag.Kerrigan in mission.flags] + kerrigan_build_missions = [mission for mission in kerrigan_missions if MissionFlag.NoBuild not in mission.flags] + nova_missions = [ + mission for mission in missions + if MissionFlag.Nova in mission.flags + or ( + world.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + and MissionFlag.WoLNova in mission.flags + ) + ] + + kerrigan_is_present = ( + len(kerrigan_missions) > 0 + and world.options.kerrigan_presence in kerrigan_unit_available + and SC2Campaign.HOTS in get_enabled_campaigns(world) # TODO: Kerrigan available all Zerg/Everywhere + ) + + # TvX build missions -- check flags + if world.options.take_over_ai_allies: + terran_build_missions = [mission for mission in missions if ( + (MissionFlag.Terran in mission.flags or MissionFlag.AiTerranAlly in mission.flags) + and MissionFlag.NoBuild not in mission.flags + )] + else: + terran_build_missions = [mission for mission in missions if ( + MissionFlag.Terran in mission.flags + and MissionFlag.NoBuild not in mission.flags + )] + tvz_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsZerg in mission.flags] + tvp_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsProtoss in mission.flags] + tvt_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsTerran in mission.flags] + + # Check if SOA actives should be present + if world.options.spear_of_adun_presence != SpearOfAdunPresence.option_not_present: + soa_missions = missions + soa_missions = [ + m for m in soa_missions + if is_mission_in_soa_presence(world.options.spear_of_adun_presence.value, m) + ] + if not world.options.spear_of_adun_present_in_no_build: + soa_missions = [m for m in soa_missions if MissionFlag.NoBuild not in m.flags] + soa_presence = len(soa_missions) > 0 + else: + soa_presence = False + + # Check if SOA passives should be present + if world.options.spear_of_adun_passive_ability_presence != SpearOfAdunPassiveAbilityPresence.option_not_present: + soa_missions = missions + soa_missions = [ + m for m in soa_missions + if is_mission_in_soa_presence( + world.options.spear_of_adun_passive_ability_presence.value, + m, + SpearOfAdunPassiveAbilityPresence + ) + ] + if not world.options.spear_of_adun_passive_present_in_no_build: + soa_missions = [m for m in soa_missions if MissionFlag.NoBuild not in m.flags] + soa_passive_presence = len(soa_missions) > 0 + else: + soa_passive_presence = False + + remove_kerrigan_abils = ( + # TODO: Kerrigan presence Zerg/Everywhere + not kerrigan_is_present + or (world.options.grant_story_tech.value == GrantStoryTech.option_grant and not kerrigan_build_missions) + or ( + world.options.grant_story_tech.value == GrantStoryTech.option_allow_substitutes + and len(kerrigan_missions) == 1 + and kerrigan_missions[0] == SC2Mission.SUPREME + ) + ) + + for item in item_list: + # Filter Nova equipment if you never get Nova + if not nova_missions and (item.name in item_groups.nova_equipment): + item.flags |= ItemFilterFlags.FilterExcluded + + # Todo(mm): How should no-build only / grant_story_tech affect excluding Kerrigan items? + # Exclude Primal form based on Kerrigan presence or primal form option + if (item.data.type == item_tables.ZergItemType.Primal_Form + and ((not kerrigan_is_present) or world.options.kerrigan_primal_status != KerriganPrimalStatus.option_item) + ): + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Kerrigan abilities if there's no kerrigan + if item.data.type == item_tables.ZergItemType.Ability and remove_kerrigan_abils: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Spear of Adun if it's off + if item.name in item_tables.spear_of_adun_calldowns and not soa_presence: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Spear of Adun passives + if item.name in item_tables.spear_of_adun_castable_passives and not soa_passive_presence: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove matchup-specific items if you don't play that matchup + if (item.name in (item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER) + and not tvz_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.name in (item_names.PSI_INDOCTRINATOR, item_names.SONIC_DISRUPTER) + and not tvt_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.name in (item_names.PSI_SCREEN, item_names.ARGUS_AMPLIFIER) + and not tvp_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + return + + +def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Adds the `Allowed_Orphan` flag to items that shouldn't be filtered with their parents, like combat shield""" + missions = get_all_missions(world.custom_mission_order) + terran_nobuild_missions = any((MissionFlag.Terran|MissionFlag.NoBuild) in mission.flags and mission.campaign != SC2Campaign.NCO for mission in missions) + if terran_nobuild_missions: + for item in item_list: + if item.name in ( + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MEDIC_NANO_PROJECTOR, item_names.MARINE_LASER_TARGETING_SYSTEM, + ): + item.flags |= ItemFilterFlags.AllowedOrphan + # These rules only trigger on Standard tactics + if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard: + for item in item_list: + if item.name in (item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_PROGRESSIVE_STIMPACK): + item.flags |= ItemFilterFlags.AllowedOrphan + if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard: + for item in item_list: + if item.name in (item_names.STALKER_PHASE_REACTOR, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION): + item.flags |= ItemFilterFlags.AllowedOrphan + + +def flag_start_inventory(world: SC2World, item_list: List[FilterItem]) -> None: + """Adds items to start_inventory based on first mission logic and options like `starter_unit` and `start_primary_abilities`""" + potential_starters = world.custom_mission_order.get_starting_missions() + starter_mission_names = [mission.mission_name for mission in potential_starters] + starter_unit = int(world.options.starter_unit) + + # If starter_unit is off and the first mission doesn't have a no-logic location, force starter_unit on if starter_unit == StarterUnit.option_off: - starter_mission_locations = [location.name for location in location_cache - if location.parent_region.name == first_mission - and location.access_rule == Location.access_rule] + start_collection_state = CollectionState(world.multiworld) + starter_mission_locations = [location.name for location in world.location_cache + if location.parent_region + and location.parent_region.name in starter_mission_names + and location.access_rule(start_collection_state)] if not starter_mission_locations: # Force early unit if first mission is impossible without one starter_unit = StarterUnit.option_any_starter_unit if starter_unit != StarterUnit.option_off: - first_race = lookup_name_to_mission[first_mission].race + flag_start_unit(world, item_list, starter_unit) - if first_race == SC2Race.ANY: - # If the first mission is a logic-less no-build - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = world.mission_req_table - races = get_used_races(mission_req_table, world) - races.remove(SC2Race.ANY) - if lookup_name_to_mission[first_mission].race in races: - # The campaign's race is in (At least one mission that's not logic-less no-build exists) - first_race = lookup_name_to_mission[first_mission].campaign.race - elif len(races) > 0: - # The campaign only has logic-less no-build missions. Find any other valid race - first_race = world.random.choice(list(races)) - - if first_race != SC2Race.ANY: - # The race of the early unit has been chosen - basic_units = get_basic_units(world, first_race) - if starter_unit == StarterUnit.option_balanced: - basic_units = basic_units.difference(not_balanced_starting_units) - if first_mission == SC2Mission.DARK_WHISPERS.mission_name: - # Special case - you don't have a logicless location but need an AA - basic_units = basic_units.difference( - {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL, ItemNames.BLOOD_HUNTER, - ItemNames.AVENGER, ItemNames.IMMORTAL, ItemNames.ANNIHILATOR, ItemNames.VANGUARD}) - if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name: - # Special case - cliffjumpers - basic_units = {ItemNames.REAPER, ItemNames.GOLIATH, ItemNames.SIEGE_TANK, ItemNames.VIKING, ItemNames.BANSHEE} - local_basic_unit = sorted(item for item in basic_units if item not in non_local_items and item not in excluded_items) - if not local_basic_unit: - # Drop non_local_items constraint - local_basic_unit = sorted(item for item in basic_units if item not in excluded_items) - if not local_basic_unit: - raise Exception("Early Unit: At least one basic unit must be included") - - unit: Item = add_starter_item(world, excluded_items, local_basic_unit) - starter_items.append(unit) - - # NCO-only specific rules - if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name: - support_item: Union[str, None] = None - if unit.name == ItemNames.REAPER: - support_item = ItemNames.REAPER_SPIDER_MINES - elif unit.name == ItemNames.GOLIATH: - support_item = ItemNames.GOLIATH_JUMP_JETS - elif unit.name == ItemNames.SIEGE_TANK: - support_item = ItemNames.SIEGE_TANK_JUMP_JETS - elif unit.name == ItemNames.VIKING: - support_item = ItemNames.VIKING_SMART_SERVOS - if support_item is not None: - starter_items.append(add_starter_item(world, excluded_items, [support_item])) - starter_items.append(add_starter_item(world, excluded_items, [ItemNames.NOVA_JUMP_SUIT_MODULE])) - starter_items.append( - add_starter_item(world, excluded_items, - [ - ItemNames.NOVA_HELLFIRE_SHOTGUN, - ItemNames.NOVA_PLASMA_RIFLE, - ItemNames.NOVA_PULSE_GRENADES - ])) - if enabled_campaigns == {SC2Campaign.NCO}: - starter_items.append(add_starter_item(world, excluded_items, [ItemNames.LIBERATOR_RAID_ARTILLERY])) - - starter_abilities = get_option_value(world, 'start_primary_abilities') - assert isinstance(starter_abilities, int) - if starter_abilities: - ability_count = starter_abilities - ability_tiers = [0, 1, 3] - world.random.shuffle(ability_tiers) - if ability_count > 3: - ability_tiers.append(6) - for tier in ability_tiers: - abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items, non_local_items) - if not abilities: - abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items) - if abilities: - ability_count -= 1 - starter_items.append(add_starter_item(world, excluded_items, list(abilities))) - if ability_count == 0: - break - - return starter_items + flag_start_abilities(world, item_list) -def get_first_mission(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> str: - # The first world should also be the starting world - campaigns = mission_req_table.keys() - lowest_id = min([campaign.id for campaign in campaigns]) - first_campaign = [campaign for campaign in campaigns if campaign.id == lowest_id][0] - first_mission = list(mission_req_table[first_campaign])[0] - return first_mission +def flag_start_unit(world: SC2World, item_list: List[FilterItem], starter_unit: int) -> None: + first_mission = get_random_first_mission(world, world.custom_mission_order) + first_race = first_mission.race + + if first_race == SC2Race.ANY: + # If the first mission is a logic-less no-build + missions = get_all_missions(world.custom_mission_order) + build_missions = [mission for mission in missions if MissionFlag.NoBuild not in mission.flags] + races = {mission.race for mission in build_missions if mission.race != SC2Race.ANY} + if races: + first_race = world.random.choice(list(races)) + + if first_race != SC2Race.ANY: + possible_starter_items = { + item.name: item for item in item_list if (ItemFilterFlags.Plando|ItemFilterFlags.UserExcluded|ItemFilterFlags.FilterExcluded) & item.flags == 0 + } + + # The race of the early unit has been chosen + basic_units = get_basic_units(world.options.required_tactics.value, first_race) + if starter_unit == StarterUnit.option_balanced: + basic_units = basic_units.difference(not_balanced_starting_units) + if first_mission == SC2Mission.DARK_WHISPERS: + # Special case - you don't have a logicless location but need an AA + basic_units = basic_units.difference( + {item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.BLOOD_HUNTER, + item_names.AVENGER, item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD}) + if first_mission == SC2Mission.SUDDEN_STRIKE: + # Special case - cliffjumpers + basic_units = {item_names.REAPER, item_names.GOLIATH, item_names.SIEGE_TANK, item_names.VIKING, item_names.BANSHEE} + basic_unit_options = [ + item for item in possible_starter_items.values() + if item.name in basic_units + and ItemFilterFlags.StartInventory not in item.flags + ] + + # For Sudden Strike, starter units need an upgrade to help them get around + nco_support_items = { + item_names.REAPER: item_names.REAPER_SPIDER_MINES, + item_names.GOLIATH: item_names.GOLIATH_JUMP_JETS, + item_names.SIEGE_TANK: item_names.SIEGE_TANK_JUMP_JETS, + item_names.VIKING: item_names.VIKING_SMART_SERVOS, + } + if first_mission == SC2Mission.SUDDEN_STRIKE: + basic_unit_options = [ + item for item in basic_unit_options + if item.name not in nco_support_items + or nco_support_items[item.name] in possible_starter_items + and ((ItemFilterFlags.Plando|ItemFilterFlags.UserExcluded|ItemFilterFlags.FilterExcluded) & possible_starter_items[nco_support_items[item.name]].flags) == 0 + ] + if not basic_unit_options: + raise OptionError("Early Unit: At least one basic unit must be included") + local_basic_unit = [item for item in basic_unit_options if ItemFilterFlags.NonLocal not in item.flags] + if local_basic_unit: + basic_unit_options = local_basic_unit + + unit = world.random.choice(basic_unit_options) + unit.flags |= ItemFilterFlags.StartInventory + + # NCO-only specific rules + if first_mission == SC2Mission.SUDDEN_STRIKE: + if unit.name in nco_support_items: + support_item = possible_starter_items[nco_support_items[unit.name]] + support_item.flags |= ItemFilterFlags.StartInventory + if item_names.NOVA_JUMP_SUIT_MODULE in possible_starter_items: + possible_starter_items[item_names.NOVA_JUMP_SUIT_MODULE].flags |= ItemFilterFlags.StartInventory + if MissionFlag.Nova in first_mission.flags: + possible_starter_weapons = ( + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_PULSE_GRENADES, + ) + starter_weapon_options = [item for item in possible_starter_items.values() if item.name in possible_starter_weapons] + starter_weapon = world.random.choice(starter_weapon_options) + starter_weapon.flags |= ItemFilterFlags.StartInventory -def add_starter_item(world: World, excluded_items: Set[str], item_list: Sequence[str]) -> Item: - - item_name = world.random.choice(sorted(item_list)) - - excluded_items.add(item_name) - - item = create_item_with_correct_settings(world.player, item_name) - - world.multiworld.push_precollected(item) - - return item +def flag_start_abilities(world: SC2World, item_list: List[FilterItem]) -> None: + starter_abilities = world.options.start_primary_abilities + if not starter_abilities: + return + assert starter_abilities <= 4 + ability_count = int(starter_abilities) + available_abilities = item_groups.kerrigan_non_ulimates + for i in range(ability_count): + potential_starter_abilities = [ + item for item in item_list + if item.name in available_abilities + and (ItemFilterFlags.UserExcluded|ItemFilterFlags.StartInventory|ItemFilterFlags.Plando) & item.flags == 0 + ] + if len(potential_starter_abilities) == 0 or i >= 3: + # Avoid picking an ultimate unless 4 starter abilities were asked for. + # Without this check, it would be possible to pick an ultimate if a previous tier failed + # to pick due to exclusions + available_abilities = item_groups.kerrigan_abilities + potential_starter_abilities = [ + item for item in item_list + if item.name in available_abilities + and (ItemFilterFlags.UserExcluded|ItemFilterFlags.StartInventory|ItemFilterFlags.Plando) & item.flags == 0 + ] + # Try to avoid giving non-local items unless there is no alternative + abilities = [item for item in potential_starter_abilities if ItemFilterFlags.NonLocal not in item.flags] + if not abilities: + abilities = potential_starter_abilities + if abilities: + ability = world.random.choice(abilities) + ability.flags |= ItemFilterFlags.StartInventory -def get_item_pool(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], - starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]: - pool: List[Item] = [] - - # For the future: goal items like Artifact Shards go here - locked_items = [] - - # YAML items - yaml_locked_items = get_option_value(world, 'locked_items') - assert not isinstance(yaml_locked_items, int) - - # Adjust generic upgrade availability based on options - include_upgrades = get_option_value(world, 'generic_upgrade_missions') == 0 - upgrade_items = get_option_value(world, 'generic_upgrade_items') - assert isinstance(upgrade_items, int) - - # Include items from outside main campaigns - item_sets = {'wol', 'hots', 'lotv'} - if get_option_value(world, 'nco_items') \ - or SC2Campaign.NCO in get_enabled_campaigns(world): - item_sets.add('nco') - if get_option_value(world, 'bw_items'): - item_sets.add('bw') - if get_option_value(world, 'ext_items'): - item_sets.add('ext') - - def allowed_quantity(name: str, data: ItemData) -> int: - if name in excluded_items \ - or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \ - or not data.origin.intersection(item_sets): - return 0 - elif name in progressive_if_nco and 'nco' not in item_sets: - return 1 - elif name in progressive_if_ext and 'ext' not in item_sets: - return 1 - else: - return data.quantity - - for name, data in get_item_table().items(): - for _ in range(allowed_quantity(name, data)): - item = create_item_with_correct_settings(world.player, name) - if name in yaml_locked_items: - locked_items.append(item) +def flag_unused_upgrade_types(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes +armour/attack upgrades based on generic upgrade strategy. + Caps upgrade items based on `max_upgrade_level`.""" + include_upgrades = world.options.generic_upgrade_missions == 0 + upgrade_items = world.options.generic_upgrade_items.value + upgrade_included_counts: Dict[str, int] = {} + for item in item_list: + if item.data.type in item_tables.upgrade_item_types: + if not include_upgrades or (item.name not in upgrade_included_names[upgrade_items]): + item.flags |= ItemFilterFlags.Removed else: - pool.append(item) + included = upgrade_included_counts.get(item.name, 0) + if ( + included >= world.options.max_upgrade_level + and not (ItemFilterFlags.Locked|ItemFilterFlags.StartInventory) & item.flags + ): + item.flags |= ItemFilterFlags.FilterExcluded + elif ItemFilterFlags.UserExcluded not in item.flags: + upgrade_included_counts[item.name] = included + 1 - existing_items = starter_items + [item for item in world.multiworld.precollected_items[world.player] if item not in starter_items] - existing_names = [item.name for item in existing_items] - - # Check the parent item integrity, exclude items - pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)] - - # Removing upgrades for excluded items - for item_name in excluded_items: - if item_name in existing_names: - continue - invalid_upgrades = get_item_upgrades(pool, item_name) - for invalid_upgrade in invalid_upgrades: - pool.remove(invalid_upgrade) - - fill_pool_with_kerrigan_levels(world, pool) - filtered_pool = filter_items(world, mission_req_table, location_cache, pool, existing_items, locked_items) - return filtered_pool +def flag_unreleased_items(item_list: List[FilterItem]) -> None: + """Remove all unreleased items unless they're explicitly locked""" + for item in item_list: + if (item.name in unreleased_items + and not (ItemFilterFlags.Locked|ItemFilterFlags.StartInventory) & item.flags): + item.flags |= ItemFilterFlags.Removed -def fill_item_pool_with_dummy_items(self: SC2World, locked_locations: List[str], - location_cache: List[Location], pool: List[Item]): - for _ in range(len(location_cache) - len(locked_locations) - len(pool)): - item = create_item_with_correct_settings(self.player, self.get_filler_item_name()) - pool.append(item) +def flag_user_excluded_item_sets(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes items based on item set options (`only_vanilla_items`)""" + vanilla_nonprogressive_count = { + item_name: 0 for item_name in item_groups.terran_original_progressive_upgrades + } + if world.options.vanilla_items_only.value == VanillaItemsOnly.option_true: + vanilla_items = item_groups.vanilla_items + item_groups.nova_equipment + for item in item_list: + if ItemFilterFlags.UserExcluded in item.flags: + continue + if item.name not in vanilla_items: + item.flags |= ItemFilterFlags.UserExcluded + if item.name in item_groups.terran_original_progressive_upgrades: + if vanilla_nonprogressive_count[item.name]: + item.flags |= ItemFilterFlags.UserExcluded + vanilla_nonprogressive_count[item.name] += 1 + + excluded_count: Dict[str, int] = dict() -def create_item_with_correct_settings(player: int, name: str) -> Item: - data = get_full_item_list()[name] +def flag_war_council_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes / start-inventories items based on `nerf_unit_baselines` option. + Will skip items that are excluded by other sources.""" + if world.options.war_council_nerfs: + return - item = Item(name, data.classification, data.code, player) - - return item + flagged_item_names = [] + for item in item_list: + if ( + item.name in war_council_upgrades + and not ItemFilterFlags.Excluded & item.flags + and item.name not in flagged_item_names + ): + flagged_item_names.append(item.name) + item.flags |= ItemFilterFlags.StartInventory -def pool_contains_parent(item: Item, pool: Iterable[Item]): - item_data = get_full_item_list().get(item.name) - if item_data.parent_item is None: - # The item has not associated parent, the item is valid - return True - parent_item = item_data.parent_item - # Check if the pool contains the parent item - return parent_item in [pool_item.name for pool_item in pool] - - -def fill_resource_locations(world: World, locked_locations: List[str], location_cache: List[Location]): +def flag_and_add_resource_locations(world: SC2World, item_list: List[FilterItem]) -> None: """ Filters the locations in the world using a trash or Nothing item - :param multiworld: - :param player: - :param locked_locations: - :param location_cache: - :return: + :param world: The sc2 world object + :param item_list: The current list of items to append to """ - open_locations = [location for location in location_cache if location.item is None] + open_locations = [location for location in world.location_cache if location.item is None] plando_locations = get_plando_locations(world) - resource_location_types = get_location_types(world, LocationInclusion.option_resources) - location_data = {sc2_location.name: sc2_location for sc2_location in get_locations(world)} + filler_location_types = get_location_types(world, LocationInclusion.option_filler) + filler_location_flags = get_location_flags(world, LocationInclusion.option_filler) + location_data = {sc2_location.name: sc2_location for sc2_location in DEFAULT_LOCATION_LIST} for location in open_locations: # Go through the locations that aren't locked yet (early unit, etc) if location.name not in plando_locations: # The location is not plando'd sc2_location = location_data[location.name] - if sc2_location.type in resource_location_types: - item_name = world.random.choice(filler_items) + if (sc2_location.type in filler_location_types + or (sc2_location.flags & filler_location_flags) + ): + item_name = world.get_filler_item_name() item = create_item_with_correct_settings(world.player, item_name) + if item.classification & ItemClassification.progression: + # Scouting shall show Filler (or a trap) + item.classification = ItemClassification.filler location.place_locked_item(item) - locked_locations.append(location.name) + world.locked_locations.append(location.name) -def place_exclusion_item(item_name, location, locked_locations, player): - item = create_item_with_correct_settings(player, item_name) - location.place_locked_item(item) - locked_locations.append(location.name) +def flag_mission_order_required_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Marks items that are necessary for item rules in the mission order and forces them to be progression.""" + locks_required = world.custom_mission_order.get_items_to_lock() + locks_done = {item: 0 for item in locks_required} + for item in item_list: + if item.name in locks_required and locks_done[item.name] < locks_required[item.name]: + item.flags |= ItemFilterFlags.Locked + item.flags |= ItemFilterFlags.ForceProgression + locks_done[item.name] += 1 -def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): - total_levels = get_option_value(world, "kerrigan_level_item_sum") - if get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \ - or total_levels == 0 \ - or SC2Campaign.HOTS not in get_enabled_campaigns(world): +def prune_item_pool(world: SC2World, item_list: List[FilterItem]) -> List[StarcraftItem]: + """Prunes the item pool size to be less than the number of available locations""" + + item_list = [ + item for item in item_list + if (ItemFilterFlags.Removed not in item.flags) + and (ItemFilterFlags.Unexcludable & item.flags or ItemFilterFlags.FilterExcluded not in item.flags) + ] + num_items = len(item_list) + last_num_items = -1 + while num_items != last_num_items: + # Remove orphan items until there are no more being removed + item_name_list = [item.name for item in item_list] + item_list = [item for item in item_list + if (ItemFilterFlags.Unexcludable|ItemFilterFlags.AllowedOrphan) & item.flags + or item_list_contains_parent(world, item.data, item_name_list)] + last_num_items = num_items + num_items = len(item_list) + + pool: List[StarcraftItem] = [] + for item in item_list: + ap_item = create_item_with_correct_settings(world.player, item.name, item.flags) + if ItemFilterFlags.ForceProgression in item.flags: + ap_item.classification = ItemClassification.progression + pool.append(ap_item) + + fill_pool_with_kerrigan_levels(world, pool) + filtered_pool = filter_items(world, world.location_cache, pool) + return filtered_pool + + +def item_list_contains_parent(world: SC2World, item_data: ItemData, item_name_list: List[str]) -> bool: + if item_data.parent is None: + # The item has no associated parent, the item is valid + return True + return item_parents.parent_present[item_data.parent](item_name_list, world.options) + + +def pad_item_pool_with_filler(world: SC2World, num_items: int, pool: List[StarcraftItem]): + for _ in range(num_items): + item = create_item_with_correct_settings(world.player, world.get_filler_item_name()) + pool.append(item) + + +def set_up_filler_items_distribution(world: SC2World) -> None: + world.filler_items_distribution = world.options.filler_items_distribution.value.copy() + + prune_fillers(world) + if sum(world.filler_items_distribution.values()) == 0: + world.filler_items_distribution = FillerItemsDistribution.default.copy() + prune_fillers(world) + + +def prune_fillers(world): + mission_flags = world.custom_mission_order.get_used_flags() + include_protoss = ( + MissionFlag.Protoss in mission_flags + or (world.options.take_over_ai_allies and (MissionFlag.AiProtossAlly in mission_flags)) + ) + include_kerrigan = ( + MissionFlag.Kerrigan in mission_flags + and world.options.kerrigan_presence in kerrigan_unit_available + ) + generic_upgrade_research = world.options.generic_upgrade_research + if not include_protoss: + world.filler_items_distribution.pop(item_names.SHIELD_REGENERATION, 0) + if not include_kerrigan: + world.filler_items_distribution.pop(item_names.KERRIGAN_LEVELS_1, 0) + if (generic_upgrade_research in + [ + GenericUpgradeResearch.option_always_auto, + GenericUpgradeResearch.option_auto_in_build + ] + ): + world.filler_items_distribution.pop(item_names.UPGRADE_RESEARCH_SPEED, 0) + world.filler_items_distribution.pop(item_names.UPGRADE_RESEARCH_COST, 0) + + +def get_random_first_mission(world: SC2World, mission_order: SC2MissionOrder) -> SC2Mission: + # Pick an arbitrary lowest-difficulty starer mission + starting_missions = mission_order.get_starting_missions() + mission_difficulties = [ + (mission_order.mission_pools.get_modified_mission_difficulty(mission), mission) + for mission in starting_missions + ] + mission_difficulties.sort(key = lambda difficulty_mission_tuple: difficulty_mission_tuple[0]) + (lowest_difficulty, _) = mission_difficulties[0] + first_mission_candidates = [mission for (difficulty, mission) in mission_difficulties if difficulty == lowest_difficulty] + return world.random.choice(first_mission_candidates) + + +def get_all_missions(mission_order: SC2MissionOrder) -> List[SC2Mission]: + return mission_order.get_used_missions() + + +def create_item_with_correct_settings(player: int, name: str, filter_flags: ItemFilterFlags = ItemFilterFlags.Available) -> StarcraftItem: + data = item_tables.item_table[name] + + item = StarcraftItem(name, data.classification, data.code, player, filter_flags) + if ItemFilterFlags.ForceProgression & filter_flags: + item.classification = ItemClassification.progression + + return item + + +def fill_pool_with_kerrigan_levels(world: SC2World, item_pool: List[StarcraftItem]): + total_levels = world.options.kerrigan_level_item_sum.value + missions = get_all_missions(world.custom_mission_order) + kerrigan_missions = [mission for mission in missions if MissionFlag.Kerrigan in mission.flags] + kerrigan_build_missions = [mission for mission in kerrigan_missions if MissionFlag.NoBuild not in mission.flags] + if (world.options.kerrigan_presence.value not in kerrigan_unit_available + or total_levels == 0 + or not kerrigan_missions + or (world.options.grant_story_levels and not kerrigan_build_missions) + ): return def add_kerrigan_level_items(level_amount: int, item_amount: int): @@ -468,7 +1033,7 @@ def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): item_pool.append(create_item_with_correct_settings(world.player, name)) sizes = [70, 35, 14, 10, 7, 5, 2, 1] - option = get_option_value(world, "kerrigan_level_item_distribution") + option = world.options.kerrigan_level_item_distribution.value assert isinstance(option, int) assert isinstance(total_levels, int) @@ -489,3 +1054,17 @@ def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): else: round_func = ceil add_kerrigan_level_items(size, round_func(float(total_levels) / size)) + + +def push_precollected_items_to_multiworld(world: SC2World, item_list: List[StarcraftItem]) -> None: + # Clear the pre-collected items, as AP will try to do this for us, + # and we want to be able to filer out precollected items in the case of upgrade packages. + auto_precollected_items = world.multiworld.precollected_items[world.player].copy() + world.multiworld.precollected_items[world.player].clear() + for item in auto_precollected_items: + world.multiworld.state.remove(item) + + for item in item_list: + if ItemFilterFlags.StartInventory not in item.filter_flags: + continue + world.multiworld.push_precollected(create_item_with_correct_settings(world.player, item.name, item.filter_flags)) diff --git a/worlds/sc2/client.py b/worlds/sc2/client.py new file mode 100644 index 00000000..d64d44ae --- /dev/null +++ b/worlds/sc2/client.py @@ -0,0 +1,2352 @@ +from __future__ import annotations + +import asyncio +import collections +import copy +import ctypes +import enum +import functools +import inspect +import logging +import multiprocessing +import os.path +import re +import sys +import tempfile +import typing +import queue +import zipfile +import io +import random +import concurrent.futures +import time +import uuid +from pathlib import Path + +# CommonClient import first to trigger ModuleUpdater +from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser +from Utils import init_logging, is_windows, async_start +from .item import item_names, item_parents, race_to_item_type +from .item.item_annotations import ITEM_NAME_ANNOTATIONS +from .item.item_groups import item_name_groups, unlisted_item_name_groups, ItemGroupNames +from . import options, VICTORY_MODULO +from .options import ( + MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence, EnableMorphling, GameDifficulty, + GameSpeed, GenericUpgradeItems, GenericUpgradeResearch, ColorChoice, GenericUpgradeMissions, MaxUpgradeLevel, + LocationInclusion, ExtraLocations, MasteryLocations, SpeedrunLocations, PreventativeLocations, ChallengeLocations, + VanillaLocations, + DisableForcedCamera, SkipCutscenes, GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, RequiredTactics, + SpearOfAdunPresence, SpearOfAdunPresentInNoBuild, SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPassivesPresentInNoBuild, EnableVoidTrade, VoidTradeAgeLimit, void_trade_age_limits_ms, VoidTradeWorkers, + DifficultyDamageModifier, MissionOrderScouting, GenericUpgradeResearchSpeedup, MercenaryHighlanders, WarCouncilNerfs, + is_mission_in_soa_presence, +) +from .mission_order.slot_data import CampaignSlotData, LayoutSlotData, MissionSlotData, MissionOrderObjectSlotData +from .mission_order.entry_rules import SubRuleRuleData, CountMissionsRuleData, MissionEntryRules +from .mission_tables import MissionFlag +from .transfer_data import normalized_unit_types, worker_units +from . import SC2World + + +if __name__ == "__main__": + init_logging("SC2Client", exception_logger="Client") + +logger = logging.getLogger("Client") +sc2_logger = logging.getLogger("Starcraft2") + +import nest_asyncio +from worlds._sc2common import bot +from worlds._sc2common.bot.data import Race +from worlds._sc2common.bot.main import run_game +from worlds._sc2common.bot.player import Bot +from .item.item_tables import ( + lookup_id_to_name, get_full_item_list, ItemData, + ZergItemType, upgrade_bundles, + WEAPON_ARMOR_UPGRADE_MAX_LEVEL, +) +from .locations import SC2WOL_LOC_ID_OFFSET, LocationType, LocationFlag, SC2HOTS_LOC_ID_OFFSET, VICTORY_CACHE_OFFSET +from .mission_tables import ( + lookup_id_to_mission, SC2Campaign, MissionInfo, + lookup_id_to_campaign, SC2Mission, campaign_mission_table, SC2Race +) + +import colorama +from .options import Option, upgrade_included_names +from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart, add_json_item, add_json_location, add_json_text, JSONTypes +from MultiServer import mark_raw + +pool = concurrent.futures.ThreadPoolExecutor(1) +loop = asyncio.get_event_loop_policy().new_event_loop() +nest_asyncio.apply(loop) +MAX_BONUS: int = 28 + +# GitHub repo where the Map/mod data is hosted for /download_data command +DATA_REPO_OWNER = "Ziktofel" +DATA_REPO_NAME = "Archipelago-SC2-data" +DATA_API_VERSION = "API4" + +# Bot controller +CONTROLLER_HEALTH: int = 38281 +CONTROLLER2_HEALTH: int = 38282 + +# Void Trade +TRADE_UNIT = "AP_TradeStructure" # ID of the unit +TRADE_SEND_BUTTON = "AP_TradeStructureDummySend" # ID of the button +TRADE_RECEIVE_1_BUTTON = "AP_TradeStructureDummyReceive" # ID of the button +TRADE_RECEIVE_5_BUTTON = "AP_TradeStructureDummyReceive5" # ID of the button +TRADE_DATASTORAGE_TEAM = "SC2_VoidTrade_" # + Team +TRADE_DATASTORAGE_SLOT = "slot_" # + Slot +TRADE_DATASTORAGE_LOCK = "_lock" +TRADE_LOCK_TIME = 5 # Time in seconds that the DataStorage may be considered safe to edit +TRADE_LOCK_WAIT_LIMIT = 540000 / 1.4 # Time in ms that the client may spend trying to get a lock (540000 = 9 minutes, 1.4 is 'faster' game speed's time scale) + +# Games +STARCRAFT2 = "Starcraft 2" +STARCRAFT2_WOL = "Starcraft 2 Wings of Liberty" + + +# Data version file path. +# This file is used to tell if the downloaded data are outdated +# Associated with /download_data command +def get_metadata_file() -> str: + return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt" + + +def _remap_color_option(slot_data_version: int, color: int) -> int: + """Remap colour options for backwards compatibility with older slot data""" + if slot_data_version < 4 and color == ColorChoice.option_mengsk: + return ColorChoice.option_default + return color + + +class ConfigurableOptionType(enum.Enum): + INTEGER = enum.auto() + ENUM = enum.auto() + +class ConfigurableOptionInfo(typing.NamedTuple): + name: str + variable_name: str + option_class: typing.Type[Option] + option_type: ConfigurableOptionType = ConfigurableOptionType.ENUM + can_break_logic: bool = False + + +class ColouredMessage: + def __init__(self, text: str = '', *, keep_markup: bool = False) -> None: + self.parts: typing.List[dict] = [] + if text: + self(text, keep_markup=keep_markup) + def __call__(self, text: str, *, keep_markup: bool = False) -> 'ColouredMessage': + add_json_text(self.parts, text, keep_markup=keep_markup) + return self + def coloured(self, text: str, colour: str, *, keep_markup: bool = False) -> 'ColouredMessage': + add_json_text(self.parts, text, type="color", color=colour, keep_markup=keep_markup) + return self + def location(self, location_id: int, player_id: int) -> 'ColouredMessage': + add_json_location(self.parts, location_id, player_id) + return self + def item(self, item_id: int, player_id: int, flags: int = 0) -> 'ColouredMessage': + add_json_item(self.parts, item_id, player_id, flags) + return self + def player(self, player_id: int) -> 'ColouredMessage': + add_json_text(self.parts, str(player_id), type=JSONTypes.player_id) + return self + def send(self, ctx: SC2Context) -> None: + ctx.on_print_json({"data": self.parts, "cmd": "PrintJSON"}) + + +class StarcraftClientProcessor(ClientCommandProcessor): + ctx: SC2Context + + def formatted_print(self, text: str) -> None: + """Prints with kivy formatting to the GUI, and also prints to command-line and to all logs""" + # Note(mm): Bold/underline can help readability, but unfortunately the CommonClient does not filter bold tags from command-line output. + # Regardless, using `on_print_json` to get formatted text in the GUI and output in the command-line and in the logs, + # without having to branch code from CommonClient + self.ctx.on_print_json({"data": [{"text": text, "keep_markup": True}]}) + + def _cmd_difficulty(self, difficulty: str = "") -> bool: + """Overrides the current difficulty set for the world. Takes the argument casual, normal, hard, or brutal""" + arguments = difficulty.split() + num_arguments = len(arguments) + + if num_arguments > 0: + difficulty_choice = arguments[0].lower() + if difficulty_choice == "casual": + self.ctx.difficulty_override = 0 + elif difficulty_choice == "normal": + self.ctx.difficulty_override = 1 + elif difficulty_choice == "hard": + self.ctx.difficulty_override = 2 + elif difficulty_choice == "brutal": + self.ctx.difficulty_override = 3 + else: + self.output("Unable to parse difficulty '" + arguments[0] + "'") + return False + + self.output("Difficulty set to " + arguments[0]) + return True + + else: + if self.ctx.difficulty == -1: + self.output("Please connect to a seed before checking difficulty.") + else: + current_difficulty = self.ctx.difficulty + if self.ctx.difficulty_override >= 0: + current_difficulty = self.ctx.difficulty_override + self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty]) + self.output("To change the difficulty, add the name of the difficulty after the command.") + return False + + + def _cmd_game_speed(self, game_speed: str = "") -> bool: + """Overrides the current game speed for the world. + Takes the arguments default, slower, slow, normal, fast, faster""" + arguments = game_speed.split() + num_arguments = len(arguments) + + if num_arguments > 0: + speed_choice = arguments[0].lower() + if speed_choice == "default": + self.ctx.game_speed_override = 0 + elif speed_choice == "slower": + self.ctx.game_speed_override = 1 + elif speed_choice == "slow": + self.ctx.game_speed_override = 2 + elif speed_choice == "normal": + self.ctx.game_speed_override = 3 + elif speed_choice == "fast": + self.ctx.game_speed_override = 4 + elif speed_choice == "faster": + self.ctx.game_speed_override = 5 + else: + self.output("Unable to parse game speed '" + arguments[0] + "'") + return False + + self.output("Game speed set to " + arguments[0]) + return True + + else: + if self.ctx.game_speed == -1: + self.output("Please connect to a seed before checking game speed.") + else: + current_speed = self.ctx.game_speed + if self.ctx.game_speed_override >= 0: + current_speed = self.ctx.game_speed_override + self.output("Current game speed: " + + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed]) + self.output("To change the game speed, add the name of the speed after the command," + " or Default to select based on difficulty.") + return False + + @mark_raw + def _cmd_received(self, filter_search: str = "") -> bool: + """List received items. + Pass in a parameter to filter the search by partial item name or exact item group. + Use '/received recent ' to list the last 'number' items received (default 20).""" + if self.ctx.slot is None: + self.formatted_print("Connect to a slot to view what items are received.") + return True + if filter_search.casefold().startswith('recent'): + return self._received_recent(filter_search[len('recent'):].strip()) + # Groups must be matched case-sensitively, so we properly capitalize the search term + # eg. "Spear of Adun" over "Spear Of Adun" or "spear of adun" + # This fails a lot of item name matches, but those should be found by partial name match + group_filter = '' + for group_name in item_name_groups: + if group_name in unlisted_item_name_groups: + continue + if filter_search.casefold() == group_name.casefold(): + group_filter = group_name + break + + def item_matches_filter(item_name: str) -> bool: + # The filter can be an exact group name or a partial item name + # Partial item name can be matched case-insensitively + if filter_search.casefold() in item_name.casefold(): + return True + # The search term should already be formatted as a group name + if group_filter and item_name in item_name_groups[group_filter]: + return True + return False + + items = get_full_item_list() + categorized_items: typing.Dict[SC2Race, typing.List[typing.Union[int, str]]] = {} + parent_to_child: typing.Dict[typing.Union[int, str], typing.List[int]] = {} + items_received: typing.Dict[int, typing.List[NetworkItem]] = {} + for item in self.ctx.items_received: + items_received.setdefault(item.item, []).append(item) + items_received_set = set(items_received) + for item_data in items.values(): + if item_data.parent: + parent_rule = item_parents.parent_present[item_data.parent] + if parent_rule.constraint_group is not None and parent_rule.constraint_group in items: + parent_to_child.setdefault(items[parent_rule.constraint_group].code, []).append(item_data.code) + continue + race = items[parent_rule.parent_items()[0]].race + categorized_items.setdefault(race, []) + if parent_rule.display_string not in categorized_items[race]: + categorized_items[race].append(parent_rule.display_string) + parent_to_child.setdefault(parent_rule.display_string, []).append(item_data.code) + else: + categorized_items.setdefault(item_data.race, []).append(item_data.code) + + def display_info(element: typing.Union[SC2Race, str, int]) -> tuple: + """Return (should display, name, type, children, sum(obtained), sum(matching filter))""" + have_item = isinstance(element, int) and element in items_received_set + if isinstance(element, SC2Race): + children: typing.Sequence[typing.Union[str, int]] = categorized_items[faction] + name = element.name + elif isinstance(element, int): + children = parent_to_child.get(element, []) + name = self.ctx.item_names.lookup_in_game(element) + else: + assert isinstance(element, str) + children = parent_to_child[element] + name = element + matches_filter = item_matches_filter(name) + child_states = [display_info(child) for child in children] + return ( + (have_item and matches_filter) or any(child_state[0] for child_state in child_states), + name, + element, + child_states, + sum(child_state[4] for child_state in child_states) + have_item, + sum(child_state[5] for child_state in child_states) + (have_item and matches_filter), + ) + + def display_tree( + should_display: bool, name: str, element: typing.Union[SC2Race, str, int], child_states: tuple, indent: int = 0 + ) -> None: + if not should_display: + return + assert self.ctx.slot is not None + indent_str = " " * indent + if isinstance(element, SC2Race): + self.formatted_print(f" [u]{name}[/u] ") + for child in child_states: + display_tree(*child[:4]) + elif isinstance(element, str): + ColouredMessage(indent_str)("- ").coloured(name, "white").send(self.ctx) + for child in child_states: + display_tree(*child[:4], indent=indent+2) + elif isinstance(element, int): + items = items_received.get(element, []) + if not items: + ColouredMessage(indent_str)("- ").coloured(name, "red")(" - not obtained").send(self.ctx) + for item in items: + (ColouredMessage(indent_str)('- ') + .item(item.item, self.ctx.slot, flags=item.flags) + (" from ").location(item.location, item.player) + (" by ").player(item.player) + ).send(self.ctx) + for child in child_states: + display_tree(*child[:4], indent=indent+2) + non_matching_descendents = sum(child[5] - child[4] for child in children) + if non_matching_descendents > 0: + self.formatted_print(f"{indent_str} + {non_matching_descendents} child items that don't match the filter") + + + item_types_obtained = 0 + items_obtained_matching_filter = 0 + for faction in SC2Race: + should_display, name, element, children, faction_items_obtained, faction_items_matching_filter = display_info(faction) + item_types_obtained += faction_items_obtained + items_obtained_matching_filter += faction_items_matching_filter + display_tree(should_display, name, element, children) + if filter_search == "": + self.formatted_print(f"[b]Obtained: {len(self.ctx.items_received)} items ({item_types_obtained} types)[/b]") + else: + self.formatted_print(f"[b]Filter \"{filter_search}\" found {items_obtained_matching_filter} out of {item_types_obtained} obtained item types[/b]") + return True + + def _received_recent(self, amount: str) -> bool: + assert self.ctx.slot is not None + try: + display_amount = int(amount) + except ValueError: + display_amount = 20 + display_amount = min(display_amount, len(self.ctx.items_received)) + self.formatted_print(f"Last {display_amount} of {len(self.ctx.items_received)} items received (most recent last):") + for item in self.ctx.items_received[-display_amount:]: + ( + ColouredMessage() + .item(item.item, self.ctx.slot, item.flags) + (" from ").location(item.location, item.player) + (" by ").player(item.player) + ).send(self.ctx) + return True + + def _cmd_option(self, option_name: str = "", option_value: str = "") -> None: + """Sets a Starcraft game option that can be changed after generation. Use "/option list" to see all options.""" + + LOGIC_WARNING = " *Note changing this may result in logically unbeatable games*\n" + + configurable_options = ( + ConfigurableOptionInfo('speed', 'game_speed', options.GameSpeed), + ConfigurableOptionInfo('kerrigan_presence', 'kerrigan_presence', options.KerriganPresence, can_break_logic=True), + ConfigurableOptionInfo('kerrigan_level_cap', 'kerrigan_total_level_cap', options.KerriganTotalLevelCap, ConfigurableOptionType.INTEGER, can_break_logic=True), + ConfigurableOptionInfo('kerrigan_mission_level_cap', 'kerrigan_levels_per_mission_completed_cap', options.KerriganLevelsPerMissionCompletedCap, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('kerrigan_levels_per_mission', 'kerrigan_levels_per_mission_completed', options.KerriganLevelsPerMissionCompleted, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('grant_story_levels', 'grant_story_levels', options.GrantStoryLevels, can_break_logic=True), + ConfigurableOptionInfo('grant_story_tech', 'grant_story_tech', options.GrantStoryTech, can_break_logic=True), + ConfigurableOptionInfo('control_ally', 'take_over_ai_allies', options.TakeOverAIAllies, can_break_logic=True), + ConfigurableOptionInfo('soa_presence', 'spear_of_adun_presence', options.SpearOfAdunPresence, can_break_logic=True), + ConfigurableOptionInfo('soa_in_nobuilds', 'spear_of_adun_present_in_no_build', options.SpearOfAdunPresentInNoBuild, can_break_logic=True), + # Note(mm): Technically SOA passive presence is in the logic for Amon's Fall if Takeover AI Allies is true, + # but that's edge case enough I don't think we should warn about it. + ConfigurableOptionInfo('soa_passive_presence', 'spear_of_adun_passive_ability_presence', options.SpearOfAdunPassiveAbilityPresence), + ConfigurableOptionInfo('soa_passives_in_nobuilds', 'spear_of_adun_passive_present_in_no_build', options.SpearOfAdunPassivesPresentInNoBuild), + ConfigurableOptionInfo('max_upgrade_level', 'max_upgrade_level', options.MaxUpgradeLevel, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('generic_upgrade_research', 'generic_upgrade_research', options.GenericUpgradeResearch), + ConfigurableOptionInfo('generic_upgrade_research_speedup', 'generic_upgrade_research_speedup', options.GenericUpgradeResearchSpeedup), + ConfigurableOptionInfo('minerals_per_item', 'minerals_per_item', options.MineralsPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('gas_per_item', 'vespene_per_item', options.VespenePerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('supply_per_item', 'starting_supply_per_item', options.StartingSupplyPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('max_supply_per_item', 'maximum_supply_per_item', options.MaximumSupplyPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('reduced_supply_per_item', 'maximum_supply_reduction_per_item', options.MaximumSupplyReductionPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('lowest_max_supply', 'lowest_maximum_supply', options.LowestMaximumSupply, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('research_cost_per_item', 'research_cost_reduction_per_item', options.ResearchCostReductionPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('no_forced_camera', 'disable_forced_camera', options.DisableForcedCamera), + ConfigurableOptionInfo('skip_cutscenes', 'skip_cutscenes', options.SkipCutscenes), + ConfigurableOptionInfo('enable_morphling', 'enable_morphling', options.EnableMorphling, can_break_logic=True), + ConfigurableOptionInfo('difficulty_damage_modifier', 'difficulty_damage_modifier', options.DifficultyDamageModifier), + ConfigurableOptionInfo('void_trade_age_limit', 'trade_age_limit', options.VoidTradeAgeLimit), + ConfigurableOptionInfo('void_trade_workers', 'trade_workers_allowed', options.VoidTradeWorkers), + ConfigurableOptionInfo('mercenary_highlanders', 'mercenary_highlanders', options.MercenaryHighlanders), + ) + + WARNING_COLOUR = "salmon" + CMD_COLOUR = "slateblue" + boolean_option_map = { + 'y': 'true', 'yes': 'true', 'n': 'false', 'no': 'false', 'true': 'true', 'false': 'false', + } + + help_message = ColouredMessage(inspect.cleandoc(""" + Options + -------------------- + """))('\n') + for option in configurable_options: + option_help_text = inspect.cleandoc(option.option_class.__doc__ or "No description provided.").split('\n', 1)[0] + help_message.coloured(option.name, CMD_COLOUR)(": " + " | ".join(option.option_class.options) + + f" -- {option_help_text}\n") + if option.can_break_logic: + help_message.coloured(LOGIC_WARNING, WARNING_COLOUR) + help_message("--------------------\nEnter an option without arguments to see its current value.\n") + + if not option_name or option_name == 'list' or option_name == 'help': + help_message.send(self.ctx) + return + for option in configurable_options: + if option_name == option.name: + option_value = boolean_option_map.get(option_value.lower(), option_value) + if not option_value: + pass + elif option.option_type == ConfigurableOptionType.ENUM and option_value in option.option_class.options: + self.ctx.__dict__[option.variable_name] = option.option_class.options[option_value] + elif option.option_type == ConfigurableOptionType.INTEGER: + try: + self.ctx.__dict__[option.variable_name] = int(option_value, base=0) + except: + self.output(f"{option_value} is not a valid integer") + else: + self.output(f"Unknown option value '{option_value}'") + ColouredMessage(f"{option.name} is '{option.option_class.get_option_name(self.ctx.__dict__[option.variable_name])}'").send(self.ctx) + break + else: + self.output(f"Unknown option '{option_name}'") + help_message.send(self.ctx) + + def _cmd_color(self, faction: str = "", color: str = "") -> None: + """Changes the player color for a given faction.""" + player_colors = [ + "White", "Red", "Blue", "Teal", + "Purple", "Yellow", "Orange", "Green", + "LightPink", "Violet", "LightGrey", "DarkGreen", + "Brown", "LightGreen", "DarkGrey", "Pink", + "Rainbow", "Mengsk", "BrightLime", "Arcane", "Ember", "HotPink", + "Random", "Default" + ] + var_names = { + 'raynor': 'player_color_raynor', + 'kerrigan': 'player_color_zerg', + 'primal': 'player_color_zerg_primal', + 'protoss': 'player_color_protoss', + 'nova': 'player_color_nova', + } + faction = faction.lower() + if not faction: + for faction_name, key in var_names.items(): + self.output(f"Current player color for {faction_name}: {player_colors[self.ctx.__dict__[key]]}") + self.output("To change your color, add the faction name and color after the command.") + self.output("Available factions: " + ', '.join(var_names)) + self.output("Available colors: " + ', '.join(player_colors)) + return + elif faction not in var_names: + self.output(f"Unknown faction '{faction}'.") + self.output("Available factions: " + ', '.join(var_names)) + return + match_colors = [player_color.lower() for player_color in player_colors] + if not color: + self.output(f"Current player color for {faction}: {player_colors[self.ctx.__dict__[var_names[faction]]]}") + self.output("To change this faction's colors, add the name of the color after the command.") + self.output("Available colors: " + ', '.join(player_colors)) + else: + if color.lower() not in match_colors: + self.output(color + " is not a valid color. Available colors: " + ', '.join(player_colors)) + return + if color.lower() == "random": + color = random.choice(player_colors[:-2]) + self.ctx.__dict__[var_names[faction]] = match_colors.index(color.lower()) + self.ctx.pending_color_update = True + self.output(f"Color for {faction} set to " + player_colors[self.ctx.__dict__[var_names[faction]]]) + + def _cmd_windowed_mode(self, value="") -> None: + """Controls whether sc2 will launch in Windowed mode. Persists across sessions.""" + if not value: + sc2_logger.info("Use `/windowed_mode [true|false]` to set the windowed mode") + elif value.casefold() in ('t', 'true', 'yes', 'y'): + SC2World.settings.game_windowed_mode = True + force_settings_save_on_close() + else: + SC2World.settings.game_windowed_mode = False + force_settings_save_on_close() + sc2_logger.info(f"Windowed mode is: {SC2World.settings.game_windowed_mode}") + + def _cmd_disable_mission_check(self) -> bool: + """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play + the next mission in a chain the other player is doing.""" + self.ctx.missions_unlocked = True + sc2_logger.info("Mission check has been disabled") + return True + + @mark_raw + def _cmd_set_path(self, path: str = '') -> bool: + """Manually set the SC2 install directory (if the automatic detection fails).""" + if path: + os.environ["SC2PATH"] = path + is_mod_installed_correctly() + return True + else: + sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") + return False + + def _cmd_download_data(self) -> bool: + """Download the most recent release of the necessary files for playing SC2 with + Archipelago. Will overwrite existing files.""" + pool.submit(self._download_data, self.ctx) + return True + + @staticmethod + def _download_data(ctx: SC2Context) -> bool: + if "SC2PATH" not in os.environ: + check_game_install_path() + + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + metadata = f.read() + else: + metadata = None + + tempzip, metadata = download_latest_release_zip( + DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, metadata=metadata, force_download=True) + + if tempzip: + try: + zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) + sc2_logger.info("Download complete. Package installed.") + if metadata is not None: + with open(get_metadata_file(), "w") as f: + f.write(metadata) + finally: + os.remove(tempzip) + else: + sc2_logger.warning("Download aborted/failed. Read the log for more information.") + return False + ctx.data_out_of_date = False + return True + + +class SC2JSONtoTextParser(JSONtoTextParser): + def __init__(self, ctx: SC2Context) -> None: + self.handlers = { + "ItemSend": self._handle_color, + "ItemCheat": self._handle_color, + "Hint": self._handle_color, + } + super().__init__(ctx) + + def _handle_color(self, node: JSONMessagePart) -> str: + codes = node["color"].split(";") + buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes) + return buffer + self._handle_text(node) + '
' + + def _handle_item_name(self, node: JSONMessagePart) -> str: + if self.ctx.slot_info[node["player"]].game == STARCRAFT2: + annotation = ITEM_NAME_ANNOTATIONS.get(node["text"]) + if annotation is not None: + node["text"] += f" {annotation}" + return super()._handle_item_name(node) + + def color_code(self, code: str) -> str: + return '' + + +class SC2Context(CommonContext): + command_processor = StarcraftClientProcessor + game = STARCRAFT2 + items_handling = 0b111 + + def __init__(self, *args, **kwargs) -> None: + super(SC2Context, self).__init__(*args, **kwargs) + self.raw_text_parser = SC2JSONtoTextParser(self) + + self.data_out_of_date: bool = False + self.difficulty = -1 + self.game_speed = -1 + self.disable_forced_camera = 0 + self.skip_cutscenes = 0 + self.all_in_choice = 0 + self.mission_order = 0 + self.player_color_raynor = ColorChoice.option_blue + self.player_color_zerg = ColorChoice.option_orange + self.player_color_zerg_primal = ColorChoice.option_purple + self.player_color_protoss = ColorChoice.option_blue + self.player_color_nova = ColorChoice.option_dark_grey + self.pending_color_update = False + self.kerrigan_presence: int = KerriganPresence.default + self.kerrigan_primal_status = 0 + self.enable_morphling = EnableMorphling.default + self.custom_mission_order: typing.List[CampaignSlotData] = [] + self.mission_id_to_entry_rules: typing.Dict[int, MissionEntryRules] + self.final_mission_ids: typing.List[int] = [29] + self.final_locations: typing.List[int] = [] + self.announcements: queue.Queue = queue.Queue() + self.sc2_run_task: typing.Optional[asyncio.Task] = None + self.missions_unlocked: bool = False # allow launching missions ignoring requirements + self.max_upgrade_level: int = MaxUpgradeLevel.default + self.generic_upgrade_missions = 0 + self.generic_upgrade_research = 0 + self.generic_upgrade_research_speedup: int = GenericUpgradeResearchSpeedup.default + self.generic_upgrade_items = 0 + self.location_inclusions: typing.Dict[LocationType, int] = {} + self.location_inclusions_by_flag: typing.Dict[LocationFlag, int] = {} + self.plando_locations: typing.List[str] = [] + self.difficulty_override = -1 + self.game_speed_override = -1 + self.mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} + self.last_bot: typing.Optional[ArchipelagoBot] = None + self.slot_data_version = 2 + self.required_tactics: int = RequiredTactics.default + self.grant_story_tech: int = GrantStoryTech.default + self.grant_story_levels: int = GrantStoryLevels.default + self.take_over_ai_allies: int = TakeOverAIAllies.default + self.spear_of_adun_presence = SpearOfAdunPresence.option_not_present + self.spear_of_adun_present_in_no_build = SpearOfAdunPresentInNoBuild.option_false + self.spear_of_adun_passive_ability_presence = SpearOfAdunPassiveAbilityPresence.option_not_present + self.spear_of_adun_passive_present_in_no_build = SpearOfAdunPassivesPresentInNoBuild.option_false + self.minerals_per_item: int = 15 # For backwards compat with games generated pre-0.4.5 + self.vespene_per_item: int = 15 # For backwards compat with games generated pre-0.4.5 + self.starting_supply_per_item: int = 2 # For backwards compat with games generated pre-0.4.5 + self.maximum_supply_per_item: int = 2 + self.maximum_supply_reduction_per_item: int = options.MaximumSupplyReductionPerItem.default + self.lowest_maximum_supply: int = options.LowestMaximumSupply.default + self.research_cost_reduction_per_item: int = options.ResearchCostReductionPerItem.default + self.use_nova_wol_fallback: bool = False + self.use_nova_nco_fallback: bool = False + self.mercenary_highlanders: bool = False + self.kerrigan_levels_per_mission_completed = 0 + self.trade_enabled: int = EnableVoidTrade.default + self.trade_age_limit: int = VoidTradeAgeLimit.default + self.trade_workers_allowed: int = VoidTradeWorkers.default + self.trade_underway: bool = False + self.trade_latest_reply: typing.Optional[dict] = None + self.trade_reply_event = asyncio.Event() + self.trade_lock_wait: int = 0 + self.trade_lock_start: typing.Optional[float] = None + self.trade_response: typing.Optional[str] = None + self.difficulty_damage_modifier: int = DifficultyDamageModifier.default + self.mission_order_scouting = MissionOrderScouting.option_none + self.mission_item_classification: typing.Optional[typing.Dict[str, int]] = None + self.war_council_nerfs: bool = False + + async def server_auth(self, password_requested: bool = False) -> None: + self.game = STARCRAFT2 + if password_requested and not self.password: + await super(SC2Context, self).server_auth(password_requested) + await self.get_username() + await self.send_connect() + if self.ui: + self.ui.first_check = True + + def is_legacy_game(self): + return self.game == STARCRAFT2_WOL + + def event_invalid_game(self): + if self.is_legacy_game(): + self.game = STARCRAFT2 + super().event_invalid_game() + else: + self.game = STARCRAFT2_WOL + async_start(self.send_connect()) + + def trade_storage_team(self) -> str: + return f"{TRADE_DATASTORAGE_TEAM}{self.team}" + + def trade_storage_slot(self) -> str: + return f"{TRADE_DATASTORAGE_SLOT}{self.slot}" + + def _apply_host_settings_to_options(self) -> None: + if str(SC2World.settings.game_difficulty).casefold() == 'casual': + self.difficulty = GameDifficulty.option_casual + elif str(SC2World.settings.game_difficulty).casefold() == 'normal': + self.difficulty = GameDifficulty.option_normal + elif str(SC2World.settings.game_difficulty).casefold() == 'hard': + self.difficulty = GameDifficulty.option_hard + elif str(SC2World.settings.game_difficulty).casefold() == 'brutal': + self.difficulty = GameDifficulty.option_brutal + + if str(SC2World.settings.game_speed).casefold() == 'slower': + self.game_speed = GameSpeed.option_slower + elif str(SC2World.settings.game_speed).casefold() == 'slow': + self.game_speed = GameSpeed.option_slow + elif str(SC2World.settings.game_speed).casefold() == 'normal': + self.game_speed = GameSpeed.option_normal + elif str(SC2World.settings.game_speed).casefold() == 'fast': + self.game_speed = GameSpeed.option_fast + elif str(SC2World.settings.game_speed).casefold() == 'faster': + self.game_speed = GameSpeed.option_faster + + if str(SC2World.settings.disable_forced_camera).casefold() == 'true': + self.disable_forced_camera = DisableForcedCamera.option_true + elif str(SC2World.settings.disable_forced_camera).casefold() == 'false': + self.disable_forced_camera = DisableForcedCamera.option_false + + if str(SC2World.settings.skip_cutscenes).casefold() == 'true': + self.skip_cutscenes = SkipCutscenes.option_true + elif str(SC2World.settings.skip_cutscenes).casefold() == 'false': + self.skip_cutscenes = SkipCutscenes.option_false + + def on_package(self, cmd: str, args: dict) -> None: + if cmd == "Connected": + # Set up the trade storage + async_start(self.send_msgs([ + { # We want to know about other clients' Set commands for locking + "cmd": "SetNotify", + "keys": [self.trade_storage_team()], + }, + { + "cmd": "Set", + "key": self.trade_storage_team(), + "default": { TRADE_DATASTORAGE_LOCK: 0 }, + "operations": [{"operation": "default", "value": None}] # value is ignored + } + ])) + + self.difficulty = args["slot_data"]["game_difficulty"] + self.game_speed = args["slot_data"].get("game_speed", GameSpeed.option_default) + self.disable_forced_camera = args["slot_data"].get("disable_forced_camera", DisableForcedCamera.default) + self.skip_cutscenes = args["slot_data"].get("skip_cutscenes", SkipCutscenes.default) + self.all_in_choice = args["slot_data"]["all_in_map"] + self.slot_data_version = args["slot_data"].get("version", 2) + + self._apply_host_settings_to_options() + + if self.slot_data_version < 4: + # Maintaining backwards compatibility with older slot data + slot_req_table: dict = args["slot_data"]["mission_req"] + + first_item = list(slot_req_table.keys())[0] + if first_item in [str(campaign.id) for campaign in SC2Campaign]: + # Multi-campaign + mission_req_table = {} + for campaign_id in slot_req_table: + campaign = lookup_id_to_campaign[int(campaign_id)] + mission_req_table[campaign] = { + mission: self.parse_mission_info(mission_info) + for mission, mission_info in slot_req_table[campaign_id].items() + } + else: + # Old format + mission_req_table = {SC2Campaign.GLOBAL: { + mission: self.parse_mission_info(mission_info) + for mission, mission_info in slot_req_table.items() + } + } + + self.custom_mission_order = self.parse_mission_req_table(mission_req_table) + + if self.slot_data_version >= 4: + self.custom_mission_order = [ + CampaignSlotData( + **{field:value for field, value in campaign_data.items() if field not in ["layouts", "entry_rule"]}, + entry_rule = SubRuleRuleData.parse_from_dict(campaign_data["entry_rule"]), + layouts = [ + LayoutSlotData( + **{field:value for field, value in layout_data.items() if field not in ["missions", "entry_rule"]}, + entry_rule = SubRuleRuleData.parse_from_dict(layout_data["entry_rule"]), + missions = [ + [ + MissionSlotData( + **{field:value for field, value in mission_data.items() if field != "entry_rule"}, + entry_rule = SubRuleRuleData.parse_from_dict(mission_data["entry_rule"]) + ) for mission_data in column + ] for column in layout_data["missions"] + ] + ) for layout_data in campaign_data["layouts"] + ] + ) for campaign_data in args["slot_data"]["custom_mission_order"] + ] + self.mission_id_to_entry_rules = { + mission.mission_id: MissionEntryRules(mission.entry_rule, layout.entry_rule, campaign.entry_rule) + for campaign in self.custom_mission_order for layout in campaign.layouts + for column in layout.missions for mission in column + } + + self.mission_order = args["slot_data"].get("mission_order", MissionOrder.option_vanilla) + if self.slot_data_version < 4: + self.final_mission_ids = [args["slot_data"].get("final_mission", SC2Mission.ALL_IN.id)] + else: + self.final_mission_ids = args["slot_data"].get("final_mission_ids", [SC2Mission.ALL_IN.id]) + self.final_locations = [get_location_id(mission_id, 0) for mission_id in self.final_mission_ids] + + self.player_color_raynor = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_terran_raynor", ColorChoice.option_blue) + ) + self.player_color_zerg = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_zerg", ColorChoice.option_orange) + ) + self.player_color_zerg_primal = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_zerg_primal", ColorChoice.option_purple) + ) + self.player_color_protoss = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_protoss", ColorChoice.option_blue) + ) + self.player_color_nova = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_nova", ColorChoice.option_dark_grey) + ) + self.war_council_nerfs = args["slot_data"].get("war_council_nerfs", WarCouncilNerfs.option_false) + self.mercenary_highlanders = args["slot_data"].get("mercenary_highlanders", MercenaryHighlanders.option_false) + self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", GenericUpgradeMissions.default) + self.max_upgrade_level = args["slot_data"].get("max_upgrade_level", MaxUpgradeLevel.default) + self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", GenericUpgradeItems.option_individual_items) + self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", GenericUpgradeResearch.option_vanilla) + self.generic_upgrade_research_speedup = args["slot_data"].get("generic_upgrade_research_speedup", GenericUpgradeResearchSpeedup.default) + self.kerrigan_presence = args["slot_data"].get("kerrigan_presence", KerriganPresence.option_vanilla) + self.kerrigan_primal_status = args["slot_data"].get("kerrigan_primal_status", KerriganPrimalStatus.option_vanilla) + self.kerrigan_levels_per_mission_completed = args["slot_data"].get("kerrigan_levels_per_mission_completed", 0) + self.kerrigan_levels_per_mission_completed_cap = args["slot_data"].get("kerrigan_levels_per_mission_completed_cap", -1) + self.kerrigan_total_level_cap = args["slot_data"].get("kerrigan_total_level_cap", -1) + self.enable_morphling = args["slot_data"].get("enable_morphling", EnableMorphling.option_false) + self.grant_story_tech = args["slot_data"].get("grant_story_tech", GrantStoryTech.option_no_grant) + self.grant_story_levels = args["slot_data"].get("grant_story_levels", GrantStoryLevels.option_additive) + self.required_tactics = args["slot_data"].get("required_tactics", RequiredTactics.option_standard) + self.take_over_ai_allies = args["slot_data"].get("take_over_ai_allies", TakeOverAIAllies.option_false) + self.spear_of_adun_presence = args["slot_data"].get("spear_of_adun_presence", SpearOfAdunPresence.option_not_present) + self.spear_of_adun_present_in_no_build = args["slot_data"].get("spear_of_adun_present_in_no_build", SpearOfAdunPresentInNoBuild.option_false) + if self.slot_data_version < 4: + self.spear_of_adun_passive_ability_presence = args["slot_data"].get("spear_of_adun_autonomously_cast_ability_presence", SpearOfAdunPassiveAbilityPresence.option_not_present) + self.spear_of_adun_passive_present_in_no_build = args["slot_data"].get("spear_of_adun_autonomously_cast_present_in_no_build", SpearOfAdunPassivesPresentInNoBuild.option_false) + else: + self.spear_of_adun_passive_ability_presence = args["slot_data"].get("spear_of_adun_passive_ability_presence", SpearOfAdunPassiveAbilityPresence.option_not_present) + self.spear_of_adun_passive_present_in_no_build = args["slot_data"].get("spear_of_adun_passive_present_in_no_build", SpearOfAdunPassivesPresentInNoBuild.option_false) + self.minerals_per_item = args["slot_data"].get("minerals_per_item", 15) + self.vespene_per_item = args["slot_data"].get("vespene_per_item", 15) + self.starting_supply_per_item = args["slot_data"].get("starting_supply_per_item", 2) + self.maximum_supply_per_item = args["slot_data"].get("maximum_supply_per_item", options.MaximumSupplyPerItem.default) + self.maximum_supply_reduction_per_item = args["slot_data"].get("maximum_supply_reduction_per_item", options.MaximumSupplyReductionPerItem.default) + self.lowest_maximum_supply = args["slot_data"].get("lowest_maximum_supply", options.LowestMaximumSupply.default) + self.research_cost_reduction_per_item = args["slot_data"].get("research_cost_reduction_per_item", options.ResearchCostReductionPerItem.default) + self.use_nova_wol_fallback = args["slot_data"].get("use_nova_wol_fallback", True) + if self.slot_data_version < 4: + self.use_nova_nco_fallback = args["slot_data"].get("nova_covert_ops_only", False) and self.mission_order == MissionOrder.option_vanilla + else: + self.use_nova_nco_fallback = args["slot_data"].get("use_nova_nco_fallback", False) + self.trade_enabled = args["slot_data"].get("enable_void_trade", EnableVoidTrade.option_false) + self.trade_age_limit = args["slot_data"].get("void_trade_age_limit", VoidTradeAgeLimit.default) + self.trade_workers_allowed = args["slot_data"].get("void_trade_workers", VoidTradeWorkers.default) + self.difficulty_damage_modifier = args["slot_data"].get("difficulty_damage_modifier", DifficultyDamageModifier.option_true) + self.mission_order_scouting = args["slot_data"].get("mission_order_scouting", MissionOrderScouting.option_none) + self.mission_item_classification = args["slot_data"].get("mission_item_classification") + + if self.required_tactics == RequiredTactics.option_no_logic: + # Locking Grant Story Tech/Levels if no logic + self.grant_story_tech = GrantStoryTech.option_grant + self.grant_story_levels = GrantStoryLevels.option_minimum + + self.location_inclusions = { + LocationType.VICTORY: LocationInclusion.option_enabled, # Victory checks are always enabled + LocationType.VICTORY_CACHE: LocationInclusion.option_enabled, # Victory checks are always enabled + LocationType.VANILLA: args["slot_data"].get("vanilla_locations", VanillaLocations.default), + LocationType.EXTRA: args["slot_data"].get("extra_locations", ExtraLocations.default), + LocationType.CHALLENGE: args["slot_data"].get("challenge_locations", ChallengeLocations.default), + LocationType.MASTERY: args["slot_data"].get("mastery_locations", MasteryLocations.default), + } + self.location_inclusions_by_flag = { + LocationFlag.SPEEDRUN: args["slot_data"].get("speedrun_locations", SpeedrunLocations.default), + LocationFlag.PREVENTATIVE: args["slot_data"].get("preventative_locations", PreventativeLocations.default), + } + self.plando_locations = args["slot_data"].get("plando_locations", []) + + self.build_location_to_mission_mapping() + + # Looks for the required maps and mods for SC2. Runs check_game_install_path. + maps_present = is_mod_installed_correctly() + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + current_ver = f.read() + sc2_logger.debug(f"Current version: {current_ver}") + if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver): + ( + ColouredMessage().coloured("NOTICE: Update for required files found. ", colour="red") + ("Run ").coloured("/download_data", colour="slateblue") + (" to install.") + ).send(self) + self.data_out_of_date = True + elif maps_present: + ( + ColouredMessage() + .coloured("NOTICE: Your map files may be outdated (version number not found). ", colour="red") + ("Run ").coloured("/download_data", colour="slateblue") + (" to install.") + ).send(self) + self.data_out_of_date = True + + ColouredMessage("[b]Check the Launcher tab to start playing.[/b]", keep_markup=True).send(self) + + elif cmd == "SetReply": + # Currently can only be Void Trade reply + self.trade_latest_reply = args + self.trade_reply_event.set() + + @staticmethod + def parse_mission_info(mission_info: dict[str, typing.Any]) -> MissionInfo: + if mission_info.get("id") is not None: + mission_info["mission"] = lookup_id_to_mission[mission_info["id"]] + elif isinstance(mission_info["mission"], int): + mission_info["mission"] = lookup_id_to_mission[mission_info["mission"]] + + return MissionInfo( + **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} + ) + + @staticmethod + def parse_mission_req_table(mission_req_table: typing.Dict[SC2Campaign, typing.Dict[typing.Any, MissionInfo]]) -> typing.List[CampaignSlotData]: + campaigns: typing.List[typing.Tuple[int, CampaignSlotData]] = [] + rolling_rule_id = 0 + for (campaign, campaign_data) in mission_req_table.items(): + if campaign.campaign_name == "Global": + campaign_name = "" + else: + campaign_name = campaign.campaign_name + + categories: typing.Dict[str, typing.List[MissionSlotData]] = {} + for mission in campaign_data.values(): + if mission.category not in categories: + categories[mission.category] = [] + mission_id = mission.mission.id + sub_rules: typing.List[CountMissionsRuleData] = [] + missions: typing.List[int] + if mission.number: + amount = mission.number + missions = [ + mission.mission.id + for mission in mission_req_table[campaign].values() + ] + sub_rules.append(CountMissionsRuleData(missions, amount, [campaign_name])) + prev_missions: typing.List[int] = [] + if len(mission.required_world) > 0: + missions = [] + for connection in mission.required_world: + if isinstance(connection, dict): + required_campaign = {} + for camp, camp_data in mission_req_table.items(): + if camp.id == connection["campaign"]: + required_campaign = camp_data + break + required_mission_id = connection["connect_to"] + else: + required_campaign = mission_req_table[connection.campaign] + required_mission_id = connection.connect_to + required_mission = list(required_campaign.values())[required_mission_id - 1] + missions.append(required_mission.mission.id) + if required_mission.category == mission.category: + prev_missions.append(required_mission.mission.id) + if mission.or_requirements: + amount = 1 + else: + amount = len(missions) + sub_rules.append(CountMissionsRuleData(missions, amount, missions)) + entry_rule = SubRuleRuleData(rolling_rule_id, sub_rules, len(sub_rules)) + rolling_rule_id += 1 + categories[mission.category].append(MissionSlotData.legacy(mission_id, prev_missions, entry_rule)) + + layouts: typing.List[LayoutSlotData] = [] + for (layout, mission_slots) in categories.items(): + if layout.startswith("_"): + layout_name = "" + else: + layout_name = layout + layouts.append(LayoutSlotData.legacy(layout_name, [mission_slots])) + campaigns.append((campaign.id, CampaignSlotData.legacy(campaign_name, layouts))) + return [data for (_, data) in sorted(campaigns)] + + + def on_print_json(self, args: dict) -> None: + # goes to this world + if "receiving" in args and self.slot_concerns_self(args["receiving"]): + relevant = True + # found in this world + elif "item" in args and self.slot_concerns_self(args["item"].player): + relevant = True + # not related + else: + relevant = False + + if relevant: + self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) + + super(SC2Context, self).on_print_json(args) + + def run_gui(self) -> None: + from .client_gui import start_gui + start_gui(self) + + async def shutdown(self) -> None: + await super(SC2Context, self).shutdown() + if self.last_bot: + self.last_bot.want_close = True + # If the client is not set up yet, the game is not done loading and must be force-closed + if not hasattr(self.last_bot, "client"): + bot.sc2process.kill_switch.kill_all() + if self.sc2_run_task: + self.sc2_run_task.cancel() + + async def disconnect(self, allow_autoreconnect: bool = False): + self.finished_game = False + await super(SC2Context, self).disconnect(allow_autoreconnect=allow_autoreconnect) + + def play_mission(self, mission_id: int) -> bool: + if self.missions_unlocked or is_mission_available(self, mission_id): + if self.sc2_run_task: + if not self.sc2_run_task.done(): + sc2_logger.warning("Starcraft 2 Client is still running!") + self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task + if self.slot is None: + sc2_logger.warning("Launching Mission without Archipelago authentication, " + "checks will not be registered to server.") + self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), + name="Starcraft 2 Launch") + return True + else: + sc2_logger.info(f"{lookup_id_to_mission[mission_id].mission_name} is not currently unlocked.") + return False + + def build_location_to_mission_mapping(self) -> None: + mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { + mission.mission_id: set() + for campaign in self.custom_mission_order for layout in campaign.layouts + for column in layout.missions for mission in column + } + + for loc in self.server_locations: + offset = ( + SC2WOL_LOC_ID_OFFSET + if loc < SC2HOTS_LOC_ID_OFFSET + else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) + ) + mission_id, objective = divmod(loc - offset, VICTORY_MODULO) + mission_id_to_location_ids[mission_id].add(objective) + self.mission_id_to_location_ids = { + mission_id: sorted(objectives) + for mission_id, objectives in mission_id_to_location_ids.items() + } + + def locations_for_mission(self, mission: SC2Mission) -> typing.Iterable[int]: + mission_id: int = mission.id + objectives = self.mission_id_to_location_ids[mission_id] + for objective in objectives: + yield get_location_id(mission_id, objective) + + def locations_for_mission_id(self, mission_id: int) -> typing.Iterable[int]: + objectives = self.mission_id_to_location_ids[mission_id] + for objective in objectives: + yield get_location_id(mission_id, objective) + + def uncollected_locations_in_mission(self, mission: SC2Mission) -> typing.Iterable[int]: + for location_id in self.locations_for_mission(mission): + if location_id in self.missing_locations: + yield location_id + + def is_mission_completed(self, mission_id: int) -> bool: + return get_location_id(mission_id, 0) in self.checked_locations + + + async def trade_acquire_storage(self, keep_trying: bool = False) -> typing.Optional[dict]: + # This function was largely taken from the Pokemon Emerald client + """ + Acquires a lock on the Void Trade DataStorage. + Locking the key means you have exclusive access + to modifying the value until you unlock it or the key expires (5 seconds). + + If `keep_trying` is `True`, it will keep trying to acquire the lock + until successful. Otherwise it will return `None` if it fails to + acquire the lock. + """ + while not self.exit_event.is_set() and self.last_bot and self.last_bot.game_running: + lock = int(time.time_ns() / 1000000000) # in seconds + + # Make sure we're not past the waiting limit + # SC2 needs to be notified within 10 minutes of game time (training time of the dummy units) + if self.trade_lock_start is not None: + if self.last_bot.time - self.trade_lock_start >= TRADE_LOCK_WAIT_LIMIT: + self.trade_lock_wait = 0 + self.trade_lock_start = None + return None + elif keep_trying: + self.trade_lock_start = self.last_bot.time + + message_uuid = str(uuid.uuid4()) + await self.send_msgs([{ + "cmd": "Set", + "key": self.trade_storage_team(), + "default": { TRADE_DATASTORAGE_LOCK: 0 }, + "want_reply": True, + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: lock } }], + "uuid": message_uuid, + }]) + + self.trade_reply_event.clear() + try: + await asyncio.wait_for(self.trade_reply_event.wait(), 5) + except asyncio.TimeoutError: + if not keep_trying: + return None + continue + + assert self.trade_latest_reply is not None + reply = copy.deepcopy(self.trade_latest_reply) + + # Make sure the most recently received update was triggered by our lock attempt + if reply.get("uuid", None) != message_uuid: + if not keep_trying: + return None + await asyncio.sleep(TRADE_LOCK_TIME) + continue + + # Make sure the current value of the lock is what we set it to + # (I think this should theoretically never run) + if reply["value"][TRADE_DATASTORAGE_LOCK] != lock: + if not keep_trying: + return None + await asyncio.sleep(TRADE_LOCK_TIME) + continue + + # Make sure that the lock value we replaced is at least 5 seconds old + # If it was unlocked before our change, its value was 0 and it will look decades old + if lock - reply["original_value"][TRADE_DATASTORAGE_LOCK] < TRADE_LOCK_TIME: + if not keep_trying: + return None + + # Multiple clients trying to lock the key may get stuck in a loop of checking the lock + # by trying to set it, which will extend its expiration. So if we see that the lock was + # too new when we replaced it, we should wait for increasingly longer periods so that + # eventually the lock will expire and a client will acquire it. + self.trade_lock_wait += TRADE_LOCK_TIME + self.trade_lock_wait += random.randrange(100, 500) / 1000 + + await asyncio.sleep(self.trade_lock_wait) + continue + + # We have the lock, reset the waiting period and return + self.trade_lock_wait = 0 + self.trade_lock_start = None + return reply + return None + + + async def trade_receive(self, amount: int = 1): + """ + Tries to pop `amount` units out of the trade storage. + """ + reply = await self.trade_acquire_storage(True) + + if reply is None: + self.trade_response = "?TradeFail Void Trade failed: Could not communicate with server. Trade cost refunded." + return None + + # Find available units + # Ignore units we sent ourselves + allowed_slots: typing.List[str] = [ + slot for slot in reply["value"] + if slot != TRADE_DATASTORAGE_LOCK \ + and slot != self.trade_storage_slot() + ] + # Filter out trades that are too old + if self.trade_age_limit != VoidTradeAgeLimit.option_disabled: + trade_time = reply["value"][TRADE_DATASTORAGE_LOCK] + allowed_age = void_trade_age_limits_ms[self.trade_age_limit] + is_young_enough = lambda send_time: trade_time - send_time <= allowed_age + else: + is_young_enough = lambda _: True + # Filter out banned units + if self.trade_workers_allowed == VoidTradeWorkers.option_false: + is_unit_allowed = lambda unit: unit not in worker_units + else: + is_unit_allowed = lambda _: True + + available_units: typing.List[typing.Tuple[str, str, int]] = [] + available_counts: typing.List[int] = [] + for slot in allowed_slots: + for (send_time, units) in reply["value"][slot].items(): + if is_young_enough(int(send_time)): + for (unit, count) in units.items(): + if is_unit_allowed(str(unit)): + available_units.append((unit, slot, send_time)) + available_counts.append(count) + + # Pick units to receive + # If there's not enough units in total, just pick as many as possible + # SC2 should handle the refund + available = sum(available_counts) + refunds = 0 + if available < amount: + refunds = amount - available + amount = available + if available == 0: + # random.sample crashes if counts is an empty list + units = [] + else: + units = random.sample(available_units, amount, counts = available_counts) + + # Build response data + unit_counts: typing.Dict[str, int] = {} + slots_to_update: typing.Dict[str, typing.Dict[int, typing.Dict[str, int]]] = {} + for (unit, slot, send_time) in units: + unit_counts[unit] = unit_counts.get(unit, 0) + 1 + if slot not in slots_to_update: + slots_to_update[slot] = copy.deepcopy(reply["value"][slot]) + slots_to_update[slot][send_time][unit] -= 1 + # Clean up units that were removed completely + if slots_to_update[slot][send_time][unit] == 0: + slots_to_update[slot][send_time].pop(unit) + # Clean up trades that were completely exhausted + if len(slots_to_update[slot][send_time]) == 0: + slots_to_update[slot].pop(send_time) + + await self.send_msgs([ + { # Update server storage + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": slots_to_update }] + }, + { # Release the lock + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: 0 } }] + } + ]) + + # Give units to bot + self.trade_response = f"?Trade {refunds} " + " ".join(f"{unit} {count}" for (unit, count) in unit_counts.items()) + + + async def trade_send(self, units: typing.List[str]): + """ + Tries to upload `units` to the trade DataStorage. + """ + reply = await self.trade_acquire_storage(True) + + if reply is None: + self.trade_response = "?TradeFail Void Trade failed: Could not communicate with server. Your units remain." + return None + + # Create a storage entry for the time the trade was confirmed + trade_time = reply["value"][TRADE_DATASTORAGE_LOCK] + storage_entry = {} + for unit in units: + storage_entry[unit] = storage_entry.get(unit, 0) + 1 + + # Update the storage with the new units + data: typing.Dict[int, typing.Dict[str, int]] = copy.deepcopy(reply["value"].get(self.trade_storage_slot(), {})) + data[trade_time] = storage_entry + + await self.send_msgs([ + { # Send the updated data + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { self.trade_storage_slot(): data } }] + }, + { # Release the lock + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: 0 } }] + } + ]) + + # Notify the game + self.trade_response = "?TradeSuccess Void Trade successful: Units sent!" + + +class CompatItemHolder(typing.NamedTuple): + name: str + quantity: int = 1 + + +def parse_uri(uri: str) -> str: + if "://" in uri: + uri = uri.split("://", 1)[1] + return uri.split('?', 1)[0] + + +async def main(): + multiprocessing.freeze_support() + parser = get_base_parser() + parser.add_argument('--name', default=None, help="Slot Name to connect as.") + args, uri = parser.parse_known_args() + + if uri and uri[0].startswith('archipelago://'): + args.connect = parse_uri(' '.join(uri)) + + ctx = SC2Context(args.connect, args.password) + ctx.auth = args.name + if ctx.server_task is None: + ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") + + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + + await ctx.exit_event.wait() + + await ctx.shutdown() + +# These items must be given to the player if the game is generated on older versions +API2_TO_API3_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { + CompatItemHolder(item_names.PHOTON_CANNON), + CompatItemHolder(item_names.OBSERVER), + CompatItemHolder(item_names.WARP_HARMONIZATION), + CompatItemHolder(item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, 3) +} +API3_TO_API4_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { + # War Council + CompatItemHolder(item_names.ZEALOT_WHIRLWIND), + CompatItemHolder(item_names.CENTURION_RESOURCE_EFFICIENCY), + CompatItemHolder(item_names.SENTINEL_RESOURCE_EFFICIENCY), + CompatItemHolder(item_names.STALKER_PHASE_REACTOR), + CompatItemHolder(item_names.DRAGOON_PHALANX_SUIT), + CompatItemHolder(item_names.INSTIGATOR_MODERNIZED_SERVOS), + CompatItemHolder(item_names.ADEPT_DISRUPTIVE_TRANSFER), + CompatItemHolder(item_names.SLAYER_PHASE_BLINK), + CompatItemHolder(item_names.AVENGER_KRYHAS_CLOAK), + CompatItemHolder(item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY), + CompatItemHolder(item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), + CompatItemHolder(item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), + CompatItemHolder(item_names.SENTRY_DOUBLE_SHIELD_RECHARGE), + CompatItemHolder(item_names.ENERGIZER_MOBILE_CHRONO_BEAM), + CompatItemHolder(item_names.HAVOC_ENDURING_SIGHT), + CompatItemHolder(item_names.HIGH_TEMPLAR_PLASMA_SURGE), + CompatItemHolder(item_names.SIGNIFIER_FEEDBACK), + CompatItemHolder(item_names.ASCENDANT_BREATH_OF_CREATION), + CompatItemHolder(item_names.DARK_ARCHON_INDOMITABLE_WILL), + CompatItemHolder(item_names.IMMORTAL_IMPROVED_BARRIER), + CompatItemHolder(item_names.VANGUARD_RAPIDFIRE_CANNON), + CompatItemHolder(item_names.VANGUARD_FUSION_MORTARS), + CompatItemHolder(item_names.ANNIHILATOR_TWILIGHT_CHASSIS), + CompatItemHolder(item_names.COLOSSUS_FIRE_LANCE), + CompatItemHolder(item_names.WRATHWALKER_AERIAL_TRACKING), + CompatItemHolder(item_names.REAVER_KHALAI_REPLICATORS), + CompatItemHolder(item_names.PHOENIX_DOUBLE_GRAVITON_BEAM), + CompatItemHolder(item_names.CORSAIR_NETWORK_DISRUPTION), + CompatItemHolder(item_names.MIRAGE_GRAVITON_BEAM), + CompatItemHolder(item_names.VOID_RAY_PRISMATIC_RANGE), + CompatItemHolder(item_names.CARRIER_REPAIR_DRONES), + CompatItemHolder(item_names.TEMPEST_DISINTEGRATION), + CompatItemHolder(item_names.ARBITER_VESSEL_OF_THE_CONCLAVE), + CompatItemHolder(item_names.MOTHERSHIP_INTEGRATED_POWER), + # Other items + CompatItemHolder(item_names.ASCENDANT_ARCHON_MERGE), + CompatItemHolder(item_names.DARK_TEMPLAR_ARCHON_MERGE), + CompatItemHolder(item_names.SPORE_CRAWLER_BIO_BONUS), +} + +def compat_item_to_network_items(compat_item: CompatItemHolder) -> typing.List[NetworkItem]: + item_id = get_full_item_list()[compat_item.name].code + network_item = NetworkItem(item_id, 0, 0, 0) + return compat_item.quantity * [network_item] + + +def calculate_items(ctx: SC2Context) -> typing.Dict[SC2Race, typing.List[int]]: + items = ctx.items_received.copy() + item_list = get_full_item_list() + def create_network_item(item_name: str) -> NetworkItem: + return NetworkItem(item_list[item_name].code, 0, 0, 0) + + # Items unlocked in earlier generator versions by default (Prophecy defaults, war council, rebalances) + if ctx.slot_data_version < 3: + for compat_item in API2_TO_API3_COMPAT_ITEMS: + items.extend(compat_item_to_network_items(compat_item)) + if ctx.slot_data_version < 4: + for compat_item in API3_TO_API4_COMPAT_ITEMS: + items.extend(compat_item_to_network_items(compat_item)) + received_item_ids = set(item.item for item in ctx.items_received) + if item_list[item_names.GHOST_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.GHOST_BARGAIN_BIN_PRICES)) + if item_list[item_names.SPECTRE_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.SPECTRE_BARGAIN_BIN_PRICES)) + if item_list[item_names.ROGUE_FORCES].code in received_item_ids: + items.append(create_network_item(item_names.UNRESTRICTED_MUTATION)) + if item_list[item_names.SCOUT_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.SCOUT_SUPPLY_EFFICIENCY)) + if item_list[item_names.REAVER_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.REAVER_BARGAIN_BIN_PRICES)) + + # API < 4 Orbital Command Count (Deprecated item) + orbital_command_count: int = 0 + + network_item: NetworkItem + accumulators: typing.Dict[SC2Race, typing.List[int]] = { + race: [0 for element in item_type_enum_class if element.flag_word >= 0] + for race, item_type_enum_class in race_to_item_type.items() + } + + # Protoss Shield grouped item specific logic + shields_from_ground_upgrade: int = 0 + shields_from_air_upgrade: int = 0 + + for network_item in items: + name = lookup_id_to_name.get(network_item.item) + if name is None: + continue + item_data: ItemData = item_list[name] + + if item_data.type.flag_word < 0: + continue + + # exists exactly once + if item_data.quantity == 1 or name in item_name_groups[ItemGroupNames.UNRELEASED_ITEMS]: + accumulators[item_data.race][item_data.type.flag_word] |= 1 << item_data.number + + # exists multiple times + elif item_data.quantity > 1: + flaggroup = item_data.type.flag_word + + # Generic upgrades apply only to Weapon / Armor upgrades + if item_data.number >= 0: + accumulators[item_data.race][flaggroup] += 1 << item_data.number + else: + if name == item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: + shields_from_ground_upgrade += 1 + if name == item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: + shields_from_air_upgrade += 1 + for bundled_number in get_bundle_upgrade_member_numbers(name): + accumulators[item_data.race][flaggroup] += 1 << bundled_number + + # Regen bio-steel nerf with API3 - undo for older games + if ctx.slot_data_version < 3 and name == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: + current_level = (accumulators[item_data.race][flaggroup] >> item_data.number) % 4 + if current_level == 2: + # Switch from level 2 to level 3 for compatibility + accumulators[item_data.race][flaggroup] += 1 << item_data.number + # sum + # Fillers, deprecated items + else: + if name == item_names.PROGRESSIVE_ORBITAL_COMMAND: + orbital_command_count += 1 + elif item_data.type == ZergItemType.Level: + accumulators[item_data.race][item_data.type.flag_word] += item_data.number + elif name == item_names.STARTING_MINERALS: + accumulators[item_data.race][item_data.type.flag_word] += ctx.minerals_per_item + elif name == item_names.STARTING_VESPENE: + accumulators[item_data.race][item_data.type.flag_word] += ctx.vespene_per_item + elif name == item_names.STARTING_SUPPLY: + accumulators[item_data.race][item_data.type.flag_word] += ctx.starting_supply_per_item + elif name == item_names.UPGRADE_RESEARCH_COST: + accumulators[item_data.race][item_data.type.flag_word] += ctx.research_cost_reduction_per_item + else: + accumulators[item_data.race][item_data.type.flag_word] += 1 + + # Fix Shields from generic upgrades by unit class (Maximum of ground/air upgrades) + if shields_from_ground_upgrade > 0 or shields_from_air_upgrade > 0: + shield_upgrade_level = max(shields_from_ground_upgrade, shields_from_air_upgrade) + shield_upgrade_item = item_list[item_names.PROGRESSIVE_PROTOSS_SHIELDS] + for _ in range(0, shield_upgrade_level): + accumulators[shield_upgrade_item.race][shield_upgrade_item.type.flag_word] += 1 << shield_upgrade_item.number + + # Deprecated Orbital Command handling (Backwards compatibility): + if orbital_command_count > 0: + orbital_command_replacement_items: typing.List[str] = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE + ] + replacement_item_ids = [get_full_item_list()[item_name].code for item_name in orbital_command_replacement_items] + if sum(item_id in replacement_item_ids for item_id in items) > 0: + logger.warning(inspect.cleandoc(""" + Both old Orbital Command and its replacements are present in the world. Skipping compatibility handling. + """)) + else: + # None of replacement items are present + # L1: MULE and Scanner Sweep + scanner_sweep_data = get_full_item_list()[item_names.COMMAND_CENTER_SCANNER_SWEEP] + mule_data = get_full_item_list()[item_names.COMMAND_CENTER_MULE] + accumulators[scanner_sweep_data.race][scanner_sweep_data.type.flag_word] += 1 << scanner_sweep_data.number + accumulators[mule_data.race][mule_data.type.flag_word] += 1 << mule_data.number + if orbital_command_count >= 2: + # L2 MULE and Scanner Sweep usable even in Planetary Fortress Mode + planetary_orbital_module_data = get_full_item_list()[item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] + accumulators[planetary_orbital_module_data.race][planetary_orbital_module_data.type.flag_word] += \ + 1 << planetary_orbital_module_data.number + + # Upgrades from completed missions + if ctx.generic_upgrade_missions > 0: + total_missions = sum(len(column) for campaign in ctx.custom_mission_order for layout in campaign.layouts for column in layout.missions) + num_missions = int((ctx.generic_upgrade_missions / 100) * total_missions) + completed = len([mission_id for mission_id in ctx.mission_id_to_location_ids if ctx.is_mission_completed(mission_id)]) + upgrade_count = min(completed // num_missions, ctx.max_upgrade_level) if num_missions > 0 else ctx.max_upgrade_level + upgrade_count = min(upgrade_count, WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + + # Equivalent to "Progressive Weapon/Armor Upgrade" item + global_upgrades: typing.Set[str] = upgrade_included_names[GenericUpgradeItems.option_bundle_all] + for global_upgrade in global_upgrades: + race = get_full_item_list()[global_upgrade].race + upgrade_flaggroup = race_to_item_type[race]["Upgrade"].flag_word + for bundled_number in get_bundle_upgrade_member_numbers(global_upgrade): + accumulators[race][upgrade_flaggroup] += upgrade_count << bundled_number + + return accumulators + + +def get_bundle_upgrade_member_numbers(bundled_item: str) -> typing.List[int]: + upgrade_elements: typing.List[str] = upgrade_bundles[bundled_item] + if bundled_item in (item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE): + # Shields are handled as a maximum of those two + upgrade_elements = [item_name for item_name in upgrade_elements if item_name != item_names.PROGRESSIVE_PROTOSS_SHIELDS] + return [get_full_item_list()[item_name].number for item_name in upgrade_elements] + + +def calc_difficulty(difficulty: int): + if difficulty == 0: + return 'C' + elif difficulty == 1: + return 'N' + elif difficulty == 2: + return 'H' + elif difficulty == 3: + return 'B' + + return 'X' + + +def get_kerrigan_level(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]], missions_beaten: int) -> int: + item_value = items[SC2Race.ZERG][ZergItemType.Level.flag_word] + mission_value = missions_beaten * ctx.kerrigan_levels_per_mission_completed + if ctx.kerrigan_levels_per_mission_completed_cap != -1: + mission_value = min(mission_value, ctx.kerrigan_levels_per_mission_completed_cap) + total_value = item_value + mission_value + if ctx.kerrigan_total_level_cap != -1: + total_value = min(total_value, ctx.kerrigan_total_level_cap) + return total_value + + +def calculate_kerrigan_options(ctx: SC2Context) -> int: + result = 0 + + # Bits 0, 1 + # Kerrigan unit available + if ctx.kerrigan_presence in kerrigan_unit_available: + result |= 1 << 0 + + # Bit 2 + # Kerrigan primal status by map + if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_vanilla: + result |= 1 << 2 + + return result + + +def caclulate_soa_options(ctx: SC2Context, mission: SC2Mission) -> int: + """ + Pack SOA options into a single integer with bitflags. + 0b000011 = SOA presence + 0b000100 = SOA in no-builds + 0b011000 = Passives presence + 0b100000 = PAssives in no-builds + """ + result = 0 + + # Bits 0, 1 + # SoA Calldowns available + soa_presence_value = 0 + if is_mission_in_soa_presence(ctx.spear_of_adun_presence, mission): + soa_presence_value = 3 + result |= soa_presence_value << 0 + + # Bit 2 + # SoA Calldowns for no-builds + if ctx.spear_of_adun_present_in_no_build == SpearOfAdunPresentInNoBuild.option_true: + result |= 1 << 2 + + # Bits 3,4 + # Autocasts + soa_autocasts_presence_value = 0 + if is_mission_in_soa_presence(ctx.spear_of_adun_passive_ability_presence, mission, SpearOfAdunPassiveAbilityPresence): + soa_autocasts_presence_value = 3 + # Guardian Shell breaks without SoA on version 4+, but can be generated without SoA on version 3 + if ctx.slot_data_version < 4 and MissionFlag.Protoss in mission.flags: + soa_autocasts_presence_value = 3 + result |= soa_autocasts_presence_value << 3 + + # Bit 5 + # Autocasts in no-builds + if ctx.spear_of_adun_passive_present_in_no_build == SpearOfAdunPassivesPresentInNoBuild.option_true: + result |= 1 << 5 + + return result + +def calculate_generic_upgrade_options(ctx: SC2Context) -> int: + result = 0 + + # Bits 0,1 + # Research mode + research_mode_value = 0 + if ctx.generic_upgrade_research == GenericUpgradeResearch.option_vanilla: + research_mode_value = 0 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_auto_in_no_build: + research_mode_value = 1 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_auto_in_build: + research_mode_value = 2 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_always_auto: + research_mode_value = 3 + result |= research_mode_value << 0 + + # Bit 2 + # Speedup + if ctx.generic_upgrade_research_speedup == GenericUpgradeResearchSpeedup.option_true: + result |= 1 << 2 + + return result + +def calculate_trade_options(ctx: SC2Context) -> int: + result = 0 + + # Bit 0 + # Trade enabled + if ctx.trade_enabled: + result |= 1 << 0 + + # Bit 1 + # Workers allowed + if ctx.trade_workers_allowed == VoidTradeWorkers.option_true: + result |= 1 << 1 + + return result + +def kerrigan_primal(ctx: SC2Context, kerrigan_level: int) -> bool: + if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_zerg: + return True + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_human: + return False + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_level_35: + return kerrigan_level >= 35 + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_half_completion: + total_missions = len(ctx.mission_id_to_location_ids) + completed = sum(ctx.is_mission_completed(mission_id) + for mission_id in ctx.mission_id_to_location_ids) + return completed >= (total_missions / 2) + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_item: + codes = [item.item for item in ctx.items_received] + return get_full_item_list()[item_names.KERRIGAN_PRIMAL_FORM].code in codes + return False + + +def get_mission_variant(mission_id: int) -> int: + mission_flags = lookup_id_to_mission[mission_id].flags + if MissionFlag.RaceSwap not in mission_flags: + return 0 + if MissionFlag.Terran in mission_flags: + return 1 + elif MissionFlag.Zerg in mission_flags: + return 2 + elif MissionFlag.Protoss in mission_flags: + return 3 + return 0 + + +def get_item_flag_word(item_name: str) -> int: + return get_full_item_list()[item_name].type.flag_word + + +async def starcraft_launch(ctx: SC2Context, mission_id: int): + sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id].mission_name}. If game does not launch check log file for errors.") + + with DllDirectory(None): + run_game( + bot.maps.get(lookup_id_to_mission[mission_id].map_file), + [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), name="Archipelago", fullscreen=not SC2World.settings.game_windowed_mode)], + realtime=True, + ) + + +class ArchipelagoBot(bot.bot_ai.BotAI): + __slots__ = [ + 'game_running', + 'mission_completed', + 'boni', + 'setup_done', + 'ctx', + 'mission_id', + 'want_close', + 'can_read_game', + 'last_received_update', + 'last_trade_cargo', + 'last_supply_used' + ] + ctx: SC2Context + # defined in bot_ai_internal.py; seems to be mis-annotated as a float and later re-annotated as an int + supply_used: int + + def __init__(self, ctx: SC2Context, mission_id: int): + self.game_running = False + self.mission_completed = False + self.want_close = False + self.can_read_game = False + self.last_received_update: int = 0 + self.last_trade_cargo: set = set() + self.last_supply_used: int = 0 + self.trade_reply_cooldown: int = 0 + self.setup_done = False + self.ctx = ctx + self.ctx.last_bot = self + self.mission_id = mission_id + self.boni = [False for _ in range(MAX_BONUS)] + + super(ArchipelagoBot, self).__init__() + + async def on_step(self, iteration: int): + if self.want_close: + self.want_close = False + await self._client.leave() + return + game_state = 0 + if not self.setup_done: + self.setup_done = True + mission = lookup_id_to_mission[self.mission_id] + start_items = calculate_items(self.ctx) + missions_beaten = self.missions_beaten_count() + kerrigan_level = get_kerrigan_level(self.ctx, start_items, missions_beaten) + kerrigan_options = calculate_kerrigan_options(self.ctx) + soa_options = caclulate_soa_options(self.ctx, mission) + generic_upgrade_options = calculate_generic_upgrade_options(self.ctx) + trade_options = calculate_trade_options(self.ctx) + mission_variant = get_mission_variant(self.mission_id) # 0/1/2/3 for unchanged/Terran/Zerg/Protoss + nova_fallback: bool + if MissionFlag.Nova in mission.flags: + nova_fallback = self.ctx.use_nova_nco_fallback + elif MissionFlag.WoLNova in mission.flags: + nova_fallback = self.ctx.use_nova_wol_fallback + else: + nova_fallback = False + uncollected_objectives: typing.List[int] = self.get_uncollected_objectives() + if self.ctx.difficulty_override >= 0: + difficulty = calc_difficulty(self.ctx.difficulty_override) + else: + difficulty = calc_difficulty(self.ctx.difficulty) + if self.ctx.game_speed_override >= 0: + game_speed = self.ctx.game_speed_override + else: + game_speed = self.ctx.game_speed + await self.chat_send( + "?SetOptions" + f" {difficulty}" + f" {generic_upgrade_options}" + f" {self.ctx.all_in_choice}" + f" {game_speed}" + f" {self.ctx.disable_forced_camera}" + f" {self.ctx.skip_cutscenes}" + f" {kerrigan_options}" + f" {self.ctx.grant_story_tech}" + f" {self.ctx.take_over_ai_allies}" + f" {soa_options}" + f" {self.ctx.mission_order}" + f" {int(nova_fallback)}" + f" {self.ctx.grant_story_levels}" + f" {self.ctx.enable_morphling}" + f" {mission_variant}" + f" {trade_options}" + f" {self.ctx.difficulty_damage_modifier}" + f" {self.ctx.mercenary_highlanders}" # TODO: Possibly rework it into unit options in the next cycle + f" {self.ctx.war_council_nerfs}" + ) + await self.update_resources(start_items) + await self.update_terran_tech(start_items) + await self.update_zerg_tech(start_items, kerrigan_level) + await self.update_protoss_tech(start_items) + await self.update_misc_tech(start_items) + await self.update_colors() + if uncollected_objectives: + await self.chat_send("?UncollectedLocations {}".format( + functools.reduce(lambda a, b: a + " " + b, [str(x) for x in uncollected_objectives]) + )) + await self.chat_send("?LoadFinished") + self.last_received_update = len(self.ctx.items_received) + + else: + if self.ctx.pending_color_update: + await self.update_colors() + + if not self.ctx.announcements.empty(): + message = self.ctx.announcements.get(timeout=1) + await self.chat_send("?SendMessage " + message) + self.ctx.announcements.task_done() + + # Archipelago reads the health + controller1_state = 0 + controller2_state = 0 + for unit in self.all_own_units(): + if unit.health_max == CONTROLLER_HEALTH: + controller1_state = int(CONTROLLER_HEALTH - unit.health) + self.can_read_game = True + elif unit.health_max == CONTROLLER2_HEALTH: + controller2_state = int(CONTROLLER2_HEALTH - unit.health) + self.can_read_game = True + elif unit.name == TRADE_UNIT: + # Handle Void Trade requests + # Check for orders (for buildings this is usually research or training) + if not unit.is_idle and not self.ctx.trade_underway: + button = unit.orders[0].ability.button_name + if button == TRADE_SEND_BUTTON and len(self.last_trade_cargo) > 0: + units_to_send: typing.List[str] = [] + non_ap_units: typing.Set[str] = set() + for passenger in self.last_trade_cargo: + # Alternatively passenger._type_data.name but passenger.name seems to always match + unit_name = passenger.name + if unit_name.startswith("AP_"): + units_to_send.append(normalized_unit_types.get(unit_name, unit_name)) + else: + non_ap_units.add(unit_name) + if len(non_ap_units) > 0: + sc2_logger.info(f"Void Trade tried to send non-AP units: {', '.join(non_ap_units)}") + self.ctx.trade_response = "?TradeFail Void Trade rejected: Trade contains invalid units." + self.ctx.trade_underway = True + else: + self.ctx.trade_response = None + self.ctx.trade_underway = True + async_start(self.ctx.trade_send(units_to_send)) + elif button == TRADE_RECEIVE_1_BUTTON: + self.ctx.trade_underway = True + if self.supply_used != self.last_supply_used: + self.ctx.trade_response = None + async_start(self.ctx.trade_receive(1)) + else: + self.ctx.trade_response = "?TradeFail Void Trade rejected: Not enough supply." + elif button == TRADE_RECEIVE_5_BUTTON: + self.ctx.trade_underway = True + if self.supply_used != self.last_supply_used: + self.ctx.trade_response = None + async_start(self.ctx.trade_receive(5)) + else: + self.ctx.trade_response = "?TradeFail Void Trade rejected: Not enough supply." + elif not unit.is_idle and self.trade_reply_cooldown > 0: + self.trade_reply_cooldown -= 1 + elif unit.is_idle and self.trade_reply_cooldown > 0: + self.trade_reply_cooldown = 0 + self.ctx.trade_response = None + self.ctx.trade_underway = False + else: + # The API returns no passengers for researching/training buildings, + # so we need to buffer the passengers each frame + self.last_trade_cargo = unit.passengers + # SC2 has no good means of detecting when a unit is queued while supply capped, + # so a supply buffer here is the best we can do + self.last_supply_used = self.supply_used + game_state = controller1_state + (controller2_state << 15) + + if iteration == 160 and not game_state & 1: + await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " + + "Starcraft 2 (This is likely a map issue)") + + if self.last_received_update < len(self.ctx.items_received): + current_items = calculate_items(self.ctx) + missions_beaten = self.missions_beaten_count() + kerrigan_level = get_kerrigan_level(self.ctx, current_items, missions_beaten) + await self.update_resources(current_items) + await self.update_terran_tech(current_items) + await self.update_zerg_tech(current_items, kerrigan_level) + await self.update_protoss_tech(current_items) + await self.update_misc_tech(current_items) + self.last_received_update = len(self.ctx.items_received) + + if game_state & 1: + if not self.game_running: + print("Archipelago Connected") + self.game_running = True + + if self.can_read_game: + if game_state & (1 << 1) and not self.mission_completed: + victory_locations = [get_location_id(self.mission_id, 0)] + send_victory = ( + self.mission_id in self.ctx.final_mission_ids and + len(self.ctx.final_locations) == len(self.ctx.checked_locations.union(victory_locations).intersection(self.ctx.final_locations)) + ) + + # Old slots don't have locations on goal + if not send_victory or self.ctx.slot_data_version >= 4: + sc2_logger.info("Mission Completed") + location_ids = self.ctx.mission_id_to_location_ids[self.mission_id] + victory_locations += sorted([ + get_location_id(self.mission_id, location_id) + for location_id in location_ids + if (location_id % VICTORY_MODULO) >= VICTORY_CACHE_OFFSET + ]) + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": victory_locations}]) + self.mission_completed = True + + if send_victory: + print("Game Complete") + await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) + self.mission_completed = True + self.ctx.finished_game = True + + for x, completed in enumerate(self.boni): + if not completed and game_state & (1 << (x + 2)): + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": [get_location_id(self.mission_id, x + 1)]}]) + self.boni[x] = True + + # Send Void Trade results + if self.ctx.trade_response is not None and self.trade_reply_cooldown == 0: + await self.chat_send(self.ctx.trade_response) + # Wait an arbitrary amount of frames before trying again + self.trade_reply_cooldown = 60 + else: + await self.chat_send("?SendMessage LostConnection - Lost connection to game.") + + def get_uncollected_objectives(self) -> typing.List[int]: + result = [ + location % VICTORY_MODULO + for location in self.ctx.uncollected_locations_in_mission(lookup_id_to_mission[self.mission_id]) + if (location % VICTORY_MODULO) < VICTORY_CACHE_OFFSET + ] + return result + + def missions_beaten_count(self) -> int: + return len([location for location in self.ctx.checked_locations if location % VICTORY_MODULO == 0]) + + async def update_colors(self): + await self.chat_send("?SetColor rr " + str(self.ctx.player_color_raynor)) + await self.chat_send("?SetColor ks " + str(self.ctx.player_color_zerg)) + await self.chat_send("?SetColor pz " + str(self.ctx.player_color_zerg_primal)) + await self.chat_send("?SetColor da " + str(self.ctx.player_color_protoss)) + await self.chat_send("?SetColor nova " + str(self.ctx.player_color_nova)) + self.ctx.pending_color_update = False + + async def update_resources(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + DEFAULT_MAX_SUPPLY = 200 + max_supply_amount = max( + DEFAULT_MAX_SUPPLY + + ( + current_items[SC2Race.ANY][get_item_flag_word(item_names.MAX_SUPPLY)] + * self.ctx.maximum_supply_per_item + ) + - ( + current_items[SC2Race.ANY][get_item_flag_word(item_names.REDUCED_MAX_SUPPLY)] + * self.ctx.maximum_supply_reduction_per_item + ), + self.ctx.lowest_maximum_supply, + ) + await self.chat_send("?GiveResources {} {} {} {}".format( + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_MINERALS)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_VESPENE)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_SUPPLY)], + max_supply_amount - DEFAULT_MAX_SUPPLY, + )) + + async def update_terran_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + terran_items = current_items[SC2Race.TERRAN] + await self.chat_send("?GiveTerranTech " + " ".join(map(str, terran_items))) + + async def update_zerg_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]], kerrigan_level: int): + zerg_items = current_items[SC2Race.ZERG] + zerg_items = [value for index, value in enumerate(zerg_items) if index not in [ZergItemType.Level.flag_word, ZergItemType.Primal_Form.flag_word]] + kerrigan_primal_by_items = kerrigan_primal(self.ctx, kerrigan_level) + kerrigan_primal_bot_value = 1 if kerrigan_primal_by_items else 0 + await self.chat_send(f"?GiveZergTech {kerrigan_level} {kerrigan_primal_bot_value} " + ' '.join(map(str, zerg_items))) + + async def update_protoss_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + protoss_items = current_items[SC2Race.PROTOSS] + await self.chat_send("?GiveProtossTech " + " ".join(map(str, protoss_items))) + + async def update_misc_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + await self.chat_send("?GiveMiscTech {} {} {}".format( + current_items[SC2Race.ANY][get_item_flag_word(item_names.BUILDING_CONSTRUCTION_SPEED)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.UPGRADE_RESEARCH_SPEED)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.UPGRADE_RESEARCH_COST)], + )) + +def calc_unfinished_nodes( + ctx: SC2Context +) -> typing.Tuple[typing.List[int], typing.Dict[int, typing.List[int]], typing.List[int], typing.Set[int]]: + unfinished_missions: typing.Set[int] = set() + + available_missions, available_layouts, available_campaigns = calc_available_nodes(ctx) + + for mission_id in available_missions: + objectives = set(ctx.locations_for_mission_id(mission_id)) + if objectives: + objectives_completed = ctx.checked_locations & objectives + if len(objectives_completed) < len(objectives): + unfinished_missions.add(mission_id) + + return available_missions, available_layouts, available_campaigns, unfinished_missions + +def is_mission_available(ctx: SC2Context, mission_id_to_check: int) -> bool: + available_missions, _, _ = calc_available_nodes(ctx) + + return mission_id_to_check in available_missions + +def calc_available_nodes(ctx: SC2Context) -> typing.Tuple[typing.List[int], typing.Dict[int, typing.List[int]], typing.List[int]]: + beaten_missions: typing.Set[int] = {mission_id for mission_id in ctx.mission_id_to_entry_rules if ctx.is_mission_completed(mission_id)} + received_items = compute_received_items(ctx) + + mission_order_objects: typing.List[MissionOrderObjectSlotData] = [] + parent_objects: typing.List[typing.List[MissionOrderObjectSlotData]] = [] + for campaign in ctx.custom_mission_order: + mission_order_objects.append(campaign) + parent_objects.append([]) + for layout in campaign.layouts: + mission_order_objects.append(layout) + parent_objects.append([campaign]) + for column in layout.missions: + for mission in column: + if mission.mission_id == -1: + continue + mission_order_objects.append(mission) + parent_objects.append([campaign, layout]) + + candidate_accessible_objects: typing.List[MissionOrderObjectSlotData] = [ + mission_order_object for mission_order_object in mission_order_objects + if mission_order_object.entry_rule.is_accessible(beaten_missions, received_items) + ] + + accessible_objects: typing.List[MissionOrderObjectSlotData] = [] + + while len(candidate_accessible_objects) > 0: + accessible_missions: typing.List[MissionSlotData] = [mission_order_object for mission_order_object in accessible_objects if isinstance(mission_order_object, MissionSlotData)] + beaten_accessible_missions: typing.Set[int] = {mission.mission_id for mission in accessible_missions if mission.mission_id in beaten_missions} + accessible_objects_to_add: typing.List[MissionOrderObjectSlotData] = [] + for mission_order_object in candidate_accessible_objects: + if ( + mission_order_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + and all([ + parent_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + for parent_object in parent_objects[mission_order_objects.index(mission_order_object)] + ]) + ): + accessible_objects_to_add.append(mission_order_object) + if len(accessible_objects_to_add) > 0: + accessible_objects.extend(accessible_objects_to_add) + candidate_accessible_objects = [ + mission_order_object for mission_order_object in candidate_accessible_objects + if mission_order_object not in accessible_objects_to_add + ] + else: + break + + accessible_missions: typing.List[MissionSlotData] = [mission_order_object for mission_order_object in accessible_objects if isinstance(mission_order_object, MissionSlotData)] + beaten_accessible_missions: typing.Set[int] = {mission.mission_id for mission in accessible_missions if mission.mission_id in beaten_missions} + for mission_order_object in mission_order_objects: + # re-generate tooltip accessibility + for sub_rule in mission_order_object.entry_rule.sub_rules: + sub_rule.was_accessible = False + mission_order_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + + available_missions: typing.List[int] = [ + mission_order_object.mission_id for mission_order_object in accessible_objects + if isinstance(mission_order_object, MissionSlotData) + ] + available_campaign_objects: typing.List[CampaignSlotData] = [ + mission_order_object for mission_order_object in accessible_objects + if isinstance(mission_order_object, CampaignSlotData) + ] + available_campaigns: typing.List[int] = [ + campaign_idx for campaign_idx, campaign in enumerate(ctx.custom_mission_order) + if campaign in available_campaign_objects + ] + available_layout_objects: typing.List[LayoutSlotData] = [ + mission_order_object for mission_order_object in accessible_objects + if isinstance(mission_order_object, LayoutSlotData) + ] + available_layouts: typing.Dict[int, typing.List[int]] = { + campaign_idx: [ + layout_idx for layout_idx, layout in enumerate(campaign.layouts) if layout in available_layout_objects + ] + for campaign_idx, campaign in enumerate(ctx.custom_mission_order) + } + + return available_missions, available_layouts, available_campaigns + +def compute_received_items(ctx: SC2Context) -> typing.Counter[int]: + received_items: typing.Counter[int] = collections.Counter() + for network_item in ctx.items_received: + received_items[network_item.item] += 1 + return received_items + +def check_game_install_path() -> bool: + # First thing: go to the default location for ExecuteInfo. + # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. + if is_windows: + # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. + # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# + import ctypes.wintypes + CSIDL_PERSONAL = 5 # My Documents + SHGFP_TYPE_CURRENT = 0 # Get current, not default value + + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) + documentspath: str = buf.value + einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) + else: + einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) + + # Check if the file exists. + if os.path.isfile(einfo): + + # Open the file and read it, picking out the latest executable's path. + with open(einfo) as f: + content = f.read() + if content: + search_result = re.search(r" = (.*)Versions", content) + if not search_result: + sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, " + "then try again.") + return False + base = search_result.group(1) + + if os.path.exists(base): + executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") + + # Finally, check the path for an actual executable. + # If we find one, great. Set up the SC2PATH. + if os.path.isfile(executable): + sc2_logger.info(f"Found an SC2 install at {base}!") + sc2_logger.debug(f"Latest executable at {executable}.") + os.environ["SC2PATH"] = base + sc2_logger.debug(f"SC2PATH set to {base}.") + return True + else: + sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") + else: + sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") + else: + sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " + f"If that fails, please run /set_path with your SC2 install directory.") + return False + + +def is_mod_installed_correctly() -> bool: + """Searches for all required files.""" + if "SC2PATH" not in os.environ: + check_game_install_path() + sc2_path: str = os.environ["SC2PATH"] + mapdir = sc2_path / Path('Maps/ArchipelagoCampaign') + mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerSuper", "ArchipelagoPatches", + "ArchipelagoTriggers", "ArchipelagoPlayerWoL", "ArchipelagoPlayerHotS", + "ArchipelagoPlayerLotV", "ArchipelagoPlayerLotVPrologue", "ArchipelagoPlayerNCO"] + modfiles = [sc2_path / Path("Mods/" + mod + ".SC2Mod") for mod in mods] + wol_required_maps: typing.List[str] = ["WoL" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission + if mission.campaign in (SC2Campaign.WOL, SC2Campaign.PROPHECY)] + hots_required_maps: typing.List[str] = ["HotS" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.HOTS]] + lotv_required_maps: typing.List[str] = ["LotV" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission + if mission.campaign in (SC2Campaign.LOTV, SC2Campaign.PROLOGUE, SC2Campaign.EPILOGUE)] + nco_required_maps: typing.List[str] = ["NCO" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.NCO]] + required_maps = wol_required_maps + hots_required_maps + lotv_required_maps + nco_required_maps + needs_files = False + + # Check for maps. + missing_maps: typing.List[str] = [] + for mapfile in required_maps: + if not os.path.isfile(mapdir / mapfile): + missing_maps.append(mapfile) + if len(missing_maps) >= 19: + sc2_logger.warning(f"All map files missing from {mapdir}.") + needs_files = True + elif len(missing_maps) > 0: + for map in missing_maps: + sc2_logger.debug(f"Missing {map} from {mapdir}.") + sc2_logger.warning(f"Missing {len(missing_maps)} map files.") + needs_files = True + else: # Must be no maps missing + sc2_logger.debug(f"All maps found in {mapdir}.") + + # Check for mods. + for modfile in modfiles: + if os.path.isfile(modfile) or os.path.isdir(modfile): + sc2_logger.debug(f"Archipelago mod found at {modfile}.") + else: + sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") + needs_files = True + + # Final verdict. + if needs_files: + sc2_logger.warning("Required files are missing. Run /download_data to acquire them.") + return False + else: + sc2_logger.debug("All map/mod files are properly installed.") + return True + + +class DllDirectory: + # Credit to Black Sliver for this code. + # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw + _old: typing.Optional[str] = None + _new: typing.Optional[str] = None + + def __init__(self, new: typing.Optional[str]): + self._new = new + + def __enter__(self): + old = self.get() + if self.set(self._new): + self._old = old + + def __exit__(self, *args): + if self._old is not None: + self.set(self._old) + + @staticmethod + def get() -> typing.Optional[str]: + if sys.platform == "win32": + n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) + buf = ctypes.create_unicode_buffer(n) + ctypes.windll.kernel32.GetDllDirectoryW(n, buf) + return buf.value + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return None + + @staticmethod + def set(s: typing.Optional[str]) -> bool: + if sys.platform == "win32": + return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return False + + +def download_latest_release_zip( + owner: str, + repo: str, + api_version: str, + metadata: typing.Optional[str] = None, + force_download=False +) -> typing.Tuple[str, typing.Optional[str]]: + """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + try: + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = r1.json() + cleanup_downloaded_metadata(latest_metadata) + latest_metadata = str(latest_metadata) + # sc2_logger.info(f"Latest version: {latest_metadata}.") + else: + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning("Failed to reach GitHub. Could not find download link.") + sc2_logger.warning(f"text: {r1.text}") + return "", metadata + + if (force_download is False) and (metadata == latest_metadata): + sc2_logger.info("Latest version already installed.") + return "", metadata + + sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.") + download_url = r1.json()["assets"][0]["browser_download_url"] + + r2 = requests.get(download_url, headers=headers) + if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): + tempdir = tempfile.gettempdir() + file = tempdir + os.sep + f"{repo}.zip" + with open(file, "wb") as fh: + fh.write(r2.content) + sc2_logger.info(f"Successfully downloaded {repo}.zip. Installing...") + return file, latest_metadata + else: + sc2_logger.warning(f"Status code: {r2.status_code}") + sc2_logger.warning("Download failed.") + sc2_logger.warning(f"text: {r2.text}") + return "", metadata + except requests.ConnectionError: + sc2_logger.warning("Failed to reach GitHub. Could not find download link.") + return "", metadata + + +def cleanup_downloaded_metadata(medatada_json: dict) -> None: + for asset in medatada_json['assets']: + del asset['download_count'] + + +def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool: + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + try: + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = r1.json() + cleanup_downloaded_metadata(latest_metadata) + latest_metadata = str(latest_metadata) + if metadata != latest_metadata: + return True + else: + return False + + else: + sc2_logger.warning("Failed to reach GitHub while checking for updates.") + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning(f"text: {r1.text}") + return False + except requests.ConnectionError: + sc2_logger.warning("Failed to reach GitHub while checking for updates.") + return False + + +def get_location_offset(mission_id: int) -> int: + return SC2WOL_LOC_ID_OFFSET if mission_id <= SC2Mission.ALL_IN.id \ + else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) + +def get_location_id(mission_id: int, objective_id: int) -> int: + return get_location_offset(mission_id) + mission_id * VICTORY_MODULO + objective_id + + +_has_forced_save = False +def force_settings_save_on_close() -> None: + """ + Settings has an existing auto-save feature, but it only triggers if a new key was introduced. + Force it to mark things as changed by introducing a new key and then cleaning up. + """ + global _has_forced_save + if _has_forced_save: + return + SC2World.settings.update({'invalid_attribute': True}) + del SC2World.settings.invalid_attribute + _has_forced_save = True + + +def launch(): + colorama.just_fix_windows_console() + asyncio.run(main()) + colorama.deinit() diff --git a/worlds/sc2/client_gui.py b/worlds/sc2/client_gui.py new file mode 100644 index 00000000..6b2abcd9 --- /dev/null +++ b/worlds/sc2/client_gui.py @@ -0,0 +1,655 @@ +from typing import * +import asyncio +import logging + +from BaseClasses import ItemClassification +from NetUtils import JSONMessagePart +from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser, LogtoUI +from kivy.app import App +from kivy.clock import Clock +from kivy.core.clipboard import Clipboard +from kivy.uix.gridlayout import GridLayout +from kivy.lang import Builder +from kivy.metrics import dp +from kivy.uix.label import Label +from kivy.uix.button import Button +from kivymd.uix.menu import MDDropdownMenu +from kivymd.uix.tooltip import MDTooltip +from kivy.uix.scrollview import ScrollView +from kivy.properties import StringProperty, BooleanProperty, NumericProperty + +from .client import SC2Context, calc_unfinished_nodes, is_mission_available, compute_received_items, STARCRAFT2 +from .item.item_descriptions import item_descriptions +from .item.item_annotations import ITEM_NAME_ANNOTATIONS +from .mission_order.entry_rules import RuleData, SubRuleRuleData, ItemRuleData +from .mission_tables import lookup_id_to_mission, campaign_race_exceptions, \ + SC2Mission, SC2Race +from .locations import LocationType, lookup_location_id_to_type, lookup_location_id_to_flags +from .options import LocationInclusion, MissionOrderScouting +from . import SC2World + + +class HoverableButton(HoverBehavior, Button): + pass + + +class MissionButton(HoverableButton, MDTooltip): + tooltip_text = StringProperty("Test") + mission_id = NumericProperty(-1) + is_exit = BooleanProperty(False) + is_goal = BooleanProperty(False) + showing_tooltip = BooleanProperty(False) + + def __init__(self, *args, **kwargs): + super(HoverableButton, self).__init__(**kwargs) + self._tooltip = ServerToolTip(text=self.text, markup=True) + self._tooltip.padding = [5, 2, 5, 2] + + def on_enter(self): + self._tooltip.text = self.tooltip_text + + if self.tooltip_text != "": + self.display_tooltip() + + def on_leave(self): + self.remove_tooltip() + + def display_tooltip(self, *args): + self.showing_tooltip = True + return super().display_tooltip(*args) + + def remove_tooltip(self, *args): + self.showing_tooltip = False + return super().remove_tooltip(*args) + + @property + def ctx(self) -> SC2Context: + return App.get_running_app().ctx + +class CampaignScroll(ScrollView): + border_on = BooleanProperty(False) + +class MultiCampaignLayout(GridLayout): + pass + +class DownloadDataWarningMessage(Label): + pass + +class CampaignLayout(GridLayout): + pass + +class RegionLayout(GridLayout): + pass + +class ColumnLayout(GridLayout): + pass + +class MissionLayout(GridLayout): + pass + +class MissionCategory(GridLayout): + pass + + +class SC2JSONtoKivyParser(KivyJSONtoTextParser): + def _handle_item_name(self, node: JSONMessagePart): + item_name = node["text"] + if self.ctx.slot_info[node["player"]].game != STARCRAFT2 or item_name not in item_descriptions: + return super()._handle_item_name(node) + + flags = node.get("flags", 0) + item_types = [] + if flags & ItemClassification.progression: + item_types.append("progression") + if flags & ItemClassification.useful: + item_types.append("useful") + if flags & ItemClassification.trap: + item_types.append("trap") + if not item_types: + item_types.append("normal") + + # TODO: Some descriptions are too long and get cut off. Is there a general solution or does someone need to manually check every description? + desc = item_descriptions[item_name].replace(". \n", ".
").replace(". ", ".
").replace("\n", "
") + annotation = ITEM_NAME_ANNOTATIONS.get(item_name) + if annotation is not None: + desc = f"{annotation}
{desc}" + ref = "Item Class: " + ", ".join(item_types) + "

" + desc + node.setdefault("refs", []).append(ref) + return super(KivyJSONtoTextParser, self)._handle_item_name(node) + + def _handle_text(self, node: JSONMessagePart): + if node.get("keep_markup", False): + for ref in node.get("refs", []): + node["text"] = f"[ref={self.ref_count}|{ref}]{node['text']}[/ref]" + self.ref_count += 1 + return super(KivyJSONtoTextParser, self)._handle_text(node) + else: + return super()._handle_text(node) + + +class SC2Manager(GameManager): + base_title = "Archipelago Starcraft 2 Client" + + campaign_panel: Optional[MultiCampaignLayout] = None + campaign_scroll_panel: Optional[CampaignScroll] = None + last_checked_locations: Set[int] = set() + last_items_received: List[int] = [] + last_shown_tooltip: int = -1 + last_data_out_of_date = False + mission_buttons: List[MissionButton] = [] + launching: Union[bool, int] = False # if int -> mission ID + refresh_from_launching = True + first_check = True + first_mission = "" + button_colors: Dict[SC2Race, Tuple[float, float, float]] = {} + ctx: SC2Context + + def __init__(self, ctx: SC2Context) -> None: + super().__init__(ctx) + self.json_to_kivy_parser = SC2JSONtoKivyParser(ctx) + self.minimized = False + + def on_start(self) -> None: + from . import gui_config + warnings, window_width, window_height = gui_config.get_window_defaults() + from kivy.core.window import Window + original_size_x, original_size_y = Window.size + Window.size = window_width, window_height + Window.left -= max((window_width - original_size_x) // 2, 0) + Window.top -= max((window_height - original_size_y) // 2, 0) + # Add the logging handler manually here instead of using `logging_pairs` to avoid adding 2 unnecessary tabs + logging.getLogger("Starcraft2").addHandler(LogtoUI(self.log_panels["All"].on_log)) + for startup_warning in warnings: + logging.getLogger("Starcraft2").warning(f"Startup WARNING: {startup_warning}") + for race in (SC2Race.TERRAN, SC2Race.PROTOSS, SC2Race.ZERG): + errors, color = gui_config.get_button_color(race.name) + self.button_colors[race] = color + for error in errors: + logging.getLogger("Starcraft2").warning(f"{race.name.title()} button color setting: {error}") + + def clear_tooltip(self) -> None: + for button in self.mission_buttons: + button.remove_tooltip() + + def shown_tooltip(self) -> int: + for button in self.mission_buttons: + if button.showing_tooltip: + return button.mission_id + return -1 + + def build(self): + container = super().build() + + panel = self.add_client_tab("Starcraft 2 Launcher", CampaignScroll()) + self.campaign_scroll_panel = panel.content + self.campaign_panel = MultiCampaignLayout() + panel.content.add_widget(self.campaign_panel) + + Clock.schedule_interval(self.build_mission_table, 0.5) + + return container + + def build_mission_table(self, dt) -> None: + if self.launching: + assert self.campaign_panel is not None + self.refresh_from_launching = False + + self.campaign_panel.clear_widgets() + self.campaign_panel.add_widget(Label( + text="Launching Mission: " + lookup_id_to_mission[self.launching].mission_name + )) + if self.ctx.ui: + self.ctx.ui.clear_tooltip() + return + + sorted_items_received = sorted([item.item for item in self.ctx.items_received]) + shown_tooltip = self.shown_tooltip() + hovering_tooltip = ( + self.last_shown_tooltip != -1 + and self.last_shown_tooltip == shown_tooltip + ) + data_changed = ( + self.last_checked_locations != self.ctx.checked_locations + or self.last_items_received != sorted_items_received + ) + needs_redraw = ( + data_changed + and not hovering_tooltip + or not self.refresh_from_launching + or self.last_data_out_of_date != self.ctx.data_out_of_date + or self.first_check + ) + self.last_shown_tooltip = shown_tooltip + if not needs_redraw: + return + + assert self.campaign_panel is not None + self.refresh_from_launching = True + + self.clear_tooltip() + self.campaign_panel.clear_widgets() + if self.ctx.data_out_of_date: + self.campaign_panel.add_widget(Label(text="", padding=[0, 5, 0, 5])) + warning_label = DownloadDataWarningMessage( + text="Map/Mod data is out of date. Run /download_data in the client", + padding=[0, 25, 0, 25], + ) + self.campaign_scroll_panel.border_on = True + self.campaign_panel.add_widget(warning_label) + else: + self.campaign_scroll_panel.border_on = False + self.last_data_out_of_date = self.ctx.data_out_of_date + if len(self.ctx.custom_mission_order) == 0: + self.campaign_panel.add_widget(Label(text="Connect to a world to see a mission layout here.")) + return + + self.last_checked_locations = self.ctx.checked_locations.copy() + self.last_items_received = sorted_items_received + self.first_check = False + + self.mission_buttons = [] + + available_missions, available_layouts, available_campaigns, unfinished_missions = calc_unfinished_nodes(self.ctx) + + # The MultiCampaignLayout widget needs a default height of 15 (set in the .kv) to display the above Labels correctly + multi_campaign_layout_height = 15 + + # Fetching IDs of all the locations with hints + self.hints_to_highlight = [] + hints = self.ctx.stored_data.get(f"_read_hints_{self.ctx.team}_{self.ctx.slot}") + if hints: + for hint in hints: + if hint['finding_player'] == self.ctx.slot and not hint['found']: + self.hints_to_highlight.append(hint['location']) + + MISSION_BUTTON_HEIGHT = 50 + MISSION_BUTTON_PADDING = 6 + for campaign_idx, campaign in enumerate(self.ctx.custom_mission_order): + longest_column = max(len(col) for layout in campaign.layouts for col in layout.missions) + if longest_column == 1: + campaign_layout_height = 115 + else: + campaign_layout_height = (longest_column + 2) * (MISSION_BUTTON_HEIGHT + MISSION_BUTTON_PADDING) + multi_campaign_layout_height += campaign_layout_height + campaign_layout = CampaignLayout(size_hint_y=None, height=campaign_layout_height) + campaign_layout.add_widget( + Label(text=campaign.name, size_hint_y=None, height=25, outline_width=1) + ) + mission_layout = MissionLayout(padding=[10,0,10,0]) + for layout_idx, layout in enumerate(campaign.layouts): + layout_panel = RegionLayout() + layout_panel.add_widget( + Label(text=layout.name, size_hint_y=None, height=25, outline_width=1)) + column_panel = ColumnLayout() + + for column in layout.missions: + category_panel = MissionCategory(padding=[3,MISSION_BUTTON_PADDING,3,MISSION_BUTTON_PADDING]) + + for mission in column: + mission_id = mission.mission_id + + # Empty mission slots + if mission_id == -1: + column_spacer = Label(text='', size_hint_y=None, height=MISSION_BUTTON_HEIGHT) + category_panel.add_widget(column_spacer) + continue + + mission_obj = lookup_id_to_mission[mission_id] + mission_finished = self.ctx.is_mission_completed(mission_id) + is_layout_exit = mission_id in layout.exits and not mission_finished + is_campaign_exit = mission_id in campaign.exits and not mission_finished + + text, tooltip = self.mission_text( + self.ctx, mission_id, mission_obj, + layout_idx, is_layout_exit, layout.name, + campaign_idx, is_campaign_exit, campaign.name, + available_missions, available_layouts, available_campaigns, unfinished_missions + ) + + mission_button = MissionButton(text=text, size_hint_y=None, height=MISSION_BUTTON_HEIGHT) + + mission_button.mission_id = mission_id + + if mission_id in self.ctx.final_mission_ids: + mission_button.is_goal = True + if is_layout_exit or is_campaign_exit: + mission_button.is_exit = True + + mission_race = mission_obj.race + if mission_race == SC2Race.ANY: + mission_race = mission_obj.campaign.race + race = campaign_race_exceptions.get(mission_obj, mission_race) + if race in self.button_colors: + mission_button.background_color = self.button_colors[race] + mission_button.tooltip_text = tooltip + mission_button.bind(on_press=self.mission_callback) + self.mission_buttons.append(mission_button) + category_panel.add_widget(mission_button) + + # layout_panel.add_widget(Label(text="")) + column_panel.add_widget(category_panel) + layout_panel.add_widget(column_panel) + mission_layout.add_widget(layout_panel) + campaign_layout.add_widget(mission_layout) + self.campaign_panel.add_widget(campaign_layout) + self.campaign_panel.height = multi_campaign_layout_height + + # For some reason the AP HoverBehavior won't send an enter event if a button spawns under the cursor, + # so manually send an enter event if a button is hovered immediately + for button in self.mission_buttons: + if button.hovered: + button.dispatch("on_enter") + break + + def mission_text( + self, ctx: SC2Context, mission_id: int, mission_obj: SC2Mission, + layout_id: int, is_layout_exit: bool, layout_name: str, campaign_id: int, is_campaign_exit: bool, campaign_name: str, + available_missions: List[int], available_layouts: Dict[int, List[int]], available_campaigns: List[int], + unfinished_missions: List[int] + ) -> Tuple[str, str]: + COLOR_MISSION_IMPORTANT = "6495ED" # blue + COLOR_MISSION_UNIMPORTANT = "A0BEF4" # lighter blue + COLOR_MISSION_CLEARED = "FFFFFF" # white + COLOR_MISSION_LOCKED = "A9A9A9" # gray + COLOR_PARENT_LOCKED = "848484" # darker gray + COLOR_MISSION_FINAL = "FFBC95" # orange + COLOR_MISSION_FINAL_LOCKED = "D0C0BE" # gray + orange + COLOR_FINAL_PARENT_LOCKED = "D0C0BE" # gray + orange + COLOR_FINAL_MISSION_REMINDER = "FF5151" # light red + COLOR_VICTORY_LOCATION = "FFC156" # gold + COLOR_TOOLTIP_DONE = "51FF51" # light green + COLOR_TOOLTIP_NOT_DONE = "FF5151" # light red + + text = mission_obj.mission_name + tooltip: str = "" + remaining_locations, plando_locations, remaining_count = self.sort_unfinished_locations(mission_id) + campaign_locked = campaign_id not in available_campaigns + layout_locked = layout_id not in available_layouts[campaign_id] + + # Map has uncollected locations + if mission_id in unfinished_missions: + if self.any_valuable_locations(remaining_locations): + text = f"[color={COLOR_MISSION_IMPORTANT}]{text}[/color]" + else: + text = f"[color={COLOR_MISSION_UNIMPORTANT}]{text}[/color]" + elif mission_id in available_missions: + text = f"[color={COLOR_MISSION_CLEARED}]{text}[/color]" + # Map requirements not met + else: + mission_rule, layout_rule, campaign_rule = ctx.mission_id_to_entry_rules[mission_id] + mission_has_rule = mission_rule.amount > 0 + layout_has_rule = layout_rule.amount > 0 + extra_reqs = False + if campaign_locked: + text = f"[color={COLOR_PARENT_LOCKED}]{text}[/color]" + tooltip += "To unlock this campaign, " + shown_rule = campaign_rule + extra_reqs = layout_has_rule or mission_has_rule + elif layout_locked: + text = f"[color={COLOR_PARENT_LOCKED}]{text}[/color]" + tooltip += "To unlock this questline, " + shown_rule = layout_rule + extra_reqs = mission_has_rule + else: + text = f"[color={COLOR_MISSION_LOCKED}]{text}[/color]" + tooltip += "To unlock this mission, " + shown_rule = mission_rule + rule_tooltip = shown_rule.tooltip(0, lookup_id_to_mission, COLOR_TOOLTIP_DONE, COLOR_TOOLTIP_NOT_DONE) + tooltip += rule_tooltip.replace(rule_tooltip[0], rule_tooltip[0].lower(), 1) + extra_word = "are" + if shown_rule.shows_single_rule(): + extra_word = "is" + tooltip += "." + if extra_reqs: + tooltip += f"\nThis mission has additional requirements\nthat will be shown once the above {extra_word} met." + + # Mark exit missions + exit_for: str = "" + if is_layout_exit: + exit_for += layout_name if layout_name else "this questline" + if is_campaign_exit: + if exit_for: + exit_for += " and " + exit_for += campaign_name if campaign_name else "this campaign" + if exit_for: + if tooltip: + tooltip += "\n\n" + tooltip += f"Required to beat {exit_for}" + + # Mark goal missions + if mission_id in self.ctx.final_mission_ids: + if mission_id in available_missions: + text = f"[color={COLOR_MISSION_FINAL}]{mission_obj.mission_name}[/color]" + elif campaign_locked or layout_locked: + text = f"[color={COLOR_FINAL_PARENT_LOCKED}]{mission_obj.mission_name}[/color]" + else: + text = f"[color={COLOR_MISSION_FINAL_LOCKED}]{mission_obj.mission_name}[/color]" + if tooltip and not exit_for: + tooltip += "\n\n" + elif exit_for: + tooltip += "\n" + if any(location_type == LocationType.VICTORY for (location_type, _, _) in remaining_locations): + tooltip += f"[color={COLOR_FINAL_MISSION_REMINDER}]Required to beat the world[/color]" + else: + tooltip += "This goal mission is already beaten.\nBeat the remaining goal missions to beat the world." + + # Populate remaining location list + if remaining_count > 0: + if tooltip: + tooltip += "\n\n" + tooltip += f"[b][color={COLOR_MISSION_IMPORTANT}]Uncollected locations[/color][/b]" + last_location_type = LocationType.VICTORY + victory_printed = False + + if self.ctx.mission_order_scouting != MissionOrderScouting.option_none: + mission_available = mission_id in available_missions + + scoutable = self.is_scoutable(remaining_locations, mission_available, layout_locked, campaign_locked) + else: + scoutable = False + + for location_type, location_name, _ in remaining_locations: + if location_type in (LocationType.VICTORY, LocationType.VICTORY_CACHE) and victory_printed: + continue + if location_type != last_location_type: + tooltip += f"\n[color={COLOR_MISSION_IMPORTANT}]{self.get_location_type_title(location_type)}:[/color]" + last_location_type = location_type + if location_type == LocationType.VICTORY: + victory_count = len([loc for loc in remaining_locations if loc[0] in (LocationType.VICTORY, LocationType.VICTORY_CACHE)]) + victory_loc = location_name.replace(":", f":[color={COLOR_VICTORY_LOCATION}]") + if victory_count > 1: + victory_loc += f' ({victory_count})' + tooltip += f"\n- {victory_loc}[/color]" + victory_printed = True + else: + tooltip += f"\n- {location_name}" + if scoutable: + tooltip += self.handle_scout_display(location_name) + if len(plando_locations) > 0: + tooltip += "\n[b]Plando:[/b]\n- " + tooltip += "\n- ".join(plando_locations) + + tooltip = f"[b]{text}[/b]\n" + tooltip + + #If the mission has any hints pointing to a check, add asterisks around the mission name + if any(tuple(x in self.hints_to_highlight for x in self.ctx.locations_for_mission_id(mission_id))): + text = "* " + text + " *" + + return text, tooltip + + + def mission_callback(self, button: MissionButton) -> None: + if button.last_touch.button == 'right': + self.open_mission_menu(button) + return + if not self.launching: + mission_id: int = button.mission_id + if self.ctx.play_mission(mission_id): + self.launching = mission_id + Clock.schedule_once(self.finish_launching, 10) + + def open_mission_menu(self, button: MissionButton) -> None: + # Will be assigned later, used to close menu in callbacks + menu = None + mission_id = button.mission_id + + def copy_mission_name(): + Clipboard.copy(lookup_id_to_mission[mission_id].mission_name) + menu.dismiss() + + menu_items = [ + { + "text": "Copy Mission Name", + "on_release": copy_mission_name, + } + ] + width_override = None + + hinted_item_ids = Counter() + hints = self.ctx.stored_data.get(f"_read_hints_{self.ctx.team}_{self.ctx.slot}") + if hints: + for hint in hints: + if hint['receiving_player'] == self.ctx.slot and not hint['found']: + hinted_item_ids[hint['item']] += 1 + + if not self.ctx.is_mission_completed(mission_id) and not is_mission_available(self.ctx, mission_id): + # Uncompleted and inaccessible missions can have items hinted if they're needed + # The inaccessible restriction is to ensure users don't waste hints on missions that they can already access + items_needed = self.resolve_items_needed(mission_id) + received_items = compute_received_items(self.ctx) + for item_id, amount in items_needed.items(): + # If we have already received or hinted enough of this item, skip it + if received_items[item_id] + hinted_item_ids[item_id] >= amount: + continue + if width_override is None: + width_override = dp(500) + item_name = self.ctx.item_names.lookup_in_game(item_id) + label_text = f"Hint Required Item: {item_name}" + + def hint_and_close(): + self.ctx.command_processor(self.ctx)(f"!hint {item_name}") + menu.dismiss() + + menu_items.append({ + "text": label_text, + "on_release": hint_and_close, + }) + + menu = MDDropdownMenu( + caller=button, + items=menu_items, + **({"width": width_override} if width_override else {}), + ) + menu.open() + + def resolve_items_needed(self, mission_id: int) -> Counter[int]: + def resolve_rule_to_items(rule: RuleData) -> Counter[int]: + if isinstance(rule, SubRuleRuleData): + all_items = Counter() + for sub_rule in rule.sub_rules: + # Take max of each item across all sub-rules + all_items |= resolve_rule_to_items(sub_rule) + return all_items + elif isinstance(rule, ItemRuleData): + return Counter(rule.item_ids) + else: + return Counter() + + rules = self.ctx.mission_id_to_entry_rules[mission_id] + # Take max value of each item across all rules using '|' + return (resolve_rule_to_items(rules.mission_rule) | + resolve_rule_to_items(rules.layout_rule) | + resolve_rule_to_items(rules.campaign_rule)) + + def finish_launching(self, dt): + self.launching = False + + def sort_unfinished_locations(self, mission_id: int) -> Tuple[List[Tuple[LocationType, str, int]], List[str], int]: + locations: List[Tuple[LocationType, str, int]] = [] + location_name_to_index: Dict[str, int] = {} + for loc in self.ctx.locations_for_mission_id(mission_id): + if loc in self.ctx.missing_locations: + location_name = self.ctx.location_names.lookup_in_game(loc) + location_name_to_index[location_name] = len(locations) + locations.append(( + lookup_location_id_to_type[loc], + location_name, + loc, + )) + count = len(locations) + + plando_locations = [] + elements_to_remove: Set[Tuple[LocationType, str, int]] = set() + for plando_loc_name in self.ctx.plando_locations: + if plando_loc_name in location_name_to_index: + elements_to_remove.add(locations[location_name_to_index[plando_loc_name]]) + plando_locations.append(plando_loc_name) + for element in elements_to_remove: + locations.remove(element) + + return sorted(locations), plando_locations, count + + def any_valuable_locations(self, locations: List[Tuple[LocationType, str, int]]) -> bool: + for location_type, _, location_id in locations: + if (self.ctx.location_inclusions[location_type] == LocationInclusion.option_enabled + and all( + self.ctx.location_inclusions_by_flag[flag] == LocationInclusion.option_enabled + for flag in lookup_location_id_to_flags[location_id].values() + ) + ): + return True + return False + + def get_location_type_title(self, location_type: LocationType) -> str: + title = location_type.name.title().replace("_", " ") + if self.ctx.location_inclusions[location_type] == LocationInclusion.option_disabled: + title += " (Nothing)" + elif self.ctx.location_inclusions[location_type] == LocationInclusion.option_filler: + title += " (Filler)" + else: + title += "" + return title + + def is_scoutable(self, remaining_locations, mission_available: bool, layout_locked: bool, campaign_locked: bool) -> bool: + if self.ctx.mission_order_scouting == MissionOrderScouting.option_all: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_campaign and not campaign_locked: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_layout and not layout_locked: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_available and mission_available: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_completed and len([loc for loc in remaining_locations if loc[0] in (LocationType.VICTORY, LocationType.VICTORY_CACHE)]) == 0: + # Assuming that when a mission is completed, all victory location are removed + return True + else: + return False + + def handle_scout_display(self, location_name: str) -> str: + if self.ctx.mission_item_classification is None: + return "" + # Only one information is provided for the victory locations of a mission + if " Cache (" in location_name: + location_name = location_name.split(" Cache")[0] + item_classification_key = self.ctx.mission_item_classification[location_name] + if ((ItemClassification.progression & item_classification_key) + and (ItemClassification.useful & item_classification_key) + ): + # Uncommon, but some games do this to show off that an item is super-important + # This can also happen on a victory display if the cache holds both progression and useful + return " [color=AF99EF](Useful+Progression)[/color]" + if ItemClassification.progression & item_classification_key: + return " [color=AF99EF](Progression)[/color]" + if ItemClassification.useful & item_classification_key: + return " [color=6D8BE8](Useful)[/color]" + if SC2World.settings.show_traps and ItemClassification.trap & item_classification_key: + return " [color=FA8072](Trap)[/color]" + return " [color=00EEEE](Filler)[/color]" + + +def start_gui(context: SC2Context): + context.ui = SC2Manager(context) + context.ui_task = asyncio.create_task(context.ui.async_run(), name="UI") + import pkgutil + data = pkgutil.get_data(SC2World.__module__, "starcraft2.kv").decode() + Builder.load_string(data) diff --git a/worlds/sc2/docs/contributors.md b/worlds/sc2/docs/contributors.md index 5b62466d..b1e7e655 100644 --- a/worlds/sc2/docs/contributors.md +++ b/worlds/sc2/docs/contributors.md @@ -1,19 +1,66 @@ # Contributors -Contibutors are listed with preferred or Discord names first, with github usernames prepended with an `@` +Contributors are listed with preferred or Discord names first, with GitHub usernames prepended with an `@`. +Within an update, contributors for earlier sections are not repeated for their contributions in later sections; +code contributors also reported bugs and participated in beta testing. -## Update 2024.0 +## Update 2025 ### Code Changes * Ziktofel (@Ziktofel) * Salzkorn (@Salzkorn) * EnvyDragon (@EnvyDragon) -* Phanerus (@MatthewMarinets) +* Phaneros (@MatthewMarinets) +* Magnemania (@Magnemania) +* Bones (@itsjustbones) +* Gemster (@Gemster312) +* SirChuckOfTheChuckles (@SirChuckOfTheChuckles) +* Snarky (@Snarky) +* MindHawk (@MindHawk) +* Cristall (@Cristall) +* WaikinDN (@WaikinDN) +* blorp77 (@blorp77) +* Dikhovinka (@AYaroslavskiy91) +* Subsourian (@Subsourian) + +### Additional Assets +* Alice Voltaire + +### Voice Acting +@-handles in this section are social media contacts rather than specifically GitHub in this section. + +* Subsourian (@Subsourian) - Signifier, Slayer +* GiantGrantGames (@GiantGrantGames) - Trireme +* Phaneros (@MatthewMarinets)- Skirmisher +* Durygathn - Dawnbringer +* 7thAce (@7thAce) - Pulsar +* Panicmoon (@panicmoon.bsky.social) - Skylord +* JayborinoPlays (@Jayborino) - Oppressor + +## Maintenance of 2024 release +* Ziktofel (@Ziktofel) +* Phaneros (@MatthewMarinets) +* Salzkorn (@Salzkorn) +* neocerber (@neocerber) +* Alchav (@Alchav) +* Berserker (@Berserker66) +* Exempt-Medic (@Exempt-Medic) + +And many members of the greater Archipelago community for core changes that affected the StarCraft 2 apworld. + +## Update 2024 +### Code Changes +* Ziktofel (@Ziktofel) +* Salzkorn (@Salzkorn) +* EnvyDragon (@EnvyDragon) +* Phaneros (@MatthewMarinets) * Madi Sylveon (@MadiMadsen) * Magnemania (@Magnemania) * Subsourian (@Subsourian) +* neocerber (@neocerber) * Hopop (@hopop201) * Alice Voltaire (@AliceVoltaire) * Genderdruid (@ArchonofFail) * CrazedCollie (@FoxOfWar) +* Bones (@itsjustbones) ### Additional Beta testing and bug reports * Varcklen (@Varcklen) diff --git a/worlds/sc2/docs/custom_mission_orders_en.md b/worlds/sc2/docs/custom_mission_orders_en.md new file mode 100644 index 00000000..6aba753b --- /dev/null +++ b/worlds/sc2/docs/custom_mission_orders_en.md @@ -0,0 +1,1092 @@ +# Custom Mission Orders for Starcraft 2 + +
+ Table of Contents + +- [Custom Mission Orders for Starcraft 2](#custom-mission-orders-for-starcraft-2) + - [What is this?](#what-is-this) + - [Basic structure](#basic-structure) + - [Interactions with other YAML options](#interactions-with-other-yaml-options) + - [Instructions for building a mission order](#instructions-for-building-a-mission-order) + - [Shared options](#shared-options) + - [Display Name](#display-name) + - [Unique name](#unique-name) + - [Goal](#goal) + - [Exit](#exit) + - [Entry rules](#entry-rules) + - [Unique progression track](#unique-progression-track) + - [Difficulty](#difficulty) + - [Mission Pool](#mission-pool) + - [Campaign Options](#campaign-options) + - [Preset](#preset) + - [Campaign Presets](#campaign-presets) + - [Static Presets](#static-presets) + - [Preset Options](#preset-options) + - [Missions](#missions) + - [Shuffle Raceswaps](#shuffle-raceswaps) + - [Keys](#keys) + - [Golden Path](#golden-path) + - [Layout Options](#layout-options) + - [Type](#type) + - [Size](#size) + - [Missions](#missions-1) + - [Mission Slot Options](#mission-slot-options) + - [Entrance](#entrance) + - [Empty](#empty) + - [Next](#next) + - [Victory Cache](#victory-cache) + - [Layout Types](#layout-types) + - [Column](#column) + - [Grid](#grid) + - [Grid Index Functions](#grid-index-functions) + - [point(x, y)](#pointx-y) + - [rect(x, y, width, height)](#rectx-y-width-height) + - [Canvas](#canvas) + - [Canvas Index Functions](#canvas-index-functions) + - [group(character)](#groupcharacter) + - [Hopscotch](#hopscotch) + - [Hopscotch Index Functions](#hopscotch-index-functions) + - [top](#top) + - [bottom](#bottom) + - [middle](#middle) + - [corner(index)](#cornerindex) + - [Gauntlet](#gauntlet) + - [Blitz](#blitz) + - [Blitz Index Functions](#blitz-index-functions) + - [row(height)](#rowheight) +
+ +## What is this? + +This is usage documentation for the `custom_mission_order` YAML option for Starcraft 2. You can enable Custom Mission Orders by setting `mission_order: custom` in your YAML. + +You will need to know how to write a YAML before engaging with this feature, and should read the [Archipelago YAML documentation](https://archipelago.gg/tutorial/Archipelago/advanced_settings/en) before continuing here. + +Every example in this document should be valid to generate. + +## Basic structure + +Custom Mission Orders consist of three kinds of structures: +- The mission order itself contains campaigns (like Wings of Liberty) +- Campaigns contain layouts (like Mar Sara) +- Layouts contain mission slots (like Liberation Day) + +As a note, layouts are also called questlines in the UI. Layouts and questlines refer to the same thing, though this document will only use layouts. + +To illustrate, the following is what the default custom mission order currently looks like. If you're not sure what some options mean, they will be explained in more depth later. +```yaml + custom_mission_order: + # This is a campaign, defined by its name + Default Campaign: + # The campaign's name as displayed in the client + display_name: "null" + # Whether this campaign must have a unique name in the client + unique_name: false + # Conditions that must be fulfilled to access this campaign + entry_rules: [] + # Whether beating this campaign is part of the world's goal + goal: true + # The lowest difficulty of missions in this campaign + min_difficulty: relative + # The highest difficulty of missions in this campaign + max_difficulty: relative + # This is a special layout that defines defaults + # for other layouts in the campaign + global: + # The layout's name as displayed in the client + display_name: "null" + # Whether this layout must have a unique name in the client + unique_name: false + # Whether beating this layout is part of the world's goal + goal: false + # Whether this layout must be beaten to beat the campaign + exit: false + # Conditions that must be fulfilled to access this layout + entry_rules: [] + # Which missions are allowed to appear in this layout + mission_pool: + - all missions + # The lowest difficulty of missions in this layout + min_difficulty: relative + # The highest difficulty of missions in this layout + max_difficulty: relative + # Used for overwriting default options of mission slots, + # which are set by the layout type (see Default Layout) + missions: [] + # This is a regular layout, defined by its name + Default Layout: + # This defines how missions in the layout are organized, + # as well as how they connect to one another + type: grid + # How many total missions should appear in this layout + size: 9 +``` +This default option also defines default values (though you won't get the Default Campaign and Default Layout), so you can omit the options you don't want to change in your own YAML. + +Notably however, layouts are required to have both a `type` and a `size`, but neither have defaults. You must define both of them for every layout, either through your own `global` layout, or in the options of every individual layout. + +If you want multiple campaigns or layouts, it would look like this: +```yaml + custom_mission_order: + My first campaign!: + # Campaign options here + global: # Can be omitted if the above defaults work for you + # Makes all the other layouts only have Terran missions + mission_pool: + - terran missions + # Other layout options here + My first layout: + # Defining at least type and size of a layout is mandatory + type: column + size: 3 + # Other layout options here + my second layout: + type: grid + size: 4 + layout number 3: + type: column + size: 3 + # etc. + Second campaign: + the other first layout: + type: grid + size: 10 + # etc. +``` +If you don't want to have a campaign container for your layouts, you can also forego the campaign layer like this: +```yaml + custom_mission_order: + Example campaign-level layout: + # Make sure to always declare these two, like with regular layouts + type: column + size: 3 + + # Regular campaigns and campaign-less layouts + # can be mixed however you want + Some Campaign: + Some Layout: + type: column + size: 3 +``` +It is also possible to access mission slots by their index, which is defined by the type of the layout they are in. The below shows an example of how to access a mission slot, as well as the defaults for their options. + +However, keep in mind that layout types will set their own options for specific slots, overwriting the below defaults, and using this option in turn overwrites the values set by layout types. As before, the options are explained in more depth later. +```yaml + custom_mission_order: + My Campaign: + My Layout: + type: column + size: 5 + missions: + # 0 is often the layout's starting mission + # Any index between 0 and (size - 1) is accessible + - index: 0 + # Whether this mission is part of the world's goal + goal: false + # Whether this mission is accessible as soon as the + # layout is accessible + entrance: false + # Whether this mission is required to beat the layout + exit: false + # Whether this slot contains a mission at all + empty: false + # Conditions that must be fulfilled to access this mission + entry_rules: [] + # Which missions in the layout are unlocked by this mission + # This is normally set by the layout's type + next: [] + # Which missions are allowed to appear in this slot + # If not defined, the slot inherits the layout's pool + mission_pool: + - all missions + # Which specific difficulty this mission should have + difficulty: relative +``` +## Interactions with other YAML options + +Custom Mission Orders respect all the options that change which missions can appear as if the options' relevant missions had been excluded. For example, `selected_races: protoss` is equivalent to excluding all Zerg and Terran missions, and `enabled_campaigns: ["Wings of Liberty"]` is equivalent to excluding all but WoL missions. + +This means that if you want total control over available missions in your mission order via `mission_pool`s, you should enable all races and campaigns and leave your `excluded_missions` list empty, but you can also use these options to get rid of particular missions you never want and can then ignore those missions in your `mission_pool`s. + +There are, however, several options that are ignored by Custom Mission Orders: +- `mission_order`, because it has to be `custom` for your Custom Mission Order to apply +- `maximum_campaign_size`, because you determine the size of the mission order via layout `size` attributes +- `two_start_positions`, which you can instead determine in individual layouts of the appropriate `type`s (see Grid and Hopscotch sections below) +- `key_mode`, which you can still specify for presets (see Campaign Presets section), and can otherwise manually set up using Item entry rules + +## Instructions for building a mission order + +Normally when you play a Starcraft 2 world, you have a table of missions in the Archipelago SC2 Client, and hovering over a mission tells you what missions are required to access it. This is still true for custom mission orders, but you now have control over the way missions are visually organized, as well as their access requirements. + +This section is meant to offer some guidance when making your own mission order for the first time. + +To begin making your own mission order, think about how you visually want your missions laid out. This should inform the layout `type`s you want to use, and give you some idea about the overall structure of your mission order. + +For example, if you want to make a custom campaign like the vanilla ones, you will want a lot of layouts of [`type: column`](#column). If you want a Hopscotch layout with certain missions or races, a single layout with [`type: hopscotch`](#hopscotch) will suffice. If you want to play through a funny shape, you will want to draw with a [`type: canvas`](#canvas). If you just want to make a minor change to a vanilla campaign, you will want to start with a [`preset` campaign](#preset). + +The natural flow of a mission order is defined by the types of its layouts. It makes sense for a mission to unlock its neighbors, it makes sense for a Hopscotch layout to wrap around the sides, and it makes sense for a Column's final mission to be at the bottom. Layout types create their flow by setting [`next`](#next), [`entrance`](#entrance), [`exit`](#exit), and [`entry_rules`](#entry-rules) on missions. More on these in a little bit. + +Layout types dictate their own visual structure, and will only rarely make mission slots with `empty: true`. If you want a certain shape that's not exactly like an existing type, you can pick a type with more slots than you want and remove the extras by setting `empty: true` on them. + +With the basic setup in place, you should decide on what the goal of your mission order is. By default every campaign has `goal: true`, meaning all campaigns must be beaten to complete the world. You can additionally set `goal: true` on layouts and mission slots to require them to be beaten as well. If you set `goal: false` on everything, the mission order will default to setting the last campaign (lowest in your YAML) as the goal. + +After deciding on a goal, you can complicate your way towards it. At the start of a world, the only accessible missions in the mission order are all the missions marked `entrance: true`. When you beat one of these missions, it unlocks all the missions in the beaten mission's `next` list. This process repeats until all the missions are accessible. + +If this behavior isn't enough for your planned mission order, you can interrupt the natural flow of layout types using `entry_rules` in combination with `exit`. + +When this document refers to "beating" something, it means the following: +- A mission is beaten if it is accessible and its victory location is checked. +- Beating a layout means beating all the missions in the layout with `exit: true` +- Beating a campaign means beating all the layouts in the campaign with `exit: true` + +Note victory checks may be claimed by someone else running `!collect` in a multiworld and receiving an item on a victory check. Collecting victory cache checks do not count, only victory checks. + +Layouts will have their default exit missions set by the layout type. If you don't want to use this default, you will have to manually set `exit: false` on the default exits. Campaigns default to using the last layout in them (the lowest in your YAML) as their exit, but only if you don't manually set `exit: true` on a layout. + +Using `entry_rules`, you can make a mission require beating things other than those missions whose `next` points to it, and you can make layouts and campaigns not available from the start. + +Note that `entry_rules` are an addition to the `next` behavior. If you want a mission to completely ignore the natural flow and only use your `entry_rules`, simply set `entrance: true` on it. + +Please see the [`entry_rules`](#entry-rules) section below for available rules and examples. + +With your playthrough sufficiently complicated, it only remains to add flavor to your mission order by changing [`mission_pool`](#mission-pool) and [`difficulty`](#difficulty) options as you like them. These options are also explained below. + +To summarize: +- Start by setting up campaigns and layouts with appropriate layout `type`s and `size`s +- Decide the mission order's `goal`s +- Customize access requirements as desired: + - Use `entrance`, `next`, and `empty` on mission slots to change the unlocking order of missions within a layout + - Use `entry_rules` in combination with `exit` to add additional restrictions to missions, layouts, and campaigns +- Use the `mission_pool` and `difficulty` options to add flavor +- Finally, generate and have fun! + +## Shared options + +These are the options that are shared between at least two of campaigns, layouts and missions. All the options below are listed with their defaults. + +--- +### Display Name +```yaml +# For campaigns and layouts +display_name: "null" +``` +As shown in the examples, every campaign and layout is defined with a name in your YAML. This name is used to find campaigns and layouts within the mission order (see `entry_rules` section), and by default (meaning with `display_name: "null"`) it is also shown in the client. + +This option changes the name shown in the client without affecting the definition name. + +There are two special use cases for this option: +```yaml +# This means the campaign or layout +# will not have a title in the client +display_name: "" +``` +```yaml +# This will randomly pick a name from the given list of options +display_name: + - My First Choice + - My Second Choice + - My Third Choice +``` + +--- +### Unique name +```yaml +# For campaigns and layouts +unique_name: false +``` +This option prevents names from showing up multiple times in the client. It is recommended to be used in combination with lists of `display_name`s to prevent the generator from picking duplicate names. + +--- +### Goal +```yaml +# For campaigns +goal: true +``` +```yaml +# For layouts and missions +goal: false +``` +This determines whether the campaign, layout or mission is required to beat the world. If you turn this off for everything, the last defined campaign (meaning the lowest one in your YAML) is chosen by default. + +--- +### Exit +```yaml +# For layouts and missions +exit: false +``` +This determines whether beating the mission is required to beat its parent layout, and whether beating the layout is required to beat its parent campaign. + +--- +### Entry rules +```yaml +# For campaigns, layouts, and missions +entry_rules: [] +``` +This defines access restrictions for parts of the mission order. + +These are the available rules: +```yaml +entry_rules: + # Beat these things ("Beat rule") + - scope: [] + # Beat X amount of missions from these things ("Count rule") + - scope: [] + amount: -1 + # Find these items ("Item rule") + - items: {} + # Fulfill X amount of other conditions ("Subrule rule") + - rules: [] + amount: -1 +``` +Note that Item rules take both a name and amount for each item (see the example below). In general this rule treats items like the `locked_items` option, including that it will override `excluded_items`, but as a notable difference all items required for Item rules are marked as progression. If multiple Item rules require the same item, the largest required amount will be locked, **not** the sum of all amounts. + +Additionally, Item rules accept a special item: +```yaml +entry_rules: + - items: + Key: 1 +``` +This is a generic item that is converted to a key item for the specific scope it is under. Missions get Mission Keys, layouts get Questline Keys, and campaigns get Campaign Keys. If you want to know which specific key is created (for example to tie multiple unlocks to the same key), you can generate a test game and check in the client. + +You can also use one of the following key items for this purpose: +
+ Custom keys + + - `Terran Key` + - `Zerg Key` + - `Protoss Key` + - `Raynor Key` + - `Tychus Key` + - `Swann Key` + - `Stetmann Key` + - `Hanson Key` + - `Nova Key` + - `Tosh Key` + - `Valerian Key` + - `Warfield Key` + - `Mengsk Key` + - `Han Key` + - `Horner Key` + - `Kerrigan Key` + - `Zagara Key` + - `Abathur Key` + - `Yagdra Key` + - `Kraith Key` + - `Slivan Key` + - `Zurvan Key` + - `Brakk Key` + - `Stukov Key` + - `Dehaka Key` + - `Niadra Key` + - `Izsha Key` + - `Artanis Key` + - `Zeratul Key` + - `Tassadar Key` + - `Karax Key` + - `Vorazun Key` + - `Alarak Key` + - `Fenix Key` + - `Urun Key` + - `Mohandar Key` + - `Selendis Key` + - `Rohana Key` + - `Reigel Key` + - `Davis Key` + - `Ji'nara Key` + +
+ +These keys will never be used by the generator unless you specify them yourself. + +There is also a special type of key: +```yaml +entry_rules: + - items: + # These two forms are equivalent + Progressive Key: 5 + Progressive Key 5: 1 +``` +Progressive keys come in two forms: `Progressive Key: ` and `Progressive Key : 1`. In the latter form the item amount is ignored. Their track is used to group them, so all progressive keys with track 1 belong together, as do all with track 2, and so on. Item rules using progressive keys are sorted by how far into the mission order they appear and have their required amounts set automatically so that deeper rules require more keys, with each track of progressive keys performing its own sorting. + +Note that if any Item rule within a track belongs to a mission, the generator will accept ties, in which case the affected rules will require the same number of progressive keys. If a track only contains Item rules belonging to layouts and campaigns, the track will be sorted in definition order (top to bottom in your YAML), so there will be no ties. + +If you prefer not to manually specify the track, use the [`unique_progression_track`](#unique-progression-track) option. + +The Beat and Count rules both require a list of scopes. This list accepts addresses towards other parts of the mission order. + +The basic form of an address is `//`, where `` and `` are the definition names (not `display_names`!) of a campaign and a layout within that campaign, and `` is the index of a mission slot in that layout or an index function for the layout's type. See the section on your layout's type to find valid indices and functions. + +If you don't want to point all the way down to a mission slot, you can omit the later parts. `` and `/` are valid addresses, and will point to the entire specified campaign or layout. + +Futhermore, you can generically refer to the parent of an object using `..`, so if you are creating entry rules for a given layout and want to point at a different `` in the same ``, the following are identical: +- `../` +- `/` + +You can also chain these, so for a given mission `../..` will point to its parent campaign. + +Lastly, you can point to the whole mission order via `/..` (or the equivalent number of `..`s from a given layer), but this is only supported for Count rules and not Beat rules. + +Note that if you have a campaign-less layout, you will not require a `` part to find it, and `..` will skip the campaign layer. + +Below are examples of the available entry rules: +```yaml + custom_mission_order: + Some Missions: + type: grid + size: 9 + entry_rules: + # Item rule: + # To access the Some Missions layout, + # you have to find or receive your Marine + - items: + Marine: 1 + + Wings of Liberty: + Mar Sara: + type: column + size: 3 + Artifact: + type: column + size: 3 + entry_rules: + # Beat rule: + # To access the Artifact layout, + # you have to first beat Mar Sara + - scope: ../Mar Sara + Prophecy: + type: column + size: 3 + entry_rules: + # Beat rule: + # Beat the mission at index 1 in the Artifact layout + - scope: ../Artifact/1 + # This is identical to the above + # because this layout is already in Wings of Liberty + - scope: Wings of Liberty/Artifact/1 + Covert: + type: column + size: 3 + entry_rules: + # Count rule: + # Beat any 7 missions from Wings of Liberty + - scope: Wings of Liberty + amount: 7 + + Complicated Access: + type: column + size: 3 + entry_rules: + # Subrule rule: + # To access this layout, + # fulfill any 1 of the nested rules + # (See amount value at the bottom) + - rules: + # Nested Subrule rule: + # Fulfill all of the nested rules + # Amount can be at the top if you prefer + - amount: -1 # -1 means "all of them" + rules: + # Count rule: + # Beat any 5 missions from Wings of Liberty + - scope: Wings of Liberty + amount: 5 + # Count rule: + # Beat any 5 missions from Some Missions + - scope: Some Missions + amount: 5 + # Count rule: + # Beat any 10 combined missions from + # Wings of Liberty or Some Missions + - scope: + - Wings of Liberty + - Some Missions + amount: 10 + amount: 1 +``` +As this last example shows, the Subrule rule is a powerful tool for making arbitrarily complex requirements. Put plainly, the example accomplishes the following: To unlock the `Complicated Access` layout, either beat 5 missions in both the `Wings of Liberty` campaign and the `Some Missions` layout, or beat 10 missions across both of them. + +--- +### Unique progression track +```yaml +# For campaigns and layouts +unique_progression_track: 0 +``` +This option specifically affects Item entry rules using progressive keys. Progressive keys used by children of this campaign/layout that are on the given track will automatically be put on a track that is unique to the container instead. +```yaml + custom_mission_order: + First Column: + type: column + size: 3 + unique_progression_track: 0 # Default + missions: + - index: [1, 2] + entry_rules: + - items: + Progressive Key: 0 + Second Column: + type: column + size: 3 + unique_progression_track: 0 # Default + missions: + - index: [1, 2] + entry_rules: + - items: + Progressive Key: 0 +``` +In this example the two columns will use separate progressive keys for their missions. + +In the case that a mission slot uses a progressive key whose track matches the `unique_progression_track` of both its containing layout and campaign, the key will use the layout's unique track and not the campaign's. To avoid this behavior simply use different `unique_progression_track` values for the layout and campaign. + +--- +### Difficulty +```yaml +# These two apply to campaigns and layouts +min_difficulty: relative +max_difficulty: relative +# This one applies to missions +difficulty: relative +``` +Valid values are: +- Relative +- Starter +- Easy +- Medium +- Hard +- Very Hard + +These determine the difficulty of missions within campaigns, layouts, or specific mission slots. + +On `relative`, the difficulty of mission slots is dynamically scaled based on earliest possible access to that mission. By default, this scales the entire mission order to go from Starter missions at the start to Very Hard missions at the end. + +Campaigns can override these limits, layouts can likewise override the limits set by their campaigns, and missions can simply define their desired difficulty. + +In every case, if a mission's mission pool does not contain missions of an appropriate difficulty, it will attempt to find a mission of a nearby difficulty, preferring lower ones. + +```yaml + custom_mission_order: + Campaign: + min_difficulty: easy + max_difficulty: medium + Layout 1: + max_difficulty: hard + type: column + size: 3 + Layout 2: + type: column + size: 3 + missions: + - index: 0 + difficulty: starter +``` +In this example, `Campaign` is restricted to missions between Easy and Medium. `Layout 1` overrides Medium to be Hard instead, so its 3 missions will go from Easy to Hard. `Layout 2` keeps the campaign's limits, but its first mission is set to Starter. In this case, the first mission will be a Starter mission, but the other two missions will scale towards Medium as if the first had been an Easy one. + +--- +### Mission Pool +```yaml +# For layouts and missions +mission_pool: + - all missions +``` +Valid values are names of specific missions and names of mission groups. Group names can be looked up here: [APSC2 Mission Groups](https://matthewmarinets.github.io/ap_sc2_icons/missiongroups) + +If a mission defines this, it ignores the pool of its containing layout. To define a pool for a full campaign, define it in the `global` layout. + +This is a list of instructions for constructing a mission pool, executed from top to bottom, so the order of values is important. + +There are three available instructions: +- Addition: ``, `+` or `+ ` + - This adds the missions of the specified group into the pool +- Subtraction: `~` or `~ ` + - This removes the missions of the specified group from the pool + - Note that the operator is `~` and not `-`, because the latter is a reserved symbol in YAML. +- Intersection: `^` or `^ ` + - This removes all the missions from the pool that are not in the specified group. + +As a reminder, `` can also be the name of a specific mission. + +The first instruction in a pool must always be an addition. + +```yaml + custom_mission_order: + Campaign: + global: + type: column + size: 3 + mission_pool: + - terran missions + - ~ no-build missions + Layout A-1: + mission_pool: + - zerg missions + - ^ kerrigan missions + - + Lab Rat + Layout A-2: + missions: + - index: 0 + mission_pool: + - For Aiur! + - Liberation Day +``` +The following pools are constructed in this example: +- `Campaign` defines a pool that contains Terran missions, and then removes all No-Build missions from it. +- `Layout A-1` overrides this pool with Zerg missions, then keeps only the ones with Kerrigan in them, and then adds Lab Rat back to it. + - Lab Rat does not contain Kerrigan, but because the instruction to add it is placed after the instruction to remove non-Kerrigan missions, it is added regardless. +- The pool for the first mission of `Layout A-2` contains For Aiur! and Liberation Day. The remaining missions of `Layout A-2` use the Terran pool set by the `global` layout. + +## Campaign Options + +These options can only be used in campaigns. + +--- +### Preset +```yaml +preset: none +``` +This option loads a pre-built campaign into your mission order. Presets may accept additional options in addition to regular campaign options. + +With all presets, you can override their layout options by defining the layouts like normal in your YAML. +```yaml + custom_mission_order: + My Campaign: + preset: wol + prophecy + missions: random # Optional + shuffle_raceswaps: false # Optional + keys: none # Optional + Prophecy: + mission_pool: + - zerg missions +``` +This example loads the Wol + Prophecy preset and then changes Prophecy's missions to be Zerg instead of Protoss. + +See the following section for available presets. + +## Campaign Presets + +There are two kinds of presets: Static presets that are based on vanilla campaigns, and scripted presets that dynamically create a complex campaign based on extra required options. + +--- +### Static Presets +Available static presets are the following: +- `WoL + Prophecy` +- `WoL` +- `Prophecy` +- `HotS` +- `Prologue`, `LotV Prologue` +- `LotV` +- `Epilogue`, `LotV Epilogue` +- `NCO` +- `Mini WoL + Prophecy` +- `Mini WoL` +- `Mini Prophecy` +- `Mini HotS` +- `Mini Prologue`, `Mini LotV Prologue` +- `Mini LotV` +- `Mini Epilogue`, `Mini LotV Epilogue` +- `Mini NCO` + +For these presets, the layout names used to override settings match the names shown in the client, with some exceptions: +- Prophecy, Prologue and Epilogue contain a single Gauntlet each, which are named `Prophecy`, `Prologue` and `Epilogue` respectively. +- The Gauntlets in the Mini variants of the above are also named `Prophecy`, `Prologue` and `Epilogue`. +- NCO and Mini NCO contain three columns each, named `Mission Pack 1`, `Mission Pack 2` and `Mission Pack 3`. + +#### Preset Options +All static presets accept these options, as shown in the example above: + +##### Missions +The `missions` option accepts these possible values: +- `random` (default), which removes pre-defined `mission_pool` options from layouts and missions, meaning all missions will follow the pool defined in your campaign's `global` layout. This is the default if you don't define the `missions` option. +- `vanilla_shuffled`, which will leave `mission_pool`s on layouts to shuffle vanilla missions within their respective campaigns. +- `vanilla`, which will leave all missions as they are in the vanilla campaigns. + +##### Shuffle Raceswaps +The `shuffle_raceswaps` option accepts `true` and `false` (default). If enabled, the missions pools in the preset will contain raceswapped missions. This means `missions: vanilla_shuffled` will shuffle raceswaps alongside their regular variants, and `missions: vanilla` will allow a random variant of the mission in each slot. This option does nothing if `missions` is set to `random`. + +##### Keys +The `keys` option accepts these possible values: +- `none` (default), which does not add any Key Item rules to the preset. +- `layouts`, which adds Key Item rules to layouts besides the preset's left-most layout, in addition to their regular entry rules. +- `missions`, which adds Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. +- `progressive_layouts`, which adds Progressive Key Item rules to layouts besides the preset's left-most layout, in addition to their regular entry rules. These progressive keys use track 0, with presets using the default `unique_progression_track: 0`. +- `progressive_missions`, which adds Progressive Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. These progressive keys use track 1 and do not make use of `unique_progression_track`. +- `progressive_per_layout`, which adds Progressive Key Item rules to all missions within each layout besides the preset's left-most one. These progressive keys use track 0, with presets and their layouts using the default `unique_progression_track: 0`. + +--- +### Golden Path +```yaml +preset: golden path +size: # Required, no default, accepts positive numbers +two_start_positions: false +keys: none # Optional +``` +Golden Path aims to create a dynamically-sized campaign with branching paths to create a similar experience to the Wings of Liberty campaign. It accomplishes this by having a main column that requires an increasing number of missions to be beaten to advance, and a number of side columns that require progressing the main column to advance. The exit of a Golden Path campaign is the last mission of the main column. + +The `size` option defines the number of missions in the campaign. + +If `two_start_positions`, the first mission will be skipped, and the first two branches will be available from the start instead. + +The columns in a Golden Path get random names from a `display_name` list and have `unique_name: true` set on them. Their definition names for overriding options are `"0"`, `"1"`, `"2"`, etc., with `"0"` always being the main column, `"1"` being the left-most side column, and so on. + +Since the number of side columns depends on the number of missions, it is best to generate a test game for a given size to see how many columns are generated. + +Golden Path also accepts a `keys` option, which works like the same option for static presets, and accepts the following values: +- `none` (default), which does not add any Key Item rules to the preset. +- `layouts`, which adds Key Item rules to all side columns, in addition to their regular entry rules. +- `missions`, which adds Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. +- `progressive_layouts`, which adds Progressive Key Item rules to all side columns, in addition to their regular entry rules. These progressive keys use track 0, with this preset using the default `unique_progression_track: 0`. +- `progressive_missions`, which adds Progressive Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. These progressive keys use track 1 and do not make use of `unique_progression_track`. +- `progressive_per_layout`, which adds Progressive Key Item rules to all missions within each side column. These progressive keys use track 0, with this preset and its layouts using the default `unique_progression_track: 0`. + +## Layout Options + +Layouts may have special options depending on their `type`. These are covered in the section on Layout Types. +Below are the options that apply to every layout. + +--- +### Type +```yaml +type: # There is no default +``` +Determines how missions are placed relative to one another within a layout, as well as how they connect to each other. + +Currently, valid values are: +- Column +- Grid +- Hopscotch +- Gauntlet +- Blitz + +Details about specific layout types are covered at the end of this document. + +--- +### Size +```yaml +size: # There is no default +``` +Determines how many missions a layout contains. Valid values are positive numbers. + +### Missions +```yaml +missions: [] +``` +This is used to access mission slots and overwrite the options that the layout type set for them. Valid options for mission slots are covered below, but the `index` option used to find mission slots is explained here. + +Note that this list is evaluated from top to bottom, meaning if you perform conflicting changes on the same mission slot, the last defined operation (lowest in your YAML) will be the one that takes effect. + +The following example shows ways to access and modify missions: +```yaml + custom_mission_order: + My Example: + type: grid + size: 4 + missions: + # Indices can be a numerical value + # This sets the mission at index 1 to be an exit + - index: 1 + exit: true + # Indices can be special index functions + # Valid functions are 'exits', 'entrances', and 'all' + # These are available for all types of layouts + # This takes all exits, including the one set above, + # and turns them into non-exits + - index: exits + exit: false + # Indices can be index functions + # Available functions depend on the layout's type + # In this case the function will return the indices 1 and 3 + # and then mark those two slots as empty + - index: rect(1, 0, 1, 2) + empty: true + # Indices can be a list of valid values + # This takes all entrances as well as the mission at index 2 + # and marks all of them as both entrances and exits + - index: + - entrances + - 2 + entrance: true + exit: true +``` +The result of this example will be a grid where the two missions on the right are empty, and the two missions on the left are both entrances and exits. + +## Mission Slot Options + +For all options in mission slots, the layout type containing the mission slot choses the defaults, and any values you define override the type's defaults. + +--- +### Entrance +```yaml +entrance: false +``` +Determines whether this mission is an entrance for its containing layout. An entrance mission becomes available its parent layout's and campaign's `entry_rules` are fulfilled, but may further be restricted by its own `entry_rules`. + +If for any reason a mission cannot be unlocked by beating other missions, meaning that there is no mission whose `next` points at this mission, then this missions will be automatically marked as entrances. However, this cannot detect circular dependencies, for example if you cut off a section of a grid, so make sure to manually set entrances as appropriate in those cases. + +--- +### Empty +```yaml +empty: false +``` +Determines whether this mission slot contains a mission at all. If set to `true`, the slot is empty and will show up as a blank space in the client. + +Layout types have their own means of creating blank spaces in the client, and so rarely use this option. If you want complete control over a layout's slots, use a layout of `type: grid`. + +--- +### Next +```yaml +next: [] +``` +Valid values are indices of other missions within the same layout and index functions for the layout's type. Note that this does not accept addresses. + +This is the mechanism layout types use to establish mission flow. Overriding this will break the intended order of missions within a type. If you wish to add on to the type's flow rather than replace it, you must manually include the indices intended by the type. + +Mechanically, a mission is unlocked when any other mission that contains the former in its `next` list is beaten. If a mission is not present in any other mission's `next` list, it is automatically marked as an entrance. +```yaml + custom_mission_order: + Wings of Liberty: + Char: + type: column + size: 4 + missions: + - index: 0 + next: + - 1 + - 2 + - index: 1 + next: + - 3 + # The below two are default for a column + # and could be removed from this list + - index: 2 + next: + - 3 + - index: 3 + next: [] + +``` +This example creates the branching path within `Char` in the Vanilla mission order. + +--- +### Victory Cache +```yaml +victory_cache: 0 +``` +Valid values are integers in the range 0 to 10. Sets the number of extra locations given for victory on a mission. + +By default, when this value is not set, the option is set to 0 for goal missions and to the global `victory_cache` option for all other missions. + +## Layout Types + +The below types are listed with their custom options and their defaults. + +--- +### Column +```yaml +type: column +``` + +This is a linear order going from top to bottom. + +A `size: 5` column has the following indices: +```yaml +0 # This is the default entrance +1 +2 +3 +4 # This is the default exit (size - 1) +``` + +--- +### Grid +```yaml +type: grid +width: 0 # Accepts positive numbers +two_start_positions: false # Accepts true/false +``` +This is a rectangular order. Beating a mission unlocks adjacent missions in cardinal directions. + +`width` sets the width of the grid, and height is determined via `size` and `width`. If `width` is set to 0, the width and height are determined automatically. + +If `two_start_positions`, the top left corner will be set to `empty: true`, and its two neighbors will be entrances instead. + +If `size` is too small for the determined width and height, then slots in the bottom left and top right corners will be removed to fit the given `size`. These empty slots are still accessible by index. + +A `size: 25`, `width: 5` grid has the following indices: +```yaml + 0 1 2 3 4 + 5 6 7 8 9 +10 11 12 13 14 +15 16 17 18 19 +20 21 22 23 24 +``` +The top left corner (index `0`) is the default entrance. The bottom right corner (index `size - 1`) is the default exit. + +#### Grid Index Functions +Grid supports the following index functions: + +##### point(x, y) +`point(x, y)` returns the index at the given zero-based X and Y coordinates. In the above example, `point(2, 4)` is index `22`. + +##### rect(x, y, width, height) +`rect(x, y, width, height)` returns the indices within the rectangle defined by the starting point at the X and Y coordinates and the width and height arguments. In the above example, `rect(1, 2, 3, 2)` returns the indices `11, 12, 13, 16, 17, 18`. + +--- +### Canvas +```yaml +type: canvas +canvas: # No default +jump_distance_orthogonal: 1 # Accepts numbers >= 1 +jump_distance_diagonal: 1 # Accepts numbers >= 0 +``` + +This is a special type of grid that is created from a drawn canvas. For this type of layout `canvas` is required and `size` is ignored if specified. + +`canvas` is a list of strings that form a rectangular grid, from which the layout's `size` is determined automatically. Every space in the canvas creates an empty slot, while every character that is not a space creates a filled mission slot. The resulting grid determines its indices like [Grid](#Grid). + +```yaml +type: canvas +canvas: +- ' ggg ' # 0 +- ' ggggg ' # 1 +- ' ggggg ' # 2 +- ' bbb ggg rrr ' # 3 +- 'bbbbb g rrrrr' # 4 +- 'bbbbb rrrrr' # 5 +- ' ggg bbb ' # 6 +- 'ggggg bbbbb' # 7 +- 'gggg bbbb' # 8 +- 'ggg rrr bbb' # 9 +- ' gg rrrrr bb ' # 10 +- ' rrrrr ' # 11 +- ' rrrrr ' # 12 +- ' rrr ' # 13 +jump_distance_orthogonal: 2 +jump_distance_diagonal: 1 +missions: +- index: group(g) + mission_pool: Terran Missions +- index: group(b) + mission_pool: Protoss Missions +- index: group(r) + mission_pool: Zerg Missions +``` +This example draws the Archipelago logo using missions of different races as its colors. Note that while this example fits into 13 lines, there is no set limit for how many lines you may use, and likewise lines may be as long as you need them to be. Short lines are padded with spaces to match the longest line in the canvas, so lines are left-aligned in this case. + +You may have noticed that the above example has gaps between missions. Canvas layouts support jumping over gaps via `jump_distance_orthogonal` and `jump_distance_diagonal`, which determine the maximum distance over which two missions may be connected, in orthogonal and diagonal directions respectively. Missions at higher distances will only connect if there is no other mission in front of them. + +```yaml +type: canvas +canvas: +- 'A A' +- 'B XB' +jump_distance_orthogonal: 3 +jump_distance_diagonal: 0 +``` +In this example the two `A`s will connect because they are less than 3 missions apart, but the two `B`s will not connect because `X` is between them, and both `B`s will connect to `X` instead. Both sets of `AB`s will also connect because they are neighbors. + +Diagonal jumps function identically, with one exception: +```yaml +type: canvas +canvas: +- 'A ' +- ' B ' +- ' XC' +jump_distance_orthogonal: 1 +jump_distance_diagonal: 1 +``` +Missions that are diagonal neighbors only connect if they do not already share an orthogonal neighbor. In this example `A` and `B` connect, but `B` and `C` don't because `X` already connects them. No such restriction exists for higher-distance diagonal jumps, so it is recommended to keep `jump_distance_diagonal` low. + +Finally, the default entrance and exit on a canvas are dynamically set to be the non-empty slots that are closest to the top left and bottom right corner respectively, but only if you don't set any entrances or exits yourself. It is highly recommended to set your own entrance and exit. + +#### Canvas Index Functions +Canvas supports all of [Grid's index functions](#grid-index-functions), as well as the following: + +##### group(character) +`group(character)` returns the indices which match the given character on the canvas. In the Archipelago logo example, `group(g)` gives the indices of all the `g`s on the canvas. Note that there is no group for spaces, so `group(" ")` does not work. + +--- +### Hopscotch +```yaml +type: hopscotch +width: 7 # Accepts numbers >= 4 +spacer: 2 # Accepts numbers >= 1 +two_start_positions: false # Accepts true/false +``` + +This order alternates between one and two missions becoming available at a time. + +`width` determines how many mini columns are allowed to be next to one another before they wrap around the sides. `spacer` determines the amount of empty slots between diagonals in the client. + +If `two_start_positions`, the top left corner will be set to `empty: true`, and its two neighbors will be entrances instead. + +A `size: 23`, `width: 4`, `spacer: 1` Hopscotch layout has the following indices: +```yaml + 0 2 + 1 3 5 + 4 6 8 +11 7 9 +12 14 10 +13 15 17 + 16 18 20 + 19 21 + 22 +``` +The top left corner (index `0`) is the default entrance. The bottom-most mission of the lowest column (index `size - 1`) is the default exit. + +#### Hopscotch Index Functions +Hopscotch supports the following index functions: + +##### top +`top()` (or `top`) returns the indices of all the top-right corners. In the above example, it returns the indices `2, 5, 8, 11, 14, 17, 20`. + +##### bottom +`bottom()` (or `bottom`) returns the indices of all the bottom-left corners. In the above example, it returns the indices `1, 4, 7, 10, 13, 16, 19, 22`. + +##### middle +`middle()` (or `middle`) returns the indices of all the middle slots. In the above example, it returns the indices `0, 3, 6, 9, 12, 15, 18, 21`. + +##### corner(index) +`corner(index)` returns the indices within the given corner. A corner is a slot in the middle and the slots to the bottom and right of it. `corner(0)` would return `0, 1, 2`, `corner(1)` would return `3, 4, 5`, and so on. In the above example, `corner(7)` will only return `21, 22` because it does not have a right mission. + +--- +### Gauntlet +```yaml +type: gauntlet +width: 7 # Accepts positive numbers +``` +This type works the same way as column, but it goes horizontally instead of vertically. + +`width` is the maximum allowed missions on a row before it wraps around into a new row. + +A `size: 21`, `width: 7` gauntlet has the following indices: +```yaml + 0 1 2 3 4 5 6 + + 7 8 9 10 11 12 13 + +14 15 16 17 18 19 20 +``` +The left-most mission on the top row (index `0`) is the default entrance. The right-most mission on the bottom row (index `size - 1`) is the default exit. + +--- +### Blitz +```yaml +type: blitz +width: 0 # Accepts positive numbers +``` +This type features rows of missions, where beating a mission in a row unlocks the entire next row. + +`width` determines how many missions there are in a row. If set to 0, the width is determined automatically based on the total number of missions (the layout's `size`), but limited to be between 2 and 5. + +A `size: 20`, `width: 5` Blitz layout has the following indices: +```yaml + 0 1 2 3 4 + 5 6 7 8 9 +10 11 12 13 14 +15 16 17 18 19 +``` +The top left corner (index `0`) is the default entrance. The right-most mission on the bottom row (index `size - 1`) is the default exit. + +#### Blitz Index Functions +Blitz supports the following index function: + +##### row(height) +`row(height)` returns the indices of the row at the given zero-based height. In the above example, `row(1)` would return `5, 6, 7, 8, 9`. diff --git a/worlds/sc2/docs/en_Starcraft 2.md b/worlds/sc2/docs/en_Starcraft 2.md index e860e8a6..74ba46c3 100644 --- a/worlds/sc2/docs/en_Starcraft 2.md +++ b/worlds/sc2/docs/en_Starcraft 2.md @@ -12,7 +12,7 @@ The following unlocks are randomized as items: 1. Your ability to build any non-worker unit. 2. Unit specific upgrades including some combinations not available in the vanilla campaigns, such as both strain choices simultaneously for Zerg and every Spear of Adun upgrade simultaneously for Protoss! -3. Your ability to get the generic unit upgrades, such as attack and armour upgrades. +3. Your ability to get the generic unit upgrades, such as attack and armor upgrades. 4. Other miscellaneous upgrades such as laboratory upgrades and mercenaries for Terran, Kerrigan levels and upgrades for Zerg, and Spear of Adun upgrades for Protoss. 5. Small boosts to your starting mineral, vespene gas, and supply totals on each mission. @@ -94,22 +94,31 @@ Will overwrite existing files * Run without arguments to list all factions and colors that are available. * `/option [option_name] [option_value]` Sets an option normally controlled by your yaml after generation. * Run without arguments to list all options. + * Run without `option_value` to check the current value of the option * Options pertain to automatic cutscene skipping, Kerrigan presence, Spear of Adun presence, starting resource amounts, controlling AI allies, etc. * `/disable_mission_check` Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play the next mission in a chain the other player is doing. -* `/play [mission_id]` Starts a StarCraft 2 mission based off of the mission_id provided -* `/available` Get what missions are currently available to play -* `/unfinished` Get what missions are currently available to play and have not had all locations checked * `/set_path [path]` Manually set the SC2 install directory (if the automatic detection fails) +* `/windowed_mode [true|false]` to toggle whether the game will start in windowed mode. Note that the behavior of the command `/received` was modified in the StarCraft 2 client. -In the Common client of Archipelago, the command returns the list of items received in the reverse order they were -received. -In the StarCraft 2 client, the returned list will be divided by races (i.e., Any, Protoss, Terran, and Zerg). -Additionally, upgrades are grouped beneath their corresponding units or buildings. -A filter parameter can be provided, e.g., `/received Thor`, to limit the number of items shown. -Every item whose name, race, or group name contains the provided parameter will be shown. + +* In the Common client of Archipelago, the command returns the list of items received in the reverse order they were + received. +* In the StarCraft 2 client, the returned list will be divided by races (i.e., Any, Protoss, Terran, and Zerg). + Additionally, upgrades are grouped beneath their corresponding units or buildings. +* A filter parameter can be provided, e.g., `/received Thor`, to limit the number of items shown. + * Every item whose name, race, or group name contains the provided parameter will be shown. +* Use `/received recent [amount]` to display the last `amount` items received in chronological order + * `amount` defaults to 20 if not specified + +## Client-side settings +Some settings can be set or overridden on the client side rather than within a world's options. +This can allow, for example, overriding difficulty to always be `hard` no matter what the world specified. +It can also modify display properties, like the client's window size on startup or the launcher button colours. + +Modify these within the `sc2_options` section of the host.yaml file within the Archipelago directory. ## Particularities in a multiworld @@ -118,9 +127,9 @@ Every item whose name, race, or group name contains the provided parameter will One of the default options of multiworlds is that once a world has achieved its goal, it collects its items from all other worlds. If you do not want this to happen, you should ask the person generating the multiworld to set the `Collect Permission` -option to something else, e.g., manual. +option to something else, such as "Manual" or "Allow on goal completion." If the generation is not done via the website, the person that does the generation should modify the `collect_mode` -option in their `host.yaml` file prior to generation. +option in their `host.yaml` file prior to generation. If the multiworld has already been generated, the host can use the command `/option collect_mode [value]` to change this option. @@ -135,4 +144,6 @@ This does not affect the game and can be ignored. - Currently, the StarCraft 2 client uses the Victory locations to determine which missions have been completed. As a result, the Archipelago collect feature can sometime grant access to missions that are connected to a mission that you did not complete. + - If all victory locations are collected in this manner, victory is not sent until the player replays a final mission + and recollects the victory location. diff --git a/worlds/sc2/docs/fr_Starcraft 2.md b/worlds/sc2/docs/fr_Starcraft 2.md index 190802e9..c340ecc2 100644 --- a/worlds/sc2/docs/fr_Starcraft 2.md +++ b/worlds/sc2/docs/fr_Starcraft 2.md @@ -112,10 +112,6 @@ supplémentaires données au début des missions, la capacité de contrôler les * `/disable_mission_check` Désactive les requit pour lancer les missions. Cette option a pour but de permettre de jouer en mode coopératif en permettant à un joueur de jouer à la prochaine mission de la chaîne qu'un autre joueur est en train d'entamer. -* `/play [mission_id]` Lance la mission correspondant à l'identifiant donné. -* `/available` Affiche les missions qui sont présentement accessibles. -* `/unfinished` Affiche les missions qui sont présentement accessibles et dont certains des objectifs permettant -l'accès à un *item* n'ont pas été accomplis. * `/set_path [path]` Permet de définir manuellement où *StarCraft 2* est installé ce qui est pertinent seulement si la détection automatique de cette dernière échoue. @@ -151,4 +147,4 @@ Cela n'affecte pas le jeu et peut être ignoré. - Actuellement, le client de *StarCraft 2* utilise la *location* associée à la victoire d'une mission pour déterminer si celle-ci a été complétée. En conséquence, la fonctionnalité *collect* d'*Archipelago* peut rendre accessible des missions connectées à une -mission que vous n'avez pas terminée. \ No newline at end of file +mission que vous n'avez pas terminée. diff --git a/worlds/sc2/docs/setup_en.md b/worlds/sc2/docs/setup_en.md index 4364008b..0ddb9a3b 100644 --- a/worlds/sc2/docs/setup_en.md +++ b/worlds/sc2/docs/setup_en.md @@ -62,69 +62,128 @@ If the Progression Balancing of one world is greater than that of others, items obtained early, and vice versa if its value is smaller. However, StarCraft 2 is more permissive regarding the items that can be used to progress, so this option has little influence on progression in a StarCraft 2 world. -StarCraft 2. Since this option increases the time required to generate a MultiWorld, we recommend deactivating it (i.e., setting it to zero) for a StarCraft 2 world. -#### How do I specify items in a list, like in excluded items? +#### What does Tactics Level do? + +Tactics level allows controlling the difficulty through what items you're likely to get early. +This is independent of game difficulty like causal, normal, hard, or brutal. + +"Standard" and "Advanced" levels are guaranteed to be beatable with the items you are given. +The logic is a little more restrictive than a player's creativity, so an advanced player is likely to have +more items than they need in any situation. These levels are entirely safe to use in a multiworld. + +The "Any Units" level only guarantees that a minimum number of faction-appropriate units or buildings are reachable +early on, with minimal restrictions on what those units are. +Generation will guarantee a number of faction-appropriate units are reachable before starting a mission, +based on the depth of that mission. For example, if the third mission is a zerg mission, it is guaranteed that 2 +zerg units are somewhere in the preceding 2 missions. This logic level is not guaranteed to be beatable, and may +require lowering the difficulty level (`/difficulty` in the client) if many no-build missions are excluded. + +The "No Logic" level provides no logical safeguards for beatability. It is only safe to use in a multiworld if the player curates +a start inventory or the organizer is okay with the possibility of the StarCraft 2 world being unbeatable. +Safeguards exist so that other games' items placed in the StarCraft 2 world are reachable under "Advanced" logic rules. + +#### How do I specify items in a list, like in enabled campaigns? You can look up the syntax for yaml collections in the [YAML specification](https://yaml.org/spec/1.2.2/#21-collections). -For lists, every item goes on its own line, started with a hyphen: +For lists, every item goes on its own line, started with a hyphen. +Putting each element on its own line makes it easy to toggle elements by commenting +(ie adding a `#` character at the start of the line). ```yaml -excluded_items: - - Battlecruiser - - Drop-Pods (Kerrigan Tier 7) + enabled_campaigns: + - Wings of Liberty + # - Heart of the Swarm + - Legacy of the Void + - Nova Covert Ops + - Prophecy + - 'Whispers of Oblivion (Legacy of the Void: Prologue)' + # - 'Into the Void (Legacy of the Void: Epilogue)' +``` + +An inline syntax may also be used for short lists: + +```yaml + enabled_campaigns: ['Wings of Liberty', 'Nova Covert Ops'] ``` An empty list is just a matching pair of square brackets: `[]`. -That's the default value in the template, which should let you know to use this syntax. +That's often the default value in the template, which should let you know to use this syntax. -#### How do I specify items for the starting inventory? +#### How do I specify items for key-value mappings, like starting inventory or filler item distribution? -The starting inventory is a YAML mapping rather than a list, which associates an item with the amount you start with. -The syntax looks like the item name, followed by a colon, then a whitespace character, and then the value: +Many options pertaining to the item pool are yaml mappings. +These are several lines, where each line looks like a name, followed by a colon, then a space, then a value. ```yaml -start_inventory: - Micro-Filtering: 1 - Additional Starting Vespene: 5 + start_inventory: + Micro-Filtering: 1 + Additional Starting Vespene: 5 + + locked_items: + MULE (Command Center): 1 ``` +For options like `start_inventory`, `locked_items`, `excluded_items`, and `unexcluded_items`, the value +is a number specifying how many copies of an item to start with/exclude/lock. +Note the name can also be an item group, and the value will then be added to the values for all the items +within the group. A value of `0` will exclude all copies of an item, but will add +0 if the value +is also specified by another name. + +For options like `filler_items_distribution`, the value is a number specifying the relative weight of +a filler item being that particular item. + +For the `custom_mission_order` option, the value is a nested structure of other mapppings to specify the structure +of the mission order. See the [Custom Mission Order documentation](/tutorial/Starcraft%202/custom_mission_orders_en) + An empty mapping is just a matching pair of curly braces: `{}`. That's the default value in the template, which should let you know to use this syntax. #### How do I know the exact names of items and locations? -The [*datapackage*](/datapackage) page of the Archipelago website provides a complete list of the items and locations -for each game that it currently supports, including StarCraft 2. - -You can also look up a complete list of the item names in the +You can look up a complete list of the item names in the [Icon Repository](https://matthewmarinets.github.io/ap_sc2_icons/) page. This page also contains supplementary information of each item. -However, the items shown in that page might differ from those shown in the datapackage page of Archipelago since the -former is generated, most of the time, from beta versions of StarCraft 2 Archipelago undergoing development. -As for the locations, you can see all the locations associated to a mission in your world by placing your cursor over -the mission in the 'StarCraft 2 Launcher' tab in the client. +Locations are of the format `: `. Names are most easily looked up by hovering +your mouse over a mission in the launcher tab of a client. Note this requires already generating a game connect to. + +This information can also be found in the [*datapackage*](/datapackage) page of the Archipelago website. +This page includes all data associated with all games. ## How do I join a MultiWorld game? 1. Run ArchipelagoStarcraft2Client.exe. - macOS users should instead follow the instructions found at ["Running in macOS"](#running-in-macos) for this step only. -2. Type `/connect [server ip]`. +2. In the Archipelago tab, type `/connect [server IP]`. - If you're running through the website, the server IP should be displayed near the top of the room page. + - The server IP may also be typed into the top bar, and then clicking "Connect" 3. Type your slot name from your YAML when prompted. 4. If the server has a password, enter that when prompted. 5. Once connected, switch to the 'StarCraft 2 Launcher' tab in the client. There, you can see all the missions in your -world. -Unreachable missions will have greyed-out text. Just click on an available mission to start it! +world. + +Unreachable missions will have greyed-out text. Completed missions (all locations collected) will have white text. +Accessible but incomplete missions will have blue text. Goal missions will have a gold border. +Mission buttons will have a color corresponding to the faction you play as in that mission. + +Click on an available mission to start it. ## The game isn't launching when I try to start a mission. -First, check the log file for issues (stored at `[Archipelago Directory]/logs/SC2Client.txt`). +Usually, this is caused by the mod files not being downloaded. +Make sure you have run `/download_data` in the Archipelago tab before playing. +You should only have to run `/download_data` again to pick up bugfixes and updates. + +Make sure that you are running an up-to-date version of the client. +Check the [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) to +look up what the latest version is (RC releases are not necessary; that stands for "Release Candidate"). + +If these things are in order, check the log file for issues (stored at `[Archipelago Directory]/logs/Starcraft2Client.txt`). If you can't figure out the log file, visit our [Discord's](https://discord.com/invite/8Z65BR2) tech-support channel for help. Please include a specific description of what's going wrong and attach your log file to your message. @@ -150,16 +209,15 @@ Note: to launch the client, you will need to run the command `python3 Starcraft2 ## Running in Linux -To run StarCraft 2 through Archipelago in Linux, you will need to install the game using Wine, then run the Linux build +To run StarCraft 2 through Archipelago on Linux, you will need to install the game using Wine, then run the Linux build of the Archipelago client. -Make sure you have StarCraft 2 installed using Wine, and that you have followed the -[installation procedures](#how-do-i-install-this-randomizer?) to add the Archipelago maps to the correct location. -You will not need to copy the `.dll` files. -If you're having trouble installing or running StarCraft 2 on Linux, it is recommend to use the Lutris installer. +Make sure you have StarCraft 2 installed using Wine, and you know where Wine and Starcraft 2 are installed. +If you're having trouble installing or running StarCraft 2 on Linux, it is recommended to use the Lutris installer. -Copy the following into a .sh file, replacing the values of **WINE** and **SC2PATH** variables with the relevant -locations, as well as setting **PATH_TO_ARCHIPELAGO** to the directory containing the AppImage if it is not in the same +Copy the following into a .sh file, preferably within your Archipelago directory, +replacing the values of **WINE** and **SC2PATH** variables with the relevant locations, +as well as setting **PATH_TO_ARCHIPELAGO** to the directory containing the AppImage if it is not in the same folder as the script. ```sh @@ -170,6 +228,13 @@ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python # FIXME Replace with path to the version of Wine used to run SC2 export WINE="/usr/bin/wine" +# FIXME If using nondefault wineprefix for SC2 install (usual for Lutris installs), uncomment the next line and change the path +#export WINEPREFIX="/path/to/wineprefix" + +# FIXME Uncomment the following lines if experiencing issues with DXVK (like DDRAW.ddl does not exist) +#export WINEDLLOVERRIDES=d3d10core,d3d11,d3d12,d3d12core,d3d9,d3dcompiler_33,d3dcompiler_34,d3dcompiler_35,d3dcompiler_36,d3dcompiler_37,d3dcompiler_38,d3dcompiler_39,d3dcompiler_40,d3dcompiler_41,d3dcompiler_42,d3dcompiler_43,d3dcompiler_46,d3dcompiler_47,d3dx10,d3dx10_33,d3dx10_34,d3dx10_35,d3dx10_36,d3dx10_37,d3dx10_38,d3dx10_39,d3dx10_40,d3dx10_41,d3dx10_42,d3dx10_43,d3dx11_42,d3dx11_43,d3dx9_24,d3dx9_25,d3dx9_26,d3dx9_27,d3dx9_28,d3dx9_29,d3dx9_30,d3dx9_31,d3dx9_32,d3dx9_33,d3dx9_34,d3dx9_35,d3dx9_36,d3dx9_37,d3dx9_38,d3dx9_39,d3dx9_40,d3dx9_41,d3dx9_42,d3dx9_43,dxgi,nvapi,nvapi64 +#export DXVK_ENABLE_NVAPI=1 + # FIXME Replace with path to StarCraft II install folder export SC2PATH="/home/user/Games/starcraft-ii/drive_c/Program Files (x86)/StarCraft II/" @@ -193,3 +258,6 @@ below, replacing **${ID}** with the numerical ID. This will get all of the relevant environment variables Lutris sets to run StarCraft 2 in a script, including the path to the Wine binary that Lutris uses. You can then remove the line that runs the Battle.Net launcher and copy the code above into the existing script. + +Finally, you can run the script to start your Archipelago client, +and it should be able to launch Starcraft 2 when you start a mission. diff --git a/worlds/sc2/docs/setup_fr.md b/worlds/sc2/docs/setup_fr.md index 7cdb7225..5ce9b4b9 100644 --- a/worlds/sc2/docs/setup_fr.md +++ b/worlds/sc2/docs/setup_fr.md @@ -87,7 +87,7 @@ Pour les listes, chaque *item* doit être sur sa propre ligne et doit être pré ```yaml excluded_items: - Battlecruiser - - Drop-Pods (Kerrigan Tier 7) + - Drop-Pods (Kerrigan Ability) ``` Une liste vide est représentée par une paire de crochets: `[]`. diff --git a/worlds/sc2/gui_config.py b/worlds/sc2/gui_config.py new file mode 100644 index 00000000..b3039da1 --- /dev/null +++ b/worlds/sc2/gui_config.py @@ -0,0 +1,98 @@ +""" +Import this before importing client_gui.py to set window defaults from world settings. +""" +from .settings import Starcraft2Settings +from typing import List, Tuple, Any + + +def get_window_defaults() -> Tuple[List[str], int, int]: + """ + Gets the window size options from the sc2 settings. + Returns a list of warnings to be printed once the GUI is started, followed by the window width and height + """ + from . import SC2World + + # validate settings + warnings: List[str] = [] + if isinstance(SC2World.settings.window_height, int) and SC2World.settings.window_height > 0: + window_height = SC2World.settings.window_height + else: + warnings.append(f"Invalid value for options.yaml key sc2_options.window_height: '{SC2World.settings.window_height}'. Expected a positive integer.") + window_height = Starcraft2Settings.window_height + if isinstance(SC2World.settings.window_width, int) and SC2World.settings.window_width > 0: + window_width = SC2World.settings.window_width + else: + warnings.append(f"Invalid value for options.yaml key sc2_options.window_width: '{SC2World.settings.window_width}'. Expected a positive integer.") + window_width = Starcraft2Settings.window_width + + return warnings, window_width, window_height + + +def validate_color(color: Any, default: Tuple[float, float, float]) -> Tuple[Tuple[str, ...], Tuple[float, float, float]]: + if isinstance(color, int): + if color < 0: + return ('Integer color was negative; expected a value from 0 to 0xffffff',), default + return (), ( + ((color >> 8) & 0xff) / 255, + ((color >> 4) & 0xff) / 255, + ((color >> 0) & 0xff) / 255, + ) + elif color == 'default': + return (), default + elif color == 'white': + return (), (0.9, 0.9, 0.9) + elif color == 'black': + return (), (0.0, 0.0, 0.0) + elif color == 'grey': + return (), (0.345, 0.345, 0.345) + elif color == 'red': + return (), (0.85, 0.2, 0.1) + elif color == 'orange': + return (), (1.0, 0.65, 0.37) + elif color == 'green': + return (), (0.24, 0.84, 0.55) + elif color == 'blue': + return (), (0.3, 0.4, 1.0) + elif color == 'pink': + return (), (0.886, 0.176, 0.843) + elif not isinstance(color, list): + return (f'Invalid type {type(color)}; expected 3-element list or integer',), default + elif len(color) != 3: + return (f'Wrong number of elements in color; expected 3, got {len(color)}',), default + result: List[float] = [0.0, 0.0, 0.0] + errors: List[str] = [] + expected = 'expected a number from 0 to 1' + for index, element in enumerate(color): + if isinstance(element, int): + element = float(element) + if not isinstance(element, float): + errors.append(f'Invalid type {type(element)} at index {index}; {expected}') + continue + if element < 0: + errors.append(f'Negative element {element} at index {index}; {expected}') + continue + if element > 1: + errors.append(f'Element {element} at index {index} is greater than 1; {expected}') + result[index] = 1.0 + continue + result[index] = element + return tuple(errors), tuple(result) + + +def get_button_color(race: str) -> Tuple[Tuple[str, ...], Tuple[float, float, float]]: + from . import SC2World + baseline_color = 0.345 # the button graphic is grey, with this value in each color channel + if race == 'TERRAN': + user_color: list = SC2World.settings.terran_button_color + default_color = (0.0838, 0.2898, 0.2346) + elif race == 'PROTOSS': + user_color = SC2World.settings.protoss_button_color + default_color = (0.345, 0.22425, 0.12765) + elif race == 'ZERG': + user_color = SC2World.settings.zerg_button_color + default_color = (0.18975, 0.2415, 0.345) + else: + user_color = [baseline_color, baseline_color, baseline_color] + default_color = (baseline_color, baseline_color, baseline_color) + errors, color = validate_color(user_color, default_color) + return errors, tuple(x / baseline_color for x in color) diff --git a/worlds/sc2/item/__init__.py b/worlds/sc2/item/__init__.py new file mode 100644 index 00000000..7316a5f1 --- /dev/null +++ b/worlds/sc2/item/__init__.py @@ -0,0 +1,173 @@ +import enum +import typing +from dataclasses import dataclass +from typing import Optional, Union, Dict, Type + +from BaseClasses import Item, ItemClassification +from ..mission_tables import SC2Race + + +class ItemFilterFlags(enum.IntFlag): + """Removed > Start Inventory > Locked > Excluded > Requested > Culled""" + Available = 0 + StartInventory = enum.auto() + Locked = enum.auto() + """Used to flag items that are never allowed to be culled.""" + LogicLocked = enum.auto() + """Locked by item cull logic checks; logic-locked w/a upgrades may be removed if all parents are removed""" + Requested = enum.auto() + """Soft-locked items by item count checks during item culling; may be re-added""" + Removed = enum.auto() + """Marked for immediate removal""" + UserExcluded = enum.auto() + """Excluded by the user; display an error message if failing to exclude""" + FilterExcluded = enum.auto() + """Excluded by item filtering""" + Culled = enum.auto() + """Soft-removed by the item culling""" + NonLocal = enum.auto() + Plando = enum.auto() + AllowedOrphan = enum.auto() + """Used to flag items that shouldn't be filtered out with their parents""" + ForceProgression = enum.auto() + """Used to flag items that aren't classified as progression by default""" + + Unexcludable = StartInventory|Plando|Locked|LogicLocked + UnexcludableUpgrade = StartInventory|Plando|Locked + Uncullable = StartInventory|Plando|Locked|LogicLocked|Requested + Excluded = UserExcluded|FilterExcluded + RequestedOrBetter = StartInventory|Locked|LogicLocked|Requested + CulledOrBetter = Removed|Excluded|Culled + + +class StarcraftItem(Item): + game: str = "Starcraft 2" + filter_flags: ItemFilterFlags = ItemFilterFlags.Available + + def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int, filter_flags: ItemFilterFlags = ItemFilterFlags.Available): + super().__init__(name, classification, code, player) + self.filter_flags = filter_flags + +class ItemTypeEnum(enum.Enum): + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, name: str, flag_word: int): + self.display_name = name + self.flag_word = flag_word + + +class TerranItemType(ItemTypeEnum): + Armory_1 = "Armory", 0 + """General Terran unit upgrades""" + Armory_2 = "Armory", 1 + Armory_3 = "Armory", 2 + Armory_4 = "Armory", 3 + Armory_5 = "Armory", 4 + Armory_6 = "Armory", 5 + Armory_7 = "Armory", 6 + Progressive = "Progressive Upgrade", 7 + Laboratory = "Laboratory", 8 + Upgrade = "Upgrade", 9 + Unit = "Unit", 10 + Building = "Building", 11 + Mercenary = "Mercenary", 12 + Nova_Gear = "Nova Gear", 13 + Progressive_2 = "Progressive Upgrade", 14 + Unit_2 = "Unit", 15 + + +class ZergItemType(ItemTypeEnum): + Ability = "Ability", 0 + """Kerrigan abilities""" + Mutation_1 = "Mutation", 1 + Strain = "Strain", 2 + Morph = "Morph", 3 + Upgrade = "Upgrade", 4 + Mercenary = "Mercenary", 5 + Unit = "Unit", 6 + Level = "Level", 7 + """Kerrigan level packs""" + Primal_Form = "Primal Form", 8 + Evolution_Pit = "Evolution Pit", 9 + """Zerg global economy upgrades, like automated extractors""" + Mutation_2 = "Mutation", 10 + Mutation_3 = "Mutation", 11 + Mutation_4 = "Mutation", 12 + Progressive = "Progressive Upgrade", 13 + Mutation_5 = "Mutation", 14 + + +class ProtossItemType(ItemTypeEnum): + Unit = "Unit", 0 + Unit_2 = "Unit", 1 + Upgrade = "Upgrade", 2 + Building = "Building", 3 + Progressive = "Progressive Upgrade", 4 + Spear_Of_Adun = "Spear of Adun", 5 + Solarite_Core = "Solarite Core", 6 + """Protoss global effects, such as reconstruction beam or automated assimilators""" + Forge_1 = "Forge", 7 + """General Protoss unit upgrades""" + Forge_2 = "Forge", 8 + """General Protoss unit upgrades""" + Forge_3 = "Forge", 9 + """General Protoss unit upgrades""" + Forge_4 = "Forge", 10 + """General Protoss unit upgrades""" + Forge_5 = "Forge", 11 + """General Protoss unit upgrades""" + War_Council = "War Council", 12 + War_Council_2 = "War Council", 13 + ShieldRegeneration = "Shield Regeneration Group", 14 + + +class FactionlessItemType(ItemTypeEnum): + Minerals = "Minerals", 0 + Vespene = "Vespene", 1 + Supply = "Supply", 2 + MaxSupply = "Max Supply", 3 + BuildingSpeed = "Building Speed", 4 + Nothing = "Nothing Group", 5 + Deprecated = "Deprecated", 6 + MaxSupplyTrap = "Max Supply Trap", 7 + ResearchSpeed = "Research Speed", 8 + ResearchCost = "Research Cost", 9 + Keys = "Keys", -1 + + +ItemType = Union[TerranItemType, ZergItemType, ProtossItemType, FactionlessItemType] +race_to_item_type: Dict[SC2Race, Type[ItemTypeEnum]] = { + SC2Race.ANY: FactionlessItemType, + SC2Race.TERRAN: TerranItemType, + SC2Race.ZERG: ZergItemType, + SC2Race.PROTOSS: ProtossItemType, +} + + +class ItemData(typing.NamedTuple): + code: int + type: ItemType + number: int # Important for bot commands to send the item into the game + race: SC2Race + classification: ItemClassification = ItemClassification.useful + quantity: int = 1 + parent: typing.Optional[str] = None + important_for_filtering: bool = False + + def is_important_for_filtering(self): + return ( + self.important_for_filtering + or self.classification == ItemClassification.progression + or self.classification == ItemClassification.progression_skip_balancing + ) + +@dataclass +class FilterItem: + name: str + data: ItemData + index: int = 0 + flags: ItemFilterFlags = ItemFilterFlags.Available diff --git a/worlds/sc2/item/item_annotations.py b/worlds/sc2/item/item_annotations.py new file mode 100644 index 00000000..cd28e071 --- /dev/null +++ b/worlds/sc2/item/item_annotations.py @@ -0,0 +1,178 @@ +""" +Annotations to add to item names sent to the in-game message panel +""" +from . import item_names + +ITEM_NAME_ANNOTATIONS = { + item_names.MARINE: "(Barracks)", + item_names.MEDIC: "(Barracks)", + item_names.FIREBAT: "(Barracks)", + item_names.MARAUDER: "(Barracks)", + item_names.REAPER: "(Barracks)", + item_names.HELLION: "(Factory)", + item_names.VULTURE: "(Factory)", + item_names.GOLIATH: "(Factory)", + item_names.DIAMONDBACK: "(Factory)", + item_names.SIEGE_TANK: "(Factory)", + item_names.MEDIVAC: "(Starport)", + item_names.WRAITH: "(Starport)", + item_names.VIKING: "(Starport)", + item_names.BANSHEE: "(Starport)", + item_names.BATTLECRUISER: "(Starport)", + item_names.GHOST: "(Barracks)", + item_names.SPECTRE: "(Barracks)", + item_names.THOR: "(Factory)", + item_names.RAVEN: "(Starport)", + item_names.SCIENCE_VESSEL: "(Starport)", + item_names.PREDATOR: "(Factory)", + item_names.HERCULES: "(Starport)", + + item_names.HERC: "(Barracks)", + item_names.DOMINION_TROOPER: "(Barracks)", + item_names.WIDOW_MINE: "(Factory)", + item_names.CYCLONE: "(Factory)", + item_names.WARHOUND: "(Factory)", + item_names.LIBERATOR: "(Starport)", + item_names.VALKYRIE: "(Starport)", + + item_names.SON_OF_KORHAL: "(Elite Barracks)", + item_names.AEGIS_GUARD: "(Elite Barracks)", + item_names.FIELD_RESPONSE_THETA: "(Elite Barracks)", + item_names.EMPERORS_SHADOW: "(Elite Barracks)", + item_names.BULWARK_COMPANY: "(Elite Factory)", + item_names.SHOCK_DIVISION: "(Elite Factory)", + item_names.BLACKHAMMER: "(Elite Factory)", + item_names.SKY_FURY: "(Elite Starport)", + item_names.NIGHT_HAWK: "(Elite Starport)", + item_names.NIGHT_WOLF: "(Elite Starport)", + item_names.EMPERORS_GUARDIAN: "(Elite Starport)", + item_names.PRIDE_OF_AUGUSTRGRAD: "(Elite Starport)", + + item_names.WAR_PIGS: "(Terran Mercenary)", + item_names.DEVIL_DOGS: "(Terran Mercenary)", + item_names.HAMMER_SECURITIES: "(Terran Mercenary)", + item_names.SPARTAN_COMPANY: "(Terran Mercenary)", + item_names.SIEGE_BREAKERS: "(Terran Mercenary)", + item_names.HELS_ANGELS: "(Terran Mercenary)", + item_names.DUSK_WINGS: "(Terran Mercenary)", + item_names.JACKSONS_REVENGE: "(Terran Mercenary)", + item_names.SKIBIS_ANGELS: "(Terran Mercenary)", + item_names.DEATH_HEADS: "(Terran Mercenary)", + item_names.WINGED_NIGHTMARES: "(Terran Mercenary)", + item_names.MIDNIGHT_RIDERS: "(Terran Mercenary)", + item_names.BRYNHILDS: "(Terran Mercenary)", + item_names.JOTUN: "(Terran Mercenary)", + + item_names.BUNKER: "(Terran Building)", + item_names.MISSILE_TURRET: "(Terran Building)", + item_names.SENSOR_TOWER: "(Terran Building)", + item_names.PLANETARY_FORTRESS: "(Terran Building)", + item_names.PERDITION_TURRET: "(Terran Building)", + item_names.DEVASTATOR_TURRET: "(Terran Building)", + item_names.PSI_DISRUPTER: "(Terran Building)", + item_names.HIVE_MIND_EMULATOR: "(Terran Building)", + + item_names.ZERGLING: "(Larva)", + item_names.SWARM_QUEEN: "(Hatchery)", + item_names.ROACH: "(Larva)", + item_names.HYDRALISK: "(Larva)", + item_names.ABERRATION: "(Larva)", + item_names.MUTALISK: "(Larva)", + item_names.SWARM_HOST: "(Larva)", + item_names.INFESTOR: "(Larva)", + item_names.ULTRALISK: "(Larva)", + item_names.PYGALISK: "(Larva)", + item_names.CORRUPTOR: "(Larva)", + item_names.SCOURGE: "(Larva)", + item_names.BROOD_QUEEN: "(Larva)", + item_names.DEFILER: "(Larva)", + item_names.INFESTED_MARINE: "(Infested Barracks)", + item_names.INFESTED_SIEGE_TANK: "(Infested Factory)", + item_names.INFESTED_DIAMONDBACK: "(Infested Factory)", + item_names.BULLFROG: "(Infested Factory)", + item_names.INFESTED_BANSHEE: "(Infested Starport)", + item_names.INFESTED_LIBERATOR: "(Infested Starport)", + + item_names.ZERGLING_BANELING_ASPECT: "(Zergling Morph)", + item_names.HYDRALISK_IMPALER_ASPECT: "(Hydralisk Morph)", + item_names.HYDRALISK_LURKER_ASPECT: "(Hydralisk Morph)", + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.ROACH_RAVAGER_ASPECT: "(Roach Morph)", + item_names.OVERLORD_OVERSEER_ASPECT: "(Overlord Morph)", + item_names.ROACH_PRIMAL_IGNITER_ASPECT: "(Roach Morph)", + item_names.ULTRALISK_TYRANNOZOR_ASPECT: "(Ultralisk Morph)", + + item_names.INFESTED_MEDICS: "(Zerg Mercenary)", + item_names.INFESTED_SIEGE_BREAKERS: "(Zerg Mercenary)", + item_names.INFESTED_DUSK_WINGS: "(Zerg Mercenary)", + item_names.DEVOURING_ONES: "(Zerg Mercenary)", + item_names.HUNTER_KILLERS: "(Zerg Mercenary)", + item_names.TORRASQUE_MERC: "(Zerg Mercenary)", + item_names.HUNTERLING: "(Zerg Mercenary)", + item_names.YGGDRASIL: "(Zerg Mercenary)", + item_names.CAUSTIC_HORRORS: "(Zerg Mercenary)", + + item_names.SPORE_CRAWLER: "(Zerg Building)", + item_names.SPINE_CRAWLER: "(Zerg Building)", + item_names.BILE_LAUNCHER: "(Zerg Building)", + item_names.INFESTED_BUNKER: "(Zerg Building)", + item_names.INFESTED_MISSILE_TURRET: "(Zerg Building)", + item_names.NYDUS_WORM: "(Nydus Network)", + item_names.ECHIDNA_WORM: "(Nydus Network)", + + item_names.ZEALOT: "(Gateway, Aiur)", + item_names.CENTURION: "(Gateway, Nerazim)", + item_names.SENTINEL: "(Gateway, Purifier)", + item_names.SUPPLICANT: "(Gateway, Tal'darim)", + item_names.STALKER: "(Gateway, Nerazim)", + item_names.INSTIGATOR: "(Gateway, Purifier)", + item_names.SLAYER: "(Gateway, Tal'darim)", + item_names.SENTRY: "(Gateway, Aiur)", + item_names.ENERGIZER: "(Gateway, Purifier)", + item_names.HAVOC: "(Gateway, Tal'darim)", + item_names.HIGH_TEMPLAR: "(Gateway, Aiur)", + item_names.SIGNIFIER: "(Gateway, Nerazim)", + item_names.ASCENDANT: "(Gateway, Tal'darim)", + item_names.DARK_TEMPLAR: "(Gateway, Nerazim)", + item_names.AVENGER: "(Gateway, Aiur)", + item_names.BLOOD_HUNTER: "(Gateway, Tal'darim)", + item_names.DRAGOON: "(Gateway, Aiur)", + item_names.DARK_ARCHON: "(Gateway, Nerazim)", + item_names.ADEPT: "(Gateway, Purifier)", + item_names.OBSERVER: "(Robotics Facility)", + item_names.WARP_PRISM: "(Robotics Facility)", + item_names.IMMORTAL: "(Robotics Facility, Aiur)", + item_names.ANNIHILATOR: "(Robotics Facility, Nerazim)", + item_names.VANGUARD: "(Robotics Facility, Tal'darim)", + item_names.STALWART: "(Robotics Facility, Purifier)", + item_names.COLOSSUS: "(Robotics Facility, Purifier)", + item_names.WRATHWALKER: "(Robotics Facility, Tal'darim)", + item_names.REAVER: "(Robotics Facility, Aiur)", + item_names.DISRUPTOR: "(Robotics Facility, Purifier)", + item_names.PHOENIX: "(Stargate, Aiur)", + item_names.MIRAGE: "(Stargate, Purifier)", + item_names.SKIRMISHER: "(Stargate, Tal'darim)", + item_names.CORSAIR: "(Stargate, Nerazim)", + item_names.VOID_RAY: "(Stargate, Nerazim)", + item_names.DESTROYER: "(Stargate, Tal'darim)", + item_names.PULSAR: "(Stargate, Aiur)", + item_names.DAWNBRINGER: "(Stargate, Purifier)", + item_names.SCOUT: "(Stargate, Aiur)", + item_names.OPPRESSOR: "(Stargate, Tal'darim)", + item_names.CALADRIUS: "(Stargate, Purifier)", + item_names.MISTWING: "(Stargate, Nerazim)", + item_names.CARRIER: "(Stargate, Aiur)", + item_names.SKYLORD: "(Stargate, Tal'darim)", + item_names.TRIREME: "(Stargate, Purifier)", + item_names.TEMPEST: "(Stargate, Purifier)", + item_names.MOTHERSHIP: "(Stargate, Tal'darim)", + item_names.ARBITER: "(Stargate, Aiur)", + item_names.ORACLE: "(Stargate, Nerazim)", + + item_names.PHOTON_CANNON: "(Protoss Building)", + item_names.KHAYDARIN_MONOLITH: "(Protoss Building)", + item_names.SHIELD_BATTERY: "(Protoss Building)", +} \ No newline at end of file diff --git a/worlds/sc2/item/item_descriptions.py b/worlds/sc2/item/item_descriptions.py new file mode 100644 index 00000000..f1520df1 --- /dev/null +++ b/worlds/sc2/item/item_descriptions.py @@ -0,0 +1,1127 @@ +""" +Contains descriptions for Starcraft 2 items. +""" +import inspect + +from . import item_tables, item_names + +WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" + Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. +""") +GENERIC_UPGRADE_TEMPLATE = "Increases {} of {} {}.\n" + WEAPON_ARMOR_UPGRADE_NOTE +TERRAN = "Terran" +ZERG = "Zerg" +PROTOSS = "Protoss" + +LASER_TARGETING_SYSTEMS_DESCRIPTION = "Increases vision by 2 and weapon range by 1." +STIMPACK_SMALL_COST = 10 +STIMPACK_SMALL_HEAL = 30 +STIMPACK_LARGE_COST = 20 +STIMPACK_LARGE_HEAL = 60 +STIMPACK_TEMPLATE = inspect.cleandoc(""" + Level 1: Stimpack: Increases unit movement and attack speed for 15 seconds. Injures the unit for {} life. + Level 2: Super Stimpack: Instead of injuring the unit, heals the unit for {} life instead. +""") +STIMPACK_SMALL_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_SMALL_COST, STIMPACK_SMALL_HEAL) +STIMPACK_LARGE_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_LARGE_COST, STIMPACK_LARGE_HEAL) +SMART_SERVOS_DESCRIPTION = "Increases transformation speed between modes." +INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE = "{} can be trained from a {} without an attached Tech Lab." +CLOAK_DESCRIPTION_TEMPLATE = "Allows {} to use the Cloak ability." + +DISPLAY_NAME_BROOD_LORD = "Brood Lord" +DISPLAY_NAME_CLOAKED_ASSASSIN = "Dark Templar, Avenger, and Blood Hunter" +DISPLAY_NAME_WORMS = "Nydus Worm and Echidna Worm" + +GENERIC_KEY_DESC = "Unlocks a part of the mission order." + +resource_efficiency_cost_reduction = { + item_names.REAPER: (0, 50, 0), + item_names.MEDIC: (25, 25, 1), + item_names.FIREBAT: (50, 0, 1), + item_names.GOLIATH: (50, 0, 1), + item_names.SIEGE_TANK: (0, 25, 1), + item_names.DIAMONDBACK: (0, 50, 1), + item_names.PREDATOR: (0, 75, 1), + item_names.WARHOUND: (75, 0, 0), + item_names.HERC: (25, 25, 1), + item_names.WRAITH: (0, 50, 0), + item_names.GHOST: (25, 25, 0), + item_names.SPECTRE: (25, 25, 0), + item_names.RAVEN: (0, 50, 0), + item_names.CYCLONE: (25, 50, 1), + item_names.WIDOW_MINE: (0, 25, 1), + item_names.LIBERATOR: (0, 25, 0), + item_names.VALKYRIE: (100, 25, 1), + item_names.MEDIVAC: (0, 50, 0), + item_names.DEVASTATOR_TURRET: (50, 0, 0), + item_names.MISSILE_TURRET: (25, 0, 0), + item_names.SCOURGE: (0, 50, 0), + item_names.HYDRALISK: (25, 25, 1), + item_names.SWARM_HOST: (100, 25, 0), + item_names.ULTRALISK: (100, 0, 2), + item_names.ABERRATION: (50, 25, 0), + item_names.CORRUPTOR: (50, 25, 0), + DISPLAY_NAME_BROOD_LORD: (0, 75, 0), + item_names.SWARM_QUEEN: (0, 50, 0), + item_names.ARBITER: (50, 0, 0), + item_names.REAVER: (50, 25, 1), + DISPLAY_NAME_CLOAKED_ASSASSIN: (0, 50, 0), + item_names.SCOUT: (75, 25, 0), + item_names.DESTROYER: (50, 25, 1), + DISPLAY_NAME_WORMS: (50, 75, 0), + + # Frightful Fleshwelder + item_names.INFESTED_SIEGE_TANK: (0, 25, 0), + item_names.INFESTED_DIAMONDBACK: (50, 0, 0), + item_names.INFESTED_BANSHEE: (25, 0, 0), + item_names.INFESTED_LIBERATOR: (0, 25, 0), + + # War Council + item_names.CENTURION: (0, 40, 0), + item_names.SENTINEL: (60, 0, 1), +} + +op_re_cost_reduction = { + item_names.GHOST: (100, 50, 1), + item_names.SPECTRE: (100, 50, 1), + item_names.REAVER: (50, 75, 1), + item_names.SCOUT: (50, 0, 1), +} + + +def _get_resource_efficiency_desc(item_name: str, reduction_map: dict = resource_efficiency_cost_reduction) -> str: + cost = reduction_map[item_name] + parts = [f"{cost[0]} minerals"] if cost[0] else [] + parts += [f"{cost[1]} gas"] if cost[1] else [] + parts += [f"{cost[2]} supply"] if cost[2] else [] + assert parts, f"{item_name} doesn't reduce cost by anything" + if len(parts) == 1: + amount = parts[0] + elif len(parts) == 2: + amount = " and ".join(parts) + else: + amount = ", ".join(parts[:-1]) + ", and " + parts[-1] + return (f"Reduces {item_name} cost by {amount}.") + + + +def _get_start_and_max_energy_desc(unit_name_plural: str, starting_amount_increase: int = 150, maximum_amount_increase: int = 50) -> str: + return f"{unit_name_plural} gain +{starting_amount_increase} starting energy and +{maximum_amount_increase} maximum energy." + + +def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: str = '') -> str: + if ability_description: + suffix = f", \nwhich {ability_description}" + else: + suffix = "" + return f"{unit_name_plural} gain the {ability_name} ability{suffix}." + + +item_descriptions = { + item_names.MARINE: "General-purpose infantry.", + item_names.MEDIC: "Support trooper. Heals nearby biological units.", + item_names.FIREBAT: "Specialized anti-infantry attacker.", + item_names.MARAUDER: "Heavy assault infantry.", + item_names.REAPER: "Raider. Capable of jumping up and down cliffs. Throws explosive mines.", + item_names.HELLION: "Fast scout. Has a flame attack that damages all enemy units in its line of fire.", + item_names.VULTURE: "Fast skirmish unit. Can use the Spider Mine ability.", + item_names.GOLIATH: "Heavy-fire support unit.", + item_names.DIAMONDBACK: "Fast, high-damage hovertank. Rail Gun can fire while the Diamondback is moving.", + item_names.SIEGE_TANK: "Heavy tank. Long-range artillery in Siege Mode.", + item_names.MEDIVAC: "Air transport. Heals nearby biological units.", + item_names.WRAITH: "Highly mobile flying unit. Excellent at surgical strikes.", + item_names.VIKING: inspect.cleandoc(""" + Durable support flyer. Loaded with strong anti-capital air missiles. + Can switch into Assault Mode to attack ground units. + """), + item_names.BANSHEE: "Tactical-strike aircraft.", + item_names.BATTLECRUISER: "Powerful warship.", + item_names.GHOST: + "Infiltration unit. Can use Snipe and Cloak abilities. Can also call down Tactical Nukes.", + item_names.SPECTRE: inspect.cleandoc(""" + Infiltration unit. Can use Ultrasonic Pulse, Psionic Lash, and Cloak. + Can also call down Tactical Nukes. + """), + item_names.THOR: "Heavy assault mech.", + item_names.LIBERATOR: inspect.cleandoc(""" + Artillery fighter. Loaded with missiles that deal area damage to enemy air targets. + Can switch into Defender Mode to provide siege support. + """), + item_names.VALKYRIE: inspect.cleandoc(""" + Advanced anti-aircraft fighter. + Able to use cluster missiles that deal area damage to air targets. + """), + item_names.WIDOW_MINE: inspect.cleandoc(""" + Robotic mine. Launches missiles at nearby enemy units while burrowed. + Attacks deal splash damage in a small area around the target. + Widow Mine is revealed when Sentinel Missile is on cooldown. + """), + item_names.CYCLONE: "Mobile assault vehicle. Can use Lock On to quickly fire while moving.", + item_names.HERC: "Front-line infantry. Can use Grapple.", + item_names.WARHOUND: "Anti-vehicle mech. Haywire missiles do bonus damage to mechanical units.", + item_names.DOMINION_TROOPER: + "General-purpose infantry. Can be outfitted with weapons for different combat situations.", + item_names.PRIDE_OF_AUGUSTRGRAD: "Powerful Royal Guard warship.", + item_names.SKY_FURY: inspect.cleandoc(""" + Durable Royal Guard support flyer. Loaded with strong anti-capital air missiles. + Can switch into Assault Mode to attack ground units. + """), + item_names.SHOCK_DIVISION: "Royal Guard heavy tank. Long-range artillery in Siege Mode.", + item_names.BLACKHAMMER: "Royal Guard heavy assault mech.", + item_names.AEGIS_GUARD: "Royal Guard heavy assault infantry.", + item_names.EMPERORS_SHADOW: "Royal Guard specialist. Can use Pyrokinetic Immolation and EMP Blast abilities. Can call down Tactical missiles.", + item_names.SON_OF_KORHAL: "Royal Guard general-purpose infantry.", + item_names.BULWARK_COMPANY: "Royal Guard heavy-fire support unit.", + item_names.FIELD_RESPONSE_THETA: "Royal Guard support trooper. Heals nearby biological units.", + item_names.EMPERORS_GUARDIAN: inspect.cleandoc(""" + Royal Guard artillery fighter. Loaded with missiles that deal area damage to enemy air targets. + Can switch into Defender Mode to provide siege support. + """), + item_names.NIGHT_HAWK: "Royal Guard highly mobile flying unit. Excellent at surgical strikes.", + item_names.NIGHT_WOLF: "Royal Guard tactical-strike aircraft.", + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "units"), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "units"), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "units"), + item_names.BUNKER_PROJECTILE_ACCELERATOR: "Increases range of all units in the Bunker by 1.", + item_names.BUNKER_NEOSTEEL_BUNKER: "Increases the number of Bunker slots by 2.", + item_names.MISSILE_TURRET_TITANIUM_HOUSING: "Increases Missile Turret life by 75.", + item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: "The Missile Turret unleashes an additional flurry of missiles with each attack.", + item_names.SCV_ADVANCED_CONSTRUCTION: "Multiple SCVs can construct a structure, reducing its construction time.", + item_names.SCV_DUAL_FUSION_WELDERS: "SCVs repair twice as fast.", + item_names.SCV_CONSTRUCTION_JUMP_JETS: "Allows SCVs to jump up and down cliffs.", + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: inspect.cleandoc(""" + Level 1: While on low health, Terran structures are repaired to half health instead of burning down. + Level 2: Terran structures are repaired to full health instead of half health. + """), + item_names.PROGRESSIVE_ORBITAL_COMMAND: inspect.cleandoc(""" + Deprecated. Replaced by Scanner Sweep, MULE, and Orbital Module (Planetary Fortress) + Level 1: Allows Command Centers to use Scanner Sweep and Calldown: MULE abilities. + Level 2: Orbital Command abilities work even in Planetary Fortress mode. + """), + item_names.MARINE_PROGRESSIVE_STIMPACK: STIMPACK_SMALL_DESCRIPTION, + item_names.MARINE_COMBAT_SHIELD: "Increases Marine life by 10.", + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Medics", "Barracks"), + item_names.MEDIC_STABILIZER_MEDPACKS: "Increases Medic heal speed. Reduces the amount of energy required for each heal.", + item_names.FIREBAT_INCINERATOR_GAUNTLETS: "Increases Firebat's damage radius by 40%.", + item_names.FIREBAT_JUGGERNAUT_PLATING: "Increases Firebat's armor by 2.", + item_names.MARAUDER_CONCUSSIVE_SHELLS: "Marauder attack temporarily slows all units in target area.", + item_names.MARAUDER_KINETIC_FOAM: "Increases Marauder life by 25.", + item_names.REAPER_U238_ROUNDS: inspect.cleandoc(""" + Increases Reaper pistol attack range by 1. + Reaper pistols do additional 3 damage to Light Armor. + """), + item_names.REAPER_G4_CLUSTERBOMB: "Timed explosive that does heavy area damage.", + item_names.CYCLONE_MAG_FIELD_ACCELERATORS: "Increases Cyclone Lock-On damage.", + item_names.CYCLONE_MAG_FIELD_LAUNCHERS: "Increases Cyclone attack range by 2.", + item_names.MARINE_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.MARINE_MAGRAIL_MUNITIONS: "Deals 20 damage to target unit. Autocast on attack with a cooldown.", + item_names.MARINE_OPTIMIZED_LOGISTICS: "Increases Marine training speed.", + item_names.MEDIC_RESTORATION: _ability_desc("Medics", "Restoration", "removes negative status effects from a target allied unit"), + item_names.MEDIC_OPTICAL_FLARE: _ability_desc("Medics", "Optical Flare", "reduces vision range of target enemy unit. Disables detection"), + item_names.MEDIC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.MEDIC), + item_names.FIREBAT_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.FIREBAT_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.FIREBAT), + item_names.MARAUDER_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.MARAUDER_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.MARAUDER_MAGRAIL_MUNITIONS: "Deals 20 damage to target unit. Autocast on attack with a cooldown.", + item_names.MARAUDER_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Marauders", "Barracks"), + item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: "Increases SCV life by 15 and attack speed slightly.", + item_names.MEDIC_ADAPTIVE_MEDPACKS: "Allows Medics to heal mechanical and air units.", + item_names.MEDIC_NANO_PROJECTOR: "Increases Medic heal range by 2.", + item_names.FIREBAT_INFERNAL_PRE_IGNITER: "Firebats do an additional 4 damage to Light Armor.", + item_names.FIREBAT_KINETIC_FOAM: "Increases Firebat life by 100.", + item_names.FIREBAT_NANO_PROJECTORS: "Increases Firebat attack range by 2.", + item_names.MARAUDER_JUGGERNAUT_PLATING: "Increases Marauder's armor by 2.", + item_names.REAPER_JET_PACK_OVERDRIVE: inspect.cleandoc(""" + Allows the Reaper to fly for 10 seconds. + While flying, the Reaper can attack air units. + """), + item_names.HELLION_INFERNAL_PLATING: "Increases Hellion and Hellbat armor by 2.", + item_names.VULTURE_JERRYRIGGED_PATCHUP: "Vultures regenerate life.", + item_names.GOLIATH_SHAPED_HULL: "Increases Goliath life by 25.", + item_names.GOLIATH_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.GOLIATH), + item_names.GOLIATH_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Goliaths", "Factory"), + item_names.SIEGE_TANK_SHAPED_HULL: "Increases Siege Tank life by 25.", + item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SIEGE_TANK), + item_names.PREDATOR_CLOAK: "Allows Predators to briefly cloak. Predators ignore unit collision while cloaked.", + item_names.PREDATOR_CHARGE: "Allows Predators to intercept enemy ground units, and applies an AoE slow on arrival.", + item_names.MEDIVAC_SCATTER_VEIL: "Medivacs get 100 shields.", + item_names.REAPER_PROGRESSIVE_STIMPACK: STIMPACK_SMALL_DESCRIPTION, + item_names.REAPER_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.REAPER_ADVANCED_CLOAKING_FIELD: "Reapers are permanently cloaked.", + item_names.REAPER_SPIDER_MINES: "Allows Reapers to lay Spider Mines. 3 charges per Reaper.", + item_names.REAPER_COMBAT_DRUGS: "Reapers regenerate life while out of combat.", + item_names.HELLION_HELLBAT: "Allows Hellions to transform into Hellbats.", + item_names.HELLION_SMART_SERVOS: "Transforms faster between modes. Hellions can attack while moving.", + item_names.HELLION_OPTIMIZED_LOGISTICS: "Increases Hellion training speed.", + item_names.HELLION_JUMP_JETS: inspect.cleandoc(""" + Increases movement speed in Hellion mode. + In Hellbat mode, launches the Hellbat toward enemy ground units and briefly stuns them. + """), + item_names.HELLION_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.VULTURE_ION_THRUSTERS: "Increases Vulture movement speed.", + item_names.VULTURE_AUTO_LAUNCHERS: "Allows Vultures to attack while moving.", + item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: "Increases Spider mine damage.", + item_names.GOLIATH_JUMP_JETS: "Allows Goliaths to jump up and down cliffs.", + item_names.GOLIATH_OPTIMIZED_LOGISTICS: "Increases Goliath training speed.", + item_names.DIAMONDBACK_HYPERFLUXOR: "Increases Diamondback attack speed.", + item_names.DIAMONDBACK_BURST_CAPACITORS: inspect.cleandoc(""" + While not attacking, the Diamondback charges its weapon. + The next attack does 10 additional damage. + """), + item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DIAMONDBACK), + item_names.SIEGE_TANK_JUMP_JETS: inspect.cleandoc(""" + Repositions Siege Tank to a target location. + Can be used in either mode and to jump up and down cliffs. + """), + item_names.SIEGE_TANK_SPIDER_MINES: inspect.cleandoc(""" + Allows Siege Tanks to lay Spider Mines. + Lays 3 Spider Mines at once. 3 charges. + """), + item_names.SIEGE_TANK_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.SIEGE_TANK_GRADUATING_RANGE: inspect.cleandoc(""" + Increases the Siege Tank's attack range by 1 every 3 seconds while in Siege Mode, + up to a maximum of 5 additional range. + """), + item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: "Siege Tanks gain +3 armor in Siege Mode.", + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Siege Tanks", "Factory"), + item_names.PREDATOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.PREDATOR), + item_names.MEDIVAC_EXPANDED_HULL: "Increases Medivac cargo space by 4.", + item_names.MEDIVAC_AFTERBURNERS: "Ability. Temporarily increases the Medivac's movement speed by 70%.", + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: inspect.cleandoc(""" + Burst Lasers do more damage and can hit both ground and air targets. + Replaces Gemini Missiles weapon. + """), + item_names.VIKING_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.VIKING_ANTI_MECHANICAL_MUNITION: "Increases Viking damage to mechanical units while in Assault Mode.", + item_names.DIAMONDBACK_MAGLEV_PROPULSION: "Increases Diamondback movement speed.", + item_names.WARHOUND_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WARHOUND), + item_names.WARHOUND_AXIOM_PLATING: "Increases Warhound armor by 2.", + item_names.WARHOUND_DEPLOY_TURRET: "Each Warhound can deploy a single-use Auto-Turret.", + item_names.HERC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.HERC), + item_names.HERC_JUGGERNAUT_PLATING: "Increases HERC armor by 2.", + item_names.HERC_KINETIC_FOAM: "Increases HERC life by 50.", + item_names.REAPER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.REAPER), + item_names.REAPER_BALLISTIC_FLIGHTSUIT: "Increases Reaper life by 10.", + item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: inspect.cleandoc(""" + Level 1: Allows Siege Tanks to be transported in Siege Mode. + Level 2: Siege Tanks in Siege Mode can attack air units while transported by a Medivac. + """), + item_names.SIEGE_TANK_ALLTERRAIN_TREADS: "Increases movement speed of Siege Tanks in Tank Mode.", + item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: inspect.cleandoc(""" + Slightly increases Medivac movement speed. + Reduces Medivac's Afterburners ability cooldown. + """), + item_names.BATTLECRUISER_BEHEMOTH_REACTOR: "All Battlecruiser spells require 25 less energy to cast.", + item_names.THOR_RAPID_RELOAD: "Increases Thor's ground attack speed.", + item_names.LIBERATOR_GUERILLA_MISSILES: "Liberators in Fighter Mode apply an attack and movement debuff to enemies they attack.", + item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WIDOW_MINE), + item_names.HERC_GRAPPLE_PULL: "Allows HERCs to use their grappling gun to pull a ground unit towards the HERC.", + item_names.COMMAND_CENTER_SCANNER_SWEEP: "Temporarily reveals an area of the map, detecting cloaked and burrowed units.", + item_names.COMMAND_CENTER_MULE: "Summons a unit that gathers minerals more quickly than regular SCVs. Has timed life.", + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: "Drops additional supplies, permanently increasing the supply output of the target Supply Depot by 8.", + item_names.HELLION_TWIN_LINKED_FLAMETHROWER: "Doubles the width of the Hellion's flame attack.", + item_names.HELLION_THERMITE_FILAMENTS: "Hellions do an additional 10 damage to Light Armor.", + item_names.SPIDER_MINE_CERBERUS_MINE: "Increases trigger and blast radius of Spider Mines.", + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: inspect.cleandoc(""" + Level 1: Allows Vultures to replace used Spider Mines. Costs 15 minerals. + Level 2: Replacing used Spider Mines no longer costs minerals. + """), + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: "Goliaths can attack both ground and air targets simultaneously.", + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: "Increases Goliath ground attack range by 1 and air by 3.", + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: inspect.cleandoc(""" + Level 1: Tri-Lithium Power Cell: Increases Diamondback attack range by 1. + Level 2: Tungsten Spikes: Increases Diamondback attack range by 3. + """), + item_names.DIAMONDBACK_SHAPED_HULL: "Increases Diamondback life by 50.", + item_names.SIEGE_TANK_MAELSTROM_ROUNDS: "Siege Tanks do an additional 40 damage to the primary target in Siege Mode.", + item_names.SIEGE_TANK_SHAPED_BLAST: "Reduces splash damage to friendly targets while in Siege Mode by 75%.", + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: "Medivacs deploy loaded troops almost instantly.", + item_names.MEDIVAC_ADVANCED_HEALING_AI: "Medivacs can heal two targets at once.", + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: inspect.cleandoc(""" + Level 1: Tomahawk Power Cells: Increases Wraith starting energy by 100. + Level 2: Unregistered Cloaking Module: Wraiths do not require energy to cloak and remain cloaked. + """), + item_names.WRAITH_DISPLACEMENT_FIELD: "Wraiths evade 20% of incoming attacks while cloaked.", + item_names.VIKING_RIPWAVE_MISSILES: "Vikings do area damage while in Fighter Mode.", + item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: "Increases Viking attack range by 1 in Assault mode and 2 in Fighter mode.", + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: inspect.cleandoc(""" + Level 1: Banshees can remain cloaked twice as long. + Level 2: Banshees do not require energy to cloak and remain cloaked. + """), + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: "Banshees do area damage in a straight line.", + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: inspect.cleandoc(f""" + {_ability_desc('Battlecruisers', 'Missile Pods', 'deals damage to air units in a target area')} + Level 1: Deals 40 damage (+50 vs light). + Level 2: Deals 110 damage and costs -50 less energy. + """), + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: inspect.cleandoc(""" + Level 1: Spell. For 20 seconds the Battlecruiser gains a shield that can absorb up to 200 damage. + Level 2: Passive. Battlecruiser gets 200 shields. Can spend energy to fully recharge shields. + """), + item_names.GHOST_OCULAR_IMPLANTS: "Increases Ghost sight range by 3 and attack range by 2.", + item_names.GHOST_CRIUS_SUIT: "Cloak no longer requires energy to activate or maintain.", + item_names.SPECTRE_PSIONIC_LASH: "Spell. Deals 200 damage to a single target.", + item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: "Cloak no longer requires energy to activate or maintain.", + item_names.THOR_330MM_BARRAGE_CANNON: inspect.cleandoc(""" + Improves 250mm Strike Cannons ability to deal area damage and stun units in a small area. + Can be also freely aimed on ground. + """), + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: inspect.cleandoc(""" + Level 1: Allows destroyed Thors to be reconstructed on the field. Costs Vespene Gas. + Level 2: Thors are automatically reconstructed after falling for free. + """), + item_names.LIBERATOR_ADVANCED_BALLISTICS: "Increases Liberator range by 3 in Defender Mode.", + item_names.LIBERATOR_RAID_ARTILLERY: "Allows Liberators to attack structures while in Defender Mode.", + item_names.WIDOW_MINE_DRILLING_CLAWS: "Allows Widow Mines to burrow and unburrow faster.", + item_names.WIDOW_MINE_CONCEALMENT: "Burrowed Widow Mines are no longer revealed when the Sentinel Missile is on cooldown.", + item_names.WIDOW_MINE_DEMOLITION_PAYLOAD: "Allows Widow Mines to attack and damage structures.", + item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: "Medivacs are permanently cloaked.", + item_names.WRAITH_TRIGGER_OVERRIDE: "Wraith attack speed increases by 10% with each attack, up to a maximum of 100%.", + item_names.WRAITH_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Wraiths", "Starport"), + item_names.WRAITH_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WRAITH), + item_names.VIKING_SHREDDER_ROUNDS: "Attacks in Assault mode do line splash damage.", + item_names.VIKING_WILD_MISSILES: "Launches 5 rockets at the target unit. Each rocket does 25 (40 vs armored) damage.", + item_names.BANSHEE_SHAPED_HULL: "Increases Banshee life by 100.", + item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: "Increases Banshee attack range by 2 while cloaked.", + item_names.BANSHEE_DISTORTION_BLASTERS: "Increases Banshee attack damage by 25% while cloaked.", + item_names.BANSHEE_ROCKET_BARRAGE: _ability_desc("Banshees", "Rocket Barrage", "deals 75 damage to enemy ground units in the target area"), + item_names.GHOST_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.GHOST), + item_names.GHOST_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.GHOST, op_re_cost_reduction), + item_names.SPECTRE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SPECTRE), + item_names.SPECTRE_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.SPECTRE, op_re_cost_reduction), + item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: "Allows Thors to launch nukes.", + item_names.THOR_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: "Allows Thors to be built by SCVs like a structure.", + item_names.RAVEN_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.RAVEN), + item_names.RAVEN_DURABLE_MATERIALS: "Extends timed life duration of Raven's summoned objects.", + item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: "Nano-Repair no longer requires energy to use.", + item_names.SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS: "Science Vessel can use Nano-Repair at two targets at once.", + item_names.CYCLONE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.CYCLONE), + item_names.BANSHEE_HYPERFLIGHT_ROTORS: "Increases Banshee movement speed.", + item_names.BANSHEE_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.BANSHEE_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Banshees", "Starport"), + item_names.BATTLECRUISER_TACTICAL_JUMP: inspect.cleandoc(""" + Allows Battlecruisers to warp to a target location anywhere on the map. + """), + item_names.BATTLECRUISER_CLOAK: CLOAK_DESCRIPTION_TEMPLATE.format("Battlecruisers"), + item_names.BATTLECRUISER_ATX_LASER_BATTERY: inspect.cleandoc(""" + Battlecruisers can attack while moving, + do the same damage to both ground and air targets, and fire faster. + """), + item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: "Increases Battlecruiser training speed.", + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Battlecruisers", "Starport"), + item_names.GHOST_EMP_ROUNDS: inspect.cleandoc(""" + Spell. Does 100 damage to shields and drains all energy from units in the targeted area. + Cloaked units hit by EMP are revealed for a short time. + """), + item_names.GHOST_LOCKDOWN: "Spell. Stuns a target mechanical unit for a long time.", + item_names.SPECTRE_IMPALER_ROUNDS: "Spectres do additional damage to armored targets.", + item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: inspect.cleandoc(f""" + Level 1: Allows Thors to transform in order to use an alternative air attack. + Level 2: {SMART_SERVOS_DESCRIPTION} + """), + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: "Spell. Deploys a drone that can heal biological or mechanical units.", + item_names.RAVEN_SPIDER_MINES: "Spell. Deploys 3 Spider Mines to a target location.", + item_names.RAVEN_RAILGUN_TURRET: inspect.cleandoc(""" + Spell. Allows Ravens to deploy an advanced Auto-Turret, that can attack enemy ground units in a straight line. + """), + item_names.RAVEN_HUNTER_SEEKER_WEAPON: "Allows Ravens to attack with a Hunter-Seeker weapon.", + item_names.RAVEN_INTERFERENCE_MATRIX: inspect.cleandoc(""" + Spell. Target enemy Mechanical or Psionic unit can't attack or use abilities for a short duration. + """), + item_names.RAVEN_ANTI_ARMOR_MISSILE: "Spell. Decreases target and nearby enemy units armor by 2.", + item_names.RAVEN_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Ravens", "Starport"), + item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: "Spell. Depletes all energy and shields of all units in a target area.", + item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: inspect.cleandoc(""" + Spell. Provides a target unit with a defensive barrier that can absorb up to 250 damage. + """), + item_names.CYCLONE_TARGETING_OPTICS: "Increases Cyclone Lock On casting range and the range while Locked On.", + item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: "The first 12 shots of Lock On are fired more quickly.", + item_names.LIBERATOR_CLOAK: CLOAK_DESCRIPTION_TEMPLATE.format("Liberators"), + item_names.LIBERATOR_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.LIBERATOR_OPTIMIZED_LOGISTICS: "Increases Liberator training speed.", + item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: "Increases Widow Mine Sentinel Missile range.", + item_names.WIDOW_MINE_EXECUTIONER_MISSILES: inspect.cleandoc(""" + Reduces Sentinel Missile cooldown. + When killed, Widow Mines will launch several missiles at random enemy targets. + """), + item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: "Valkyries fire 2 additional rockets each volley.", + item_names.VALKYRIE_SHAPED_HULL: "Increases Valkyrie life by 50.", + item_names.VALKYRIE_FLECHETTE_MISSILES: "Equips Valkyries with Air-to-Surface missiles to attack ground units.", + item_names.VALKYRIE_AFTERBURNERS: "Ability. Temporarily increases the Valkyries's movement speed by 70%.", + item_names.CYCLONE_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Cyclones", "Factory"), + item_names.LIBERATOR_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.LIBERATOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.LIBERATOR), + item_names.HERCULES_INTERNAL_FUSION_MODULE: "Hercules can be trained from a Starport without having a Fusion Core.", + item_names.HERCULES_TACTICAL_JUMP: inspect.cleandoc(""" + Allows Hercules to warp to a target location anywhere on the map. + """), + item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: inspect.cleandoc(""" + Level 1: Lift Off - Planetary Fortress can lift off. + Level 2: Armament Stabilizers - Planetary Fortress can attack while lifted off. + """), + item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS: "Planetary Fortress can attack air units.", + item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: "Allows Valkyries to shoot air while moving.", + item_names.VALKYRIE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.VALKYRIE), + item_names.PREDATOR_VESPENE_SYNTHESIS: "Gives 1 free Vespene per target hit with Lightning Field.", + item_names.PREDATOR_ADAPTIVE_DEFENSES: "Predators gain a shield that halves incoming ranged and splash damage while active.", + item_names.BATTLECRUISER_BEHEMOTH_PLATING: "Increases Battlecruiser armor by 2.", + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE: "Increases Battlecruiser movement speed.", + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: inspect.cleandoc(""" + Allows Planetary Fortresses to use Scanner Sweep, MULE, and Extra Supplies if those abilities are owned. + """), + item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: "Devastator Turrets slow enemies they hit. Does not stack with Marauder Concussive Shells.", + item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: "Increases Devastator Turret damage to armored targets by 10.", + item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DEVASTATOR_TURRET), + item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: _get_resource_efficiency_desc(item_names.MISSILE_TURRET), + item_names.SENSOR_TOWER_ASSISTIVE_TARGETING: "Sensor Towers increase the attack range of defensive buildings in their direct sight range.", + item_names.SENSOR_TOWER_MUILTISPECTRUM_DOPPLER: "Sensor Towers gain +10 sight range and +5 radar range.", + item_names.SCIENCE_VESSEL_TACTICAL_JUMP: "Allows Science Vessels to warp to a target location anywhere on the map.", + item_names.LIBERATOR_UED_MISSILE_TECHNOLOGY: "Increases Liberator attack range in Fighter mode by 4.", + item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: "Battlecruisers increase the attack range of nearby friendly ground units by 1.", + item_names.VIKING_AESIR_TURBINES: "Increases Viking movement speed by 55%.", + item_names.MEDIVAC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.MEDIVAC), + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: "Tactical Missile Strikes no longer need to be channeled.", + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: "Allows the Troopers to arm with a more powerful weapon, effective against all unit types.", + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: "Allows the Troopers to arm with a more powerful weapon, especially effective against armored air units.", + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: "Allows the Troopers to arm with a more powerful weapon, especially effective against light ground units.", + item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: "Trooper weapons cost 20 fewer gas and now last for 5 minutes when dropped on death.", + item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: "Increases Dominion Trooper training speed.", + item_names.BUNKER: "Defensive structure. Able to load infantry units, giving them +1 range to their attacks.", + item_names.MISSILE_TURRET: "Anti-air defensive structure.", + item_names.SENSOR_TOWER: "Reveals locations of enemy units at long range.", + item_names.WAR_PIGS: "Mercenary Marines.", + item_names.DEVIL_DOGS: "Mercenary Firebats.", + item_names.HAMMER_SECURITIES: "Mercenary Marauders.", + item_names.SPARTAN_COMPANY: "Mercenary Goliaths.", + item_names.SIEGE_BREAKERS: "Mercenary Siege Tanks.", + item_names.HELS_ANGELS: "Mercenary Vikings.", + item_names.DUSK_WINGS: "Mercenary Banshees.", + item_names.JACKSONS_REVENGE: "Mercenary Battlecruiser.", + item_names.SKIBIS_ANGELS: "Mercenary Medics.", + item_names.DEATH_HEADS: "Mercenary Reapers.", + item_names.WINGED_NIGHTMARES: "Mercenary Wraiths.", + item_names.MIDNIGHT_RIDERS: "Mercenary Liberators.", + item_names.BRYNHILDS: "Mercenary Valkyries.", + item_names.JOTUN: "Mercenary Thor.", + item_names.ULTRA_CAPACITORS: "Increases attack speed of units by 5% per weapon upgrade.", + item_names.VANADIUM_PLATING: "Increases the life of units by 5% per armor upgrade.", + item_names.ORBITAL_DEPOTS: "Supply depots are built instantly.", + item_names.MICRO_FILTERING: "Refineries produce Vespene gas 25% faster.", + item_names.AUTOMATED_REFINERY: "Eliminates the need for SCVs in vespene gas production.", + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: "Command Centers can train two SCVs at once.", + item_names.RAVEN: "Aerial Caster unit.", + item_names.SCIENCE_VESSEL: "Aerial Caster unit. Can repair mechanical units.", + item_names.TECH_REACTOR: "Merges Tech Labs and Reactors into one add on structure to provide both functions.", + item_names.ORBITAL_STRIKE: "Trained units from Barracks are instantly deployed on rally point.", + item_names.BUNKER_SHRIKE_TURRET: "Adds an automated turret to Bunkers.", + item_names.BUNKER_FORTIFIED_BUNKER: "Bunkers have more life.", + item_names.PLANETARY_FORTRESS: inspect.cleandoc(""" + Allows Command Centers to upgrade into a defensive structure with a turret and additional armor. + Planetary Fortresses cannot Lift Off, or cast Orbital Command spells. + """), + item_names.PERDITION_TURRET: "Automated defensive turret. Burrows down while no enemies are nearby.", + item_names.PREDATOR: "Anti-infantry specialist that deals area damage with each attack.", + item_names.HERCULES: "Massive transport ship.", + item_names.CELLULAR_REACTOR: "All Terran spellcasters get +100 starting and maximum energy.", + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: inspect.cleandoc(""" + Allows Terran mechanical units to regenerate health while not in combat. + Each level increases life regeneration speed. + """), + item_names.HIVE_MIND_EMULATOR: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Zerg units.", + item_names.ARGUS_AMPLIFIER: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Protoss units.", + item_names.PSI_INDOCTRINATOR: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Terran units.", + item_names.PSI_DISRUPTER: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Zerg units.", + item_names.PSI_SCREEN: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Protoss units.", + item_names.SONIC_DISRUPTER: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Terran units.", + item_names.DEVASTATOR_TURRET: "Defensive structure. Deals increased damage to armored targets. Attacks ground units.", + item_names.STRUCTURE_ARMOR: "Increases armor of all Terran structures by 2.", + item_names.HI_SEC_AUTO_TRACKING: "Increases attack range of all Terran structures by 1.", + item_names.ADVANCED_OPTICS: "Increases attack range of all Terran mechanical units by 1.", + item_names.ROGUE_FORCES: "Terran Mercenary calldowns are no longer limited by charges.", + item_names.MECHANICAL_KNOW_HOW: "Increases mechanical unit life by 20%.", + item_names.MERCENARY_MUNITIONS: "Increases attack speed of all Terran combat units by 15%.", + item_names.PROGRESSIVE_FAST_DELIVERY: "At level 1, you can request one Mercenary unit immediately at the start of a mission. Level 2 allows you to calldown 3 Mercenary units immediately.", + item_names.RAPID_REINFORCEMENT: "Reduces cooldowns of all Terran Mercenary calldowns by 60s.", + item_names.SIGNAL_BEACON: "Terran Mercenary Calldowns are instantly deployed on rally point.", + item_names.FUSION_CORE_FUSION_REACTOR: "Fusion Cores increase the energy regeneration of nearby units by +1 energy per second.", + item_names.ZEALOT: "Powerful melee warrior. Can use the charge ability.", + item_names.STALKER: "Ranged attack strider. Can use the Blink ability.", + item_names.HIGH_TEMPLAR: "Potent psionic master. Can use the Feedback and Psionic Storm abilities. Can merge into an Archon.", + item_names.DARK_TEMPLAR: "Deadly warrior-assassin. Permanently cloaked. Can use the Shadow Fury ability.", + item_names.IMMORTAL: "Assault strider. Can use Barrier to absorb damage.", + item_names.COLOSSUS: "Battle strider with a powerful area attack. Can walk up and down cliffs. Attacks set fire to the ground, dealing extra damage to enemies over time.", + item_names.PHOENIX: "Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities.", + item_names.VOID_RAY: "Surgical strike craft. Has the Prismatic Alignment and Prismatic Range abilities.", + item_names.CARRIER: "Capital ship. Builds and launches Interceptors that attack enemy targets. Repair Drones heal nearby mechanical units.", + item_names.STARTING_MINERALS: "Increases the starting minerals for all missions.", + item_names.STARTING_VESPENE: "Increases the starting vespene for all missions.", + item_names.STARTING_SUPPLY: "Increases the starting supply for all missions.", + item_names.NOTHING: "Does nothing. Used to remove a location from the game.", + item_names.MAX_SUPPLY: "Increases the maximum supply cap for all missions.", + item_names.REDUCED_MAX_SUPPLY: "Trap Item. Decreases the maximum supply cap for all missions.", + item_names.SHIELD_REGENERATION: "Increases shield regeneration of all own units.", + item_names.BUILDING_CONSTRUCTION_SPEED: "Increases building construction speed.", + item_names.UPGRADE_RESEARCH_SPEED: "Increases weapon and armor research speed.", + item_names.UPGRADE_RESEARCH_COST: "Decreases weapon and armor upgrade research cost.", + item_names.NOVA_GHOST_VISOR: "Reveals the locations of enemy units in the fog of war around Nova. Can detect cloaked units.", + item_names.NOVA_RANGEFINDER_OCULUS: "Increases Nova's vision range and non-melee weapon attack range by 2. Also increases range of melee weapons by 1.", + item_names.NOVA_DOMINATION: "Gives Nova the ability to mind-control a target enemy unit.", + item_names.NOVA_BLINK: "Gives Nova the ability to teleport a short distance and cloak for 10s.", + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: inspect.cleandoc(""" + Level 1: Gives Nova the ability to cloak. + Level 2: Nova is permanently cloaked. + """), + item_names.NOVA_ENERGY_SUIT_MODULE: "Increases Nova's maximum energy and energy regeneration rate.", + item_names.NOVA_ARMORED_SUIT_MODULE: "Increases Nova's health by 100 and armor by 1. Nova also regenerates life quickly out of combat.", + item_names.NOVA_JUMP_SUIT_MODULE: "Increases Nova's movement speed and allows her to jump up and down cliffs.", + item_names.NOVA_C20A_CANISTER_RIFLE: "Allows Nova to equip the C20A Canister Rifle, which has a ranged attack and allows Nova to cast Snipe.", + item_names.NOVA_HELLFIRE_SHOTGUN: "Allows Nova to equip the Hellfire Shotgun, which has a short-range area attack in a cone and allows Nova to cast Penetrating Blast.", + item_names.NOVA_PLASMA_RIFLE: "Allows Nova to equip the Plasma Rifle, which has a rapidfire ranged attack and allows Nova to cast Plasma Shot.", + item_names.NOVA_MONOMOLECULAR_BLADE: "Allows Nova to equip the Monomolecular Blade, which has a melee attack and allows Nova to cast Dash Attack.", + item_names.NOVA_BLAZEFIRE_GUNBLADE: "Allows Nova to equip the Blazefire Gunblade, which has a melee attack and allows Nova to cast Fury of One.", + item_names.NOVA_STIM_INFUSION: "Gives Nova the ability to heal herself and temporarily increase her movement and attack speeds.", + item_names.NOVA_PULSE_GRENADES: "Gives Nova the ability to throw a grenade dealing large damage in an area.", + item_names.NOVA_FLASHBANG_GRENADES: "Gives Nova the ability to throw a grenade to stun enemies and disable detection in a large area.", + item_names.NOVA_IONIC_FORCE_FIELD: "Gives Nova the ability to shield herself temporarily.", + item_names.NOVA_HOLO_DECOY: "Gives Nova the ability to summon a decoy unit which enemies will prefer to target and takes reduced damage.", + item_names.NOVA_NUKE: "Gives Nova the ability to launch tactical nukes built from the Shadow Ops.", + item_names.ZERGLING: "Fast inexpensive melee attacker. Hatches in pairs from a single larva. Can morph into a Baneling.", + item_names.SWARM_QUEEN: "Ranged support caster. Can use the Spawn Creep Tumor and Rapid Transfusion abilities.", + item_names.ROACH: "Durable short ranged attacker. Regenerates life quickly when burrowed.", + item_names.HYDRALISK: "High-damage generalist ranged attacker.", + item_names.ZERGLING_BANELING_ASPECT: "Anti-ground suicide unit. Does damage over a small area on death. Morphed from the Zergling.", + item_names.ABERRATION: "Durable melee attacker that deals heavy damage and can walk over other units.", + item_names.MUTALISK: "Fragile flying attacker. Attacks bounce between targets.", + item_names.SWARM_HOST: "Siege unit that attacks by rooting in place and continually spawning Locusts.", + item_names.INFESTOR: "Support caster that can move while burrowed. Can use the Fungal Growth, Parasitic Domination, and Consumption abilities.", + item_names.ULTRALISK: "Massive melee attacker. Has an area-damage cleave attack.", + item_names.PYGALISK: "Miniature melee attacker.", + item_names.SPORE_CRAWLER: "Anti-air defensive structure. Detects cloaked units and can uproot.", + item_names.SPINE_CRAWLER: "Anti-ground defensive structure. Can uproot to reposition itself.", + item_names.BILE_LAUNCHER: "Long-range anti-ground bombardment structure.", + item_names.CORRUPTOR: "Anti-air flying attacker specializing in taking down enemy capital ships.", + item_names.SCOURGE: "Flying anti-air suicide unit. Hatches in pairs from a single larva.", + item_names.BROOD_QUEEN: "Flying support caster. Can cast the Ocular Symbiote and Spawn Broodlings abilities.", + item_names.DEFILER: "Support caster. Can use the Dark Swarm, Consume, and Plague abilities.", + item_names.INFESTED_MARINE: "General-purpose Infested infantry. Has a timed life of 90 seconds.", + item_names.INFESTED_BUNKER: "Defensive structure. Periodically spawns Infested infantry that fight from inside. Acts as a mobile ground transport while uprooted.", + item_names.INFESTED_MISSILE_TURRET: "Anti-air defensive structure. Detects cloaked units and can uproot.", + item_names.INFESTED_SIEGE_TANK: "Siege tank. Can uproot itself to provide mobile tank support.", + item_names.INFESTED_DIAMONDBACK: "Fast, high-damage attacker. Can attack while moving and can bring flying units to the ground.", + item_names.BULLFROG: "Grounded transport. Launches itself through the air, dealing damage and unloading cargo on impact.", + item_names.INFESTED_BANSHEE: "Tactical-strike aircraft. Can cloak and can be upgraded to burrow.", + item_names.INFESTED_LIBERATOR: "Anti-Air flying attacker. Attacks deal high area-damage.", + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "melee ground units"), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "ranged ground units"), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "ground units"), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "units"), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "units"), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "ground units"), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "units"), + item_names.ZERGLING_HARDENED_CARAPACE: "Increases Zergling health by +10.", + item_names.ZERGLING_ADRENAL_OVERLOAD: "Increases Zergling attack speed.", + item_names.ZERGLING_METABOLIC_BOOST: "Increases Zergling movement speed.", + item_names.ROACH_HYDRIODIC_BILE: "Roaches deal +8 damage to light targets.", + item_names.ROACH_ADAPTIVE_PLATING: "Roaches gain +3 armor when their life is below 50%.", + item_names.ROACH_TUNNELING_CLAWS: "Allows Roaches to move while burrowed.", + item_names.HYDRALISK_FRENZY: "Allows Hydralisks to use the Frenzy ability, which increases their attack speed by 50%.", + item_names.HYDRALISK_ANCILLARY_CARAPACE: "Hydralisks gain +20 health.", + item_names.HYDRALISK_GROOVED_SPINES: "Hydralisks gain +1 range.", + item_names.BANELING_CORROSIVE_ACID: "Increases the damage banelings deal to their primary target. Splash damage remains the same.", + item_names.BANELING_RUPTURE: "Increases the splash radius of baneling attacks.", + item_names.BANELING_REGENERATIVE_ACID: "Banelings will heal nearby friendly units when they explode.", + item_names.MUTALISK_VICIOUS_GLAIVE: "Mutalisks attacks will bounce an additional 3 times.", + item_names.MUTALISK_RAPID_REGENERATION: "Mutalisks will regenerate quickly when out of combat.", + item_names.MUTALISK_SUNDERING_GLAIVE: "Mutalisks deal increased damage to their primary target.", + item_names.SWARM_HOST_BURROW: "Allows Swarm Hosts to burrow instead of root to spawn locusts.", + item_names.SWARM_HOST_RAPID_INCUBATION: "Swarm Hosts will spawn locusts 20% faster.", + item_names.SWARM_HOST_PRESSURIZED_GLANDS: "Allows Swarm Host Locusts to attack air targets.", + item_names.ULTRALISK_BURROW_CHARGE: "Allows Ultralisks to burrow and charge at enemy units, knocking back and stunning units when it emerges.", + item_names.ULTRALISK_TISSUE_ASSIMILATION: "Ultralisks recover health when they deal damage.", + item_names.ULTRALISK_MONARCH_BLADES: "Ultralisks gain increased splash damage.", + item_names.PYGALISK_STIM: _ability_desc("Pygalisks", "Stimpack", f"temporarily increases movement and attack speed at the cost of {STIMPACK_SMALL_COST} health"), + item_names.PYGALISK_DUCAL_BLADES: "Pygalisks do splash damage.", + item_names.PYGALISK_COMBAT_CARAPACE: "Increases Pygalisk health by +25.", + item_names.CORRUPTOR_CAUSTIC_SPRAY: "Allows Corruptors to use the Caustic Spray ability, which deals ramping damage to buildings over time.", + item_names.CORRUPTOR_CORRUPTION: "Allows Corruptors to use the Corruption ability, which causes a target enemy unit to take increased damage.", + item_names.SCOURGE_VIRULENT_SPORES: "Scourge will deal splash damage.", + item_names.SCOURGE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOURGE), + item_names.SCOURGE_SWARM_SCOURGE: "An extra Scourge will be built from each egg at no additional cost.", + item_names.ZERGLING_SHREDDING_CLAWS: "Zergling attacks will temporarily reduce their target's armor to 0.", + item_names.ROACH_GLIAL_RECONSTITUTION: "Increases Roach movement speed.", + item_names.ROACH_ORGANIC_CARAPACE: "Increases Roach health by +25.", + item_names.HYDRALISK_MUSCULAR_AUGMENTS: "Increases Hydralisk movement speed.", + item_names.HYDRALISK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.HYDRALISK), + item_names.BANELING_CENTRIFUGAL_HOOKS: "Increases the movement speed of Banelings.", + item_names.BANELING_TUNNELING_JAWS: "Allows Banelings to move while burrowed.", + item_names.BANELING_RAPID_METAMORPH: "Banelings morph faster and no longer cost vespene gas to morph.", + item_names.MUTALISK_SEVERING_GLAIVE: "Mutalisk bounce attacks will deal full damage.", + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: "Increases the attack range of Mutalisks by 2.", + item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: "Increases Locust movement speed.", + item_names.SWARM_HOST_ENDURING_LOCUSTS: "Increases the duration of Swarm Hosts' Locusts by 10s.", + item_names.SWARM_HOST_ORGANIC_CARAPACE: "Increases Swarm Host health by +40.", + item_names.SWARM_HOST_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SWARM_HOST), + item_names.ULTRALISK_ANABOLIC_SYNTHESIS: "Ultralisks gain increased movement speed.", + item_names.ULTRALISK_CHITINOUS_PLATING: "Ultralisks gain +2 armor.", + item_names.ULTRALISK_ORGANIC_CARAPACE: "Ultralisks gain +100 life.", + item_names.ULTRALISK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ULTRALISK), + item_names.DEVOURER_CORROSIVE_SPRAY: "Devourer attacks will now deal area damage.", + item_names.DEVOURER_GAPING_MAW: "Devourer's attack speed increased by 25%.", + item_names.DEVOURER_IMPROVED_OSMOSIS: "Devourer's Acid Spores duration increased by 50%.", + item_names.DEVOURER_PRESCIENT_SPORES: "Allows Devourers to attack ground targets.", + item_names.GUARDIAN_PROLONGED_DISPERSION: "Guardians gain +3 range.", + item_names.GUARDIAN_PRIMAL_ADAPTATION: "Allows Guardians to attack air units with a decreased attack damage.", + item_names.GUARDIAN_SORONAN_ACID: "Guardians deal +10 increased base damage to ground targets.", + item_names.GUARDIAN_PROPELLANT_SACS: "Guardians gain increased movement speed.", + item_names.GUARDIAN_EXPLOSIVE_SPORES: "Allows Guardians to launch an explosive spore at ground targets, dealing damage and knocking them back in an area.", + item_names.GUARDIAN_PRIMORDIAL_FURY: "Guardians gain increasing attack speed as they attack.", + item_names.IMPALER_ADAPTIVE_TALONS: "Impalers burrow faster.", + item_names.IMPALER_SECRETION_GLANDS: "Impalers generate creep while standing still or burrowed.", + item_names.IMPALER_SUNKEN_SPINES: "Impalers deal increased damage.", + item_names.LURKER_SEISMIC_SPINES: "Lurkers gain +6 range.", + item_names.LURKER_ADAPTED_SPINES: "Lurkers deal increased damage to non-light targets.", + item_names.RAVAGER_POTENT_BILE: "Ravager Corrosive Bile deals an additional +40 damage.", + item_names.RAVAGER_BLOATED_BILE_DUCTS: "Ravager Corrosive Bile hits a much larger area.", + item_names.RAVAGER_DEEP_TUNNEL: _ability_desc("Ravagers", "Deep Tunnel", "allows them to burrow to any visible location on the map"), + item_names.VIPER_PARASITIC_BOMB: _ability_desc("Vipers", "Parasitic Bomb", "inflicts an area-damaging effect on an enemy air unit"), + item_names.VIPER_PARALYTIC_BARBS: "Viper Abduct stuns units for an additional 5 seconds.", + item_names.VIPER_VIRULENT_MICROBES: "All Viper abilities gain +4 range.", + item_names.BROOD_LORD_POROUS_CARTILAGE: "Brood Lords gain increased movement speed.", + item_names.BROOD_LORD_BEHEMOTH_STELLARSKIN: "Brood Lords gain +100 life and +1 armor.", + item_names.BROOD_LORD_SPLITTER_MITOSIS: "Brood Lord attacks spawn twice as many broodlings.", + item_names.BROOD_LORD_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_BROOD_LORD), + item_names.INFESTOR_INFESTED_TERRAN: _ability_desc("Infestors", "Spawn Infested Terran"), + item_names.INFESTOR_MICROBIAL_SHROUD: _ability_desc("Infestors", "Microbial Shroud", "reduces incoming damage from air units in an area"), + item_names.SPORE_CRAWLER_BIO_BONUS: "Spore Crawler gain +30 bonus damage against biological units.", + item_names.SWARM_QUEEN_SPAWN_LARVAE: _ability_desc("Swarm Queens", "Spawn Larvae"), + item_names.SWARM_QUEEN_DEEP_TUNNEL: _ability_desc("Swarm Queens", "Deep Tunnel"), + item_names.SWARM_QUEEN_ORGANIC_CARAPACE: "Swarm Queens gain +25 life.", + item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: "Swarm Queen Burst Heal heals an additional +10 life and can now target mechanical units.", + item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: "Swarm Queens may now be built two at a time from the Hatchery, Lair, or Hive.", + item_names.BROOD_QUEEN_FUNGAL_GROWTH: _ability_desc("Brood Queens", "Fungal Growth"), + item_names.BROOD_QUEEN_ENSNARE: _ability_desc("Brood Queens", "Ensnare"), + item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: "Brood Queens start with maximum energy and gain increased energy regeneration. Like powerhouses (of the cell).", + item_names.DEFILER_PATHOGEN_PROJECTORS: "Defilers gain +4 cast range for Dark Swarm and Plague.", + item_names.DEFILER_TRAPDOOR_ADAPTATION: "Defilers can now use abilities while burrowed.", + item_names.DEFILER_PREDATORY_CONSUMPTION: "Defilers can now use Consume on any non-heroic biological unit, not just friendly Zerg.", + item_names.DEFILER_COMORBIDITY: "Plague now stacks up to three times, and depletes energy as well as health.", + item_names.ABERRATION_MONSTROUS_RESILIENCE: "Aberrations gain +140 life.", + item_names.ABERRATION_CONSTRUCT_REGENERATION: "Aberrations gain increased life regeneration.", + item_names.ABERRATION_PROTECTIVE_COVER: "Aberrations grant damage reduction to allied units directly beneath them.", + item_names.ABERRATION_BANELING_INCUBATION: "Aberrations spawn 2 Banelings upon death.", + item_names.ABERRATION_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ABERRATION), + item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH: inspect.cleandoc(""" + Level 1: Allows Aberrations to periodically throw generated Banelings at air targets. + Level 2: Can store up to 3 Banelings. Can consume Banelings to recharge faster. Thrown Banelings benefit from Baneling upgrades. + """), + item_names.CORRUPTOR_MONSTROUS_RESILIENCE: "Corruptors gain +100 life.", + item_names.CORRUPTOR_CONSTRUCT_REGENERATION: "Corruptors gain increased life regeneration.", + item_names.CORRUPTOR_SCOURGE_INCUBATION: "Corruptors spawn 2 Scourge upon death (3 with Swarm Scourge).", + item_names.CORRUPTOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.CORRUPTOR), + item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: "Primal Igniters deal +15 damage vs light armor.", + item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: "Primal Igniters gain +100 health and +1 armor.", + item_names.INFESTED_SCV_BUILD_CHARGES: "Starting Infested SCV charges increased to 3. Maximum charges increased to 5.", + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: "Infested Marines deal an extra 50 damage over 15 seconds to targets they attack.", + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: "Infested Marines gain +1 range.", + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: "Infested Bunkers gain +3 armor.", + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: "Infested Bunkers gain increased life regeneration while rooted.", + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: "Infested Bunkers gain +2 cargo slots. Infested Trooper spawn cooldown is reduced by 20%.", + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: "Increases anti-mechanical damage of Infested Missile Turrets by +6 per missile.", + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: "Infested Missile Turrets gain a secondary weapon that applies Devourer Acid Spores in an area around the target.", + item_names.TYRANNOZOR_TYRANTS_PROTECTION: "Tyrannozors grant nearby friendly units 1 armor.", + item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: _ability_desc("Tyrannozors", "Barrage of Spikes", "deals 60 damage to enemy ground units around the Tyrannozor"), + item_names.TYRANNOZOR_IMPALING_STRIKE: "Tyrannozor melee attacks have a 20% chance to stun for 2 seconds.", + item_names.TYRANNOZOR_HEALING_ADAPTATION: "Tyrannozors regenerate life quickly when out of combat.", + item_names.BILE_LAUNCHER_ARTILLERY_DUCTS: "Increases Bile Launcher range by +8.", + item_names.BILE_LAUNCHER_RAPID_BOMBARMENT: "Bile Launchers attack 40% faster.", + item_names.NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES: f"Increases {DISPLAY_NAME_WORMS} maximum health by 250 and armor by 1.", + item_names.NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN: f"Removes emerge time for {DISPLAY_NAME_WORMS}, and allows them to be salvaged to return the resources spent on them.", + item_names.NYDUS_WORM_RAVENOUS_APPETITE: "Allows Nydus Worms to unload and load units nearly instantly.", + item_names.NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_WORMS), + item_names.ECHIDNA_WORM_OUROBOROS_STRAIN: "Allows Echidna Worms to train a limited assortment of combat units (Zerglings, Roaches, Hydralisks, and Aberrations) at a reduced time and cost.", + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: inspect.cleandoc(""" + Level 1: Infested Siege Tanks generate 1 Volatile Biomass every 30 seconds. + Level 2: Infested Siege Tanks generate 1 Volatile Biomass every 10 seconds. + """), + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: "Infested Siege Tanks deal an additional 15 damage to armored units and structures in both modes.", + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: _ability_desc("Infested Siege Tanks", "Deep Tunnel", "allows them to burrow to any visible location on the map covered in creep"), + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: "Infested Siege Tank Tentacle weapon gains +1 range. Volatile Burst weapon gains +3 range.", + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: "Allows Infested Siege Tanks to attack while moving with their Tentacle weapons.", + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: "Infested Diamondbacks leave behind a trail of acid when moving that deals 12 damage per second to enemy units.", + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: "Infested Diamondbacks deal an additional +8 damage.", + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: "Infested Diamondbacks gain +2 weapon range. Fungal Snare gains +2 range.", + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: inspect.cleandoc(""" + Level 1: Infested Diamondbacks gain the Fungal Snare ability, allowing them to temporarily ground flying units. + Level 2: Infested Diamondback Fungal Snare ability cooldown reduced by 15 seconds. + """), + item_names.BULLFROG_WILD_MUTATION: "Bullfrogs grant themselves and their cargo temporary health and an attack speed boost on impact.", + item_names.BULLFROG_RANGE: "Bullfrog leap gains +4 range, and unload-leap gains +6 range.", + item_names.BULLFROG_BROODLINGS: "Bullfrogs spawn two broodlings on impact, in addition to unloading their cargo.", + item_names.BULLFROG_HARD_IMPACT: "Bullfrogs deal more damage and stun longer on impact.", + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: "Infested Banshees gain +100 life.", + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: "Infested Banshees regenerate 20 life and energy per second while burrowed.", + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS: "Infested Banshees gain +2 range while cloaked.", + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: "Infested Liberators instantly transform into a cloud of microscopic organisms while attacking, reducing the damage they take by 85%.", + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: "Increases the damage Infested Liberators deal to their primary target by 100%.", + item_names.INFESTED_LIBERATOR_DEFENDER_MODE: "Allows Infested Liberators to deploy into Defender Mode to attack ground units. Weapon knocks back the attack target and damages units behind it.", + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_LIBERATOR), + item_names.ZERG_EXCAVATING_CLAWS: "Increases movement speed of uprooted Zerg structures, especially off creep. Also increases root speed.", + item_names.HIVE_CLUSTER_MATURATION: "Lairs are replaced with Hives, and Hatcheries can now upgrade directly to Hives at the Lair's original cost.", + item_names.MACROSCOPIC_RECUPERATION: "Zerg structures regenerate health rapidly while on creep and out of combat. Does not apply to uprooted structures, or structures with the Mechanical tag.", + item_names.BIOMECHANICAL_STOCKPILING: "Infested Factories and Starports can store 3 additional unit charges.", + item_names.BROODLING_SPORE_SATURATION: "Zerg buildings release twice as many broodlings on death. Zerg defensive structures release 4 broodlings on death.", + item_names.UNRESTRICTED_MUTATION: "Zerg Mercenary units are no longer limited by charges.", + item_names.CELL_DIVISION: "Adds additional units to Zerg Mercenary calldowns.", + item_names.EVOLUTIONARY_LEAP: "Halves the initial cooldown for all Zerg Mercenaries.", + item_names.SELF_SUFFICIENT: "Zerg Mercenaries no longer use supply.", + item_names.ZERGLING_RAPTOR_STRAIN: "Allows Zerglings to jump up and down cliffs and leap onto enemies. Also increases Zergling attack damage by 2.", + item_names.ZERGLING_SWARMLING_STRAIN: "Zerglings will spawn instantly and with an extra Zergling per egg at no additional cost.", + item_names.ROACH_VILE_STRAIN: "Roach attacks will slow the movement and attack speed of enemies.", + item_names.ROACH_CORPSER_STRAIN: "Units killed after being attacked by Roaches will spawn 2 Roachlings.", + item_names.HYDRALISK_IMPALER_ASPECT: "Allows Hydralisks to morph into Impalers.", + item_names.HYDRALISK_LURKER_ASPECT: "Allows Hydralisks to morph into Lurkers.", + item_names.BANELING_SPLITTER_STRAIN: "Banelings will split into two smaller Splitterlings on exploding.", + item_names.BANELING_HUNTER_STRAIN: "Allows Banelings to jump up and down cliffs and leap onto enemies.", + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: "Allows Mutalisks and Corruptors to morph into Brood Lords.", + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: "Allows Mutalisks and Corruptors to morph into Vipers.", + item_names.SWARM_HOST_CARRION_STRAIN: "Swarm Hosts will spawn Flying Locusts.", + item_names.SWARM_HOST_CREEPER_STRAIN: "Allows Swarm Hosts to teleport to any creep on the map in vision. Swarm Hosts will spread creep around them when rooted or burrowed.", + item_names.ULTRALISK_NOXIOUS_STRAIN: "Ultralisks will periodically spread poison, damaging nearby biological enemies.", + item_names.ULTRALISK_TORRASQUE_STRAIN: "Ultralisks will revive after being killed.", + item_names.KERRIGAN_KINETIC_BLAST: "Kerrigan deals 300 damage to target unit or structure from long range.", + item_names.KERRIGAN_HEROIC_FORTITUDE: "Kerrigan gains +200 maximum life and double life regeneration rate.", + item_names.KERRIGAN_LEAPING_STRIKE: "Kerrigan leaps to her target and deals 150 damage.", + item_names.KERRIGAN_CRUSHING_GRIP: "Kerrigan stuns enemies in a target area for 3 seconds and deals 30 damage over time. Heroic units are not stunned.", + item_names.KERRIGAN_CHAIN_REACTION: "Kerrigan's attacks deal normal damage to her target then jump to additional nearby enemies.", + item_names.KERRIGAN_PSIONIC_SHIFT: "Kerrigan dashes through enemies, dealing 50 damage to all enemies in her path.", + item_names.ZERGLING_RECONSTITUTION: "Killed Zerglings respawn from your primary Hatchery at no cost.", + item_names.OVERLORD_IMPROVED_OVERLORDS: "Overlords morph instantly and provide 50% more supply.", + item_names.AUTOMATED_EXTRACTORS: "Extractors automatically harvest Vespene Gas without the need for Drones.", + item_names.KERRIGAN_WILD_MUTATION: "Kerrigan gives all units in an area +200 max life and double attack speed for 10 seconds.", + item_names.KERRIGAN_SPAWN_BANELINGS: "Kerrigan spawns six Banelings with timed life.", + item_names.KERRIGAN_MEND: "Kerrigan heals for 150 life and heals nearby friendly units for 50 life. An additional +50% life is healed over 15 seconds.", + item_names.TWIN_DRONES: "Drones morph in groups of two at no additional cost and require less supply.", + item_names.MALIGNANT_CREEP: "Your units and structures gain increased life regeneration and 30% increased attack speed while on creep. Creep Tumors also spread creep faster and farther.", + item_names.VESPENE_EFFICIENCY: "Extractors produce Vespene gas 25% faster.", + item_names.ZERG_CREEP_STOMACH: "Zerg buildings no longer take damage off-creep. Defensive structures can now root off-creep.", + item_names.KERRIGAN_INFEST_BROODLINGS: "Enemies damaged by Kerrigan become infested and will spawn Broodlings with timed life if killed quickly.", + item_names.KERRIGAN_FURY: "Each of Kerrigan's attacks temporarily increase her attack speed by 15%. Can stack up to 75%.", + item_names.KERRIGAN_ABILITY_EFFICIENCY: "Kerrigan's abilities have their cooldown and energy cost reduced by 20%.", + item_names.KERRIGAN_APOCALYPSE: "Kerrigan deals 300 damage (+400 vs Structure) to enemies in a large area.", + item_names.KERRIGAN_SPAWN_LEVIATHAN: "Kerrigan summons a mighty flying Leviathan with timed life. Deals massive damage and has energy-based abilities.", + item_names.KERRIGAN_DROP_PODS: "Kerrigan drops Primal Zerg forces with timed life to the battlefield.", + item_names.KERRIGAN_PRIMAL_FORM: "Kerrigan takes on her Primal Zerg form and gains greatly increased energy regeneration.", + item_names.KERRIGAN_ASSIMILATION_AURA: "Causes all nearby enemies to drop resources when killed.", + item_names.KERRIGAN_IMMOBILIZATION_WAVE: "Deals 100 damage to enemies around a large area and stuns them for 10 seconds.", + item_names.KERRIGAN_LEVELS_10: "Gives Kerrigan +10 Levels.", + item_names.KERRIGAN_LEVELS_9: "Gives Kerrigan +9 Levels.", + item_names.KERRIGAN_LEVELS_8: "Gives Kerrigan +8 Levels.", + item_names.KERRIGAN_LEVELS_7: "Gives Kerrigan +7 Levels.", + item_names.KERRIGAN_LEVELS_6: "Gives Kerrigan +6 Levels.", + item_names.KERRIGAN_LEVELS_5: "Gives Kerrigan +5 Levels.", + item_names.KERRIGAN_LEVELS_4: "Gives Kerrigan +4 Levels.", + item_names.KERRIGAN_LEVELS_3: "Gives Kerrigan +3 Levels.", + item_names.KERRIGAN_LEVELS_2: "Gives Kerrigan +2 Levels.", + item_names.KERRIGAN_LEVELS_1: "Gives Kerrigan +1 Level.", + item_names.KERRIGAN_LEVELS_14: "Gives Kerrigan +14 Levels.", + item_names.KERRIGAN_LEVELS_35: "Gives Kerrigan +35 Levels.", + item_names.KERRIGAN_LEVELS_70: "Gives Kerrigan +70 Levels.", + item_names.INFESTED_MEDICS: "Mercenary infested Medics that may be called in from the Predator Nest.", + item_names.INFESTED_SIEGE_BREAKERS: "Mercenary infested Siege Breakers that may be called in from the Predator Nest.", + item_names.INFESTED_DUSK_WINGS: "Mercenary infested Dusk Wings that may be called in from the Predator Nest.", + item_names.HUNTER_KILLERS: "Elite Hydralisk strain. Summoned at the Predator Nest.", + item_names.DEVOURING_ONES: "Elite Zergling strain. Summoned at the Predator Nest.", + item_names.TORRASQUE_MERC: "Elite Ultralisk strain. Summoned at the Predator Nest.", + item_names.HUNTERLING: "Elite strain. Can jump up and down cliffs and stun enemies by jumping on them. Summoned at the Predator Nest.", + item_names.YGGDRASIL: "Elite Overlord strain that has the ability to transport buildings and ground units. Summoned at the Predator Nest.", + item_names.CAUSTIC_HORRORS: "Elite Roach Strain that has the ability to attack air units. Summoned at the Predator Nest.", + item_names.OVERLORD_VENTRAL_SACS: "Overlords gain the ability to transport ground units.", + item_names.OVERLORD_GENERATE_CREEP: "Overlords gain the ability to generate creep while standing still.", + item_names.OVERLORD_ANTENNAE: "Increases Overlord sight range.", + item_names.OVERLORD_PNEUMATIZED_CARAPACE: "Increases Overlord movement speed.", + item_names.OVERLORD_OVERSEER_ASPECT: "Allows Overlords to morph into Overseers. Overseers can use the Spawn Creep Tumor and Contaminate abilities.", + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: "Long-range anti-ground flyer. Can attack ground units. Morphed from the Mutalisk or Corruptor.", + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: "Anti-air flyer. Attack inflict Acid Spores. Can attack air units. Morphed from the Mutalisk or Corruptor.", + item_names.ROACH_RAVAGER_ASPECT: "Ranged artillery. Can use Corrosive Bile. Can attack ground units. Morphed from the Roach.", + item_names.ROACH_PRIMAL_IGNITER_ASPECT: "Assault unit. Has an area-damage attack. Regenerates life quickly when burrowed. Can attack ground units. Morphed by merging two Roaches.", + item_names.NYDUS_WORM: "Long-range transport network. Nydus Worms and Nydus Networks can load friendly ground units to be unloaded to any other Nydus structure on the map.", + item_names.ECHIDNA_WORM: "Long-range deployable base. Unable to load and unload units, but can generate Creep and Creep Tumors. Can also serve as a dropoff point for resources and can create Drones.", + item_names.ULTRALISK_TYRANNOZOR_ASPECT: "Heavy assault beast. Has a ground-area attack, and powerful anti-air attack. Morphed by merging two Ultralisks.", + item_names.OBSERVER: "Flying spy. Cloak renders the unit invisible to enemies without detection.", + item_names.CENTURION: "Powerful melee warrior. Has the Shadow Charge and Darkcoil abilities.", + item_names.SENTINEL: "Powerful melee warrior. Has the Charge and Reconstruction abilities.", + item_names.SUPPLICANT: "Powerful melee warrior. Has powerful damage-resistant shields.", + item_names.INSTIGATOR: "Ranged support strider. Can store multiple Blink charges.", + item_names.SLAYER: "Ranged attack strider. Can use the Phase Blink and Phasing Armor abilities.", + item_names.SENTRY: "Robotic support unit. Can use the Guardian Shield ability and can restore the shields of nearby Protoss units.", + item_names.ENERGIZER: "Robotic support unit. Can use the Chrono Beam ability and can become stationary to power nearby structures.", + item_names.HAVOC: "Robotic support unit. Can use the Target Lock and Force Field abilities and increases the range of nearby Protoss units.", + item_names.SIGNIFIER: "Potent permanently cloaked psionic master. Can use the Feedback and Crippling Psionic Storm abilities. Can merge into an Archon.", + item_names.ASCENDANT: "Potent psionic master. Can use the Psionic Orb, Mind Blast, and Sacrifice abilities.", + item_names.AVENGER: "Deadly warrior-assassin. Permanently cloaked. Recalls to the nearest Dark Shrine upon death.", + item_names.BLOOD_HUNTER: "Deadly warrior-assassin. Permanently cloaked. Can use the Void Stasis ability.", + item_names.DRAGOON: "Ranged assault strider. Has enhanced health and damage.", + item_names.DARK_ARCHON: "Potent psionic master. Can use the Confuse and Mind Control abilities.", + item_names.ADEPT: "Ranged specialist. Can use the Psionic Transfer ability.", + item_names.WARP_PRISM: "Flying transport. Can carry units and become stationary to deploy a power field.", + item_names.ANNIHILATOR: "Assault Strider. Can use the Shadow Cannon ability to damage air and ground units.", + item_names.STALWART: "Assault strider. Has shields that deflect high-damage attacks.", + item_names.VANGUARD: "Assault Strider. Deals splash damage around the primary target.", + item_names.WRATHWALKER: "Battle strider with a powerful single-target attack. Can walk up and down cliffs.", + item_names.REAVER: "Area damage siege unit. Builds and launches explosive Scarabs for high burst damage.", + item_names.DISRUPTOR: "Robotic disruption unit. Can use the Purification Nova ability to deal heavy area damage.", + item_names.MIRAGE: "Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities.", + item_names.SKIRMISHER: "Fast skirmish starfighter. Can target ground units.", + item_names.CORSAIR: "Air superiority starfighter. Can use the Disruption Web ability.", + item_names.DESTROYER: "Area assault craft. Can use the Destruction Beam ability to attack multiple units at once.", + item_names.PULSAR: "Support craft. Applies a stacking slow to targets.", + item_names.DAWNBRINGER: "Flying Anti-Surface Assault Ship. Attacks in an area around the target. Attack count increases as it continues firing.", + item_names.SCOUT: "Versatile high-speed fighter. Has a powerful anti-armored air attack and a weaker anti-ground attack.", + item_names.OPPRESSOR: "Tal'Darim Scout variant. Has a weaker air attack, but a stronger ground attack. Can use the Vulcan Blaster ability.", + item_names.CALADRIUS: "Purifier Scout variant. Has no ground attack, but a stronger air attack, which can be upgraded to hit multiple targets. Can use the Corona Beam ability.", + item_names.MISTWING: "Nerazim Scout variant. Specialized stealth fighter. Can use the Cloak, Phantom Dash and Pilot (Transport) abilities.", + item_names.TEMPEST: "Siege artillery craft. Attacks from long range. Can use the Disintegration ability.", + item_names.MOTHERSHIP: "Ultimate Protoss vessel. Can use the Vortex and Mass Recall abilities.", + item_names.ARBITER: "Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units.", + item_names.ORACLE: "Flying caster. Can use the Revelation and Stasis Ward abilities.", + item_names.SKYLORD: "Capital ship. Fires a powerful laser that deals damage in a line. Can use Tactical Jump ability.", + item_names.TRIREME: "Capital ship. Builds and launches Bombers that attack enemy targets.", + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: GENERIC_UPGRADE_TEMPLATE.format("shields", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "units"), + item_names.PHOTON_CANNON: "Protoss defensive structure. Can attack ground and air units.", + item_names.KHAYDARIN_MONOLITH: "Advanced Protoss defensive structure. Has superior range and damage, but is very expensive and attacks slowly.", + item_names.SHIELD_BATTERY: "Protoss defensive structure. Restores shields to nearby friendly units and structures.", + item_names.SUPPLICANT_BLOOD_SHIELD: "Increases the armor value of Supplicant shields.", + item_names.SUPPLICANT_SOUL_AUGMENTATION: "Increases Supplicant max shields by +25.", + item_names.SUPPLICANT_ENDLESS_SERVITUDE: "Increases Supplicant shield regeneration rate.", + item_names.SUPPLICANT_ZENITH_PITCH: "Allows Supplicants to attack air units.", + item_names.ADEPT_SHOCKWAVE: "When Adepts deal a finishing blow, their projectiles can jump onto 2 additional targets.", + item_names.ADEPT_RESONATING_GLAIVES: "Increases Adept attack speed.", + item_names.ADEPT_PHASE_BULWARK: "Increases Adept shield maximum by +50.", + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: "Increases weapon damage of Stalkers, Instigators, and Slayers.", + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: "Attacks fired by Stalkers, Instigators, and Slayers have a chance to bounce to additional targets for reduced damage.", + item_names.INSTIGATOR_BLINK_OVERDRIVE: "Instigators gain +2 maximum blink charges and +1 blink range.", + item_names.INSTIGATOR_RECONSTRUCTION: "Instigators gain the Reconstruction ability, allowing them to be reconstructed on death with a 240 seconds cooldown. Using Blink reduces the cooldown.", + item_names.DRAGOON_CONCENTRATED_ANTIMATTER: "Dragoons deal increased damage.", + item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: "Dragoons gain +20 life and their shield regeneration rate is doubled. Allows Dragoons to regenerate shields in combat.", + item_names.DRAGOON_SINGULARITY_CHARGE: "Increases Dragoon range by +2.", + item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: "Increases Dragoon movement speed.", + item_names.SCOUT_COMBAT_SENSOR_ARRAY: "All Scout variants gain increased range against air and ground.", + item_names.SCOUT_APIAL_SENSORS: "Scouts gain increased sight range.", + item_names.SCOUT_GRAVITIC_THRUSTERS: "All Scout variants gain increased movement speed.", + item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: "Scouts, Oppressors and Mist Wings gain increased damage against ground targets.", + item_names.SCOUT_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOUT), + item_names.SCOUT_SUPPLY_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOUT, op_re_cost_reduction), + item_names.OPPRESSOR_ACCELERATED_WARP: "Oppressors gain increased training and warp-in speed.", + item_names.OPPRESSOR_ARMOR_MELTING_BLASTERS: "Oppressor ground weapons gain bonus damage to armored targets. Allows Vulcan Blaster to hit structures.", + item_names.CALADRIUS_SIDE_MISSILES: "Caladrius can hit up to 4 additional air targets with their missiles.", + item_names.CALADRIUS_STRUCTURE_TARGETING: "Allows Caladrius to hit ground structures with their anti-air missiles.", + item_names.CALADRIUS_SOLARITE_REACTOR: "If the Caladrius is low on shields, it recovers shields quickly for a short time.", + item_names.MISTWING_NULL_SHROUD: "Cloak no longer drains energy (but still prevents base energy regeneration). The Mist Wing becomes undetectable for 5 seconds upon cloaking.", + item_names.MISTWING_PILOT: _ability_desc("Mistwings", "Pilot", "can transport one unit as an additional co-pilot. A pilot grants a small bonus to damage and armor"), + item_names.TEMPEST_TECTONIC_DESTABILIZERS: "Tempests deal increased damage to buildings.", + item_names.TEMPEST_QUANTIC_REACTOR: "Tempests deal increased damage to massive units.", + item_names.TEMPEST_GRAVITY_SLING: "Tempests gain +8 range against air targets and +8 cast range.", + item_names.TEMPEST_INTERPLANETARY_RANGE: "Tempests gain +8 weapon range against all targets.", + item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: "Increases Phoenix, Mirage, and Skirmisher weapon damage by +2.", + item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: "Increases Phoenix, Mirage, and Skirmiser range by +2.", + item_names.CORSAIR_STEALTH_DRIVE: "Corsairs become permanently cloaked.", + item_names.CORSAIR_ARGUS_JEWEL: "Corsairs can store 2 charges of disruption web.", + item_names.CORSAIR_SUSTAINING_DISRUPTION: "Corsair disruption webs last longer.", + item_names.CORSAIR_NEUTRON_SHIELDS: "Increases corsair maximum shields by +20.", + item_names.ORACLE_STEALTH_DRIVE: "Oracles become permanently cloaked.", + item_names.ORACLE_SKYWARD_CHRONOANOMALY: "The Oracle's Stasis Ward can affect air units.", + item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: "Oracles no longer need to to spend energy to attack.", + item_names.ORACLE_BOSONIC_CORE: "Increases starting energy by 150 and maximum energy by 50.", + item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: "Arbiters gain +50 maximum life and +1 armor.", + item_names.ARBITER_KHAYDARIN_CORE: _get_start_and_max_energy_desc("Arbiters"), + item_names.ARBITER_SPACETIME_ANCHOR: "Allows Arbiters to use an alternate version of Stasis Field which lasts 50 seconds longer.", + item_names.ARBITER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ARBITER), + item_names.ARBITER_JUDICATORS_VEIL: "Increases Arbiter Cloaking Field range.", + item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: "Carriers and Triremes can launch Interceptors and Bombers more quickly.", + item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: "Carrier-class ships gain +2 armor.", + item_names.VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES: "Increases movement speed of Void Ray variants.", + item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: "Dawnbringers take reduced damage from non-spell ground sources.", + item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: "Increases Dawnbringer maximum shields by +50.", + item_names.PULSAR_CHRONOCLYSM: "Pulsar slow effect is also applied in an area around the primary target.", + item_names.PULSAR_ENTROPIC_REVERSAL: "Pulsars now regenerate life when out of combat.", + item_names.DESTROYER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DESTROYER), + item_names.WARP_PRISM_GRAVITIC_DRIVE: "Increases the movement speed of Warp Prisms.", + item_names.WARP_PRISM_PHASE_BLASTER: "Equips Warp Prisms with an auto-attack that can hit ground and air targets.", + item_names.WARP_PRISM_WAR_CONFIGURATION: "Warp Prisms transform faster and gain increased power radius in Phasing Mode.", + item_names.OBSERVER_GRAVITIC_BOOSTERS: "Increases Observer movement speed.", + item_names.OBSERVER_SENSOR_ARRAY: "Increases Observer sight range.", + item_names.REAVER_SCARAB_DAMAGE: "Reaver Scarabs deal +25 damage.", + item_names.REAVER_SOLARITE_PAYLOAD: "Reaver Scarabs gain increased splash damage radius.", + item_names.REAVER_REAVER_CAPACITY: "Reavers can store 10 Scarabs.", + item_names.REAVER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.REAVER), + item_names.REAVER_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.REAVER, op_re_cost_reduction), + item_names.VANGUARD_AGONY_LAUNCHERS: "Increases Vanguard attack range by +2.", + item_names.VANGUARD_MATTER_DISPERSION: "Increases Vanguard attack area.", + item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: "Increases Immortal and Annihilator attack range by +2.", + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING: "Immortals and Annihilators can attack air units.", + item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: "Immortals and Annihilators deal minor splash damage.", + item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: "Increases Stalwart attack bounce range by +1.", + item_names.STALWART_REINTEGRATED_FRAMEWORK: "Increases the movement speed of Stalwarts.", + item_names.STALWART_STABILIZED_ELECTRODES: "Allows Stalwarts to attack while moving, and increases attack range by +1.", + item_names.STALWART_LATTICED_SHIELDING: "Increases Stalwart max shields by +50.", + item_names.DISRUPTOR_CLOAKING_MODULE: "Disruptors are permanently cloaked.", + item_names.DISRUPTOR_PERFECTED_POWER: "Allows Purification Nova to hit air units. Bonus damage to shields is now baseline for enemies (friendly damage unaffected).", + item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: "Purification Nova does 50% reduced damage to friendly units and structures.", + item_names.COLOSSUS_PACIFICATION_PROTOCOL: "Increases Colossus attack speed.", + item_names.WRATHWALKER_RAPID_POWER_CYCLING: "Reduces the charging time and increases attack speed of the Wrathwalker's Charged Blast.", + item_names.WRATHWALKER_EYE_OF_WRATH: "Increases Wrathwalker weapon range by +1.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: f"Increases {DISPLAY_NAME_CLOAKED_ASSASSIN} maximum shields by +80.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: f"Increases {DISPLAY_NAME_CLOAKED_ASSASSIN} maximum life by +40.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: _ability_desc("Dark Templar, Avengers, and Blood Hunters", "Blink"), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_CLOAKED_ASSASSIN), + item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: "Allows 2 Dark Templar to meld into a Dark Archon.", + item_names.DARK_TEMPLAR_ARCHON_MERGE: "Allows 2 Dark Templar to merge into a Archon.", + item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: "High Templar and Signifiers deal increased damage with Psi Storm.", + item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: _ability_desc("High Templar and Signifiers", "Hallucination", "creates 2 hallucinated copies of a target unit"), + item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: _get_start_and_max_energy_desc("High Templar and Signifiers"), + item_names.ARCHON_HIGH_ARCHON: "Archons can use High Templar abilities.", + item_names.ARCHON_TRANSCENDENCE: "Archons can float in the air. Can traverse cliffs and phase through most units. Increases Archon attack range by 1.", + item_names.ARCHON_POWER_SIPHON: _ability_desc("Archons", "Power Siphon", "deals damage to a target and replenishes shields over 2 seconds"), + item_names.ARCHON_ERADICATE: "On death, Archons launch towards nearby enemy ground units, dealing damage on impact.", + item_names.ARCHON_OBLITERATE: "Archon attacks get increased area of effect, and deal their biological bonus damage to all targets.", + item_names.DARK_ARCHON_FEEDBACK: _ability_desc("Dark Archons", "Feedback", "drains all energy from a target and deals 1 damage per point of energy drained"), + item_names.DARK_ARCHON_MAELSTROM: _ability_desc("Dark Archons", "Maelstrom", "stuns biological units in an area"), + item_names.DARK_ARCHON_ARGUS_TALISMAN: _get_start_and_max_energy_desc("Dark Archons"), + item_names.ASCENDANT_POWER_OVERWHELMING: "Ascendants gain the ability to sacrifice Supplicants for increased shields and spell damage.", + item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: "Ascendants' Psionic Orbs gain 25% increased travel distance.", + item_names.ASCENDANT_BLOOD_AMULET: _get_start_and_max_energy_desc("Ascendants"), + item_names.ASCENDANT_ARCHON_MERGE: "Allows 2 Ascendants to merge into a Archon.", + item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: "Sentries, Energizers, and Havocs become permanently cloaked.", + item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: "Sentries, Energizers, and Havocs gain +100% energy regeneration rate.", + item_names.SENTRY_FORCE_FIELD: _ability_desc("Sentries", "Force Field", "creates a force field that blocks units from walking through"), + item_names.SENTRY_HALLUCINATION: _ability_desc("Sentries", "Hallucination", "creates hallucinated versions of Protoss units"), + item_names.ENERGIZER_RECLAMATION: _ability_desc("Energizers", "Reclamation", "temporarily takes control of an enemy mechanical unit. When the ability expires, the enemy unit self-destructs"), + item_names.ENERGIZER_FORGED_CHASSIS: "Increases Energizer Life by +20.", + item_names.HAVOC_DETECT_WEAKNESS: "Havocs' Target Lock gives an additional +15% damage bonus.", + item_names.HAVOC_BLOODSHARD_RESONANCE: "Havocs gain increased range for Squad Sight, Target Lock, and Force Field.", + item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: "Zealots, Sentinels, and Centurions gain increased movement speed.", + item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: "Zealots, Sentinels, and Centurions gain +30 maximum shields.", + item_names.ZEALOT_WHIRLWIND: "Zealot War Council ability.\nGives Zealots the whirlwind ability, dealing damage in an area over 3 seconds.", + item_names.CENTURION_RESOURCE_EFFICIENCY: "Centurion War Council upgrade.\n" + _get_resource_efficiency_desc( + item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: "Sentinel War Council upgrade.\n" + _get_resource_efficiency_desc( + item_names.SENTINEL), + item_names.STALKER_PHASE_REACTOR: "Stalker War Council upgrade.\nStalkers restore 80 shields over 5 seconds after they Blink.", + item_names.DRAGOON_PHALANX_SUIT: "Dragoon War Council upgrade.\nDragoons gain +1 range, move slightly faster, and can form tighter formations.", + item_names.INSTIGATOR_MODERNIZED_SERVOS: "Instigator War Council upgrade.\nInstigators move 28% faster.", + item_names.ADEPT_DISRUPTIVE_TRANSFER: "Adept War Council upgrade.\nAdept shades apply a debuff to enemies they touch, increasing damage taken by +5.", + item_names.SLAYER_PHASE_BLINK: "Slayer War Council ability.\nSlayers can now blink. After blinking, the Slayer's next attack within 8 seconds deals double damage.", + item_names.AVENGER_KRYHAS_CLOAK: "Avenger War Council upgrade.\nAvengers are now permanently cloaked.", + item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: "Dark Templar War Council ability.\nDark Templar gain two strikes of their Shadow Fury ability.", + item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: "Dark Templar War Council ability.\nDark Templar gain three strikes of their Shadow Fury ability.", + item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: "Blood Hunter War Council upgrade.\nBlood Hunters attack twice as quickly.", + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: "Sentry War Council upgrade.\nSentries can heal the shields of two targets at once.", + item_names.ENERGIZER_MOBILE_CHRONO_BEAM: "Energizer War Council upgrade.\nAllows Energizers to use Chrono Beam in Mobile Mode.", + item_names.HAVOC_ENDURING_SIGHT: "Havoc War Council upgrade.\nHavoc Squad Sight stays up indefinitely and no longer takes energy.", + item_names.HIGH_TEMPLAR_PLASMA_SURGE: "High Templar War Council upgrade.\nHigh Templar Psionic Storm will heal fiendly protoss shields under it.", + item_names.SIGNIFIER_FEEDBACK: "Signifier War Council ability.\n" + _ability_desc("Signifiers", "Feedback", "drains all energy from a target and deals 1 damage per point of energy drained"), + item_names.ASCENDANT_BREATH_OF_CREATION: "Ascendant War Council upgrade.\nAscendant spells cost -25 energy.", + item_names.DARK_ARCHON_INDOMITABLE_WILL: "Dark Archon War Council upgrade.\nCasting Mind Control will no longer deplete the Dark Archon's shields.", + item_names.IMMORTAL_IMPROVED_BARRIER: "Immortal War Council upgrade.\nThe Immortal's Barrier ability absorbs an additional +100 damage.", + item_names.VANGUARD_RAPIDFIRE_CANNON: "Vanguard War Council upgrade.\nVanguards attack 60% faster.", + item_names.VANGUARD_FUSION_MORTARS: "Vanguard War Council upgrade.\nVanguards deal +7 damage to armored targets per attack.", + item_names.ANNIHILATOR_TWILIGHT_CHASSIS: "Annihilator War Council upgrade.\nThe Annihilator gains +100 maximum life.", + item_names.STALWART_ARC_INDUCERS: "Stalwart War Council upgrade.\nStalwarts damage up to 3 additional units when attacking.", + item_names.COLOSSUS_FIRE_LANCE: "Colossus War Council upgrade.\nColossi set the ground on fire with their attacks, dealing damage to enemies over time.", + item_names.WRATHWALKER_AERIAL_TRACKING: "Wrathwalker War Council upgrade.\nWrathwalkers can now target air units.", + item_names.REAVER_KHALAI_REPLICATORS: "Reaver War Council upgrade.\nReaver Scarabs no longer cost minerals.", + item_names.DISRUPTOR_MOBILITY_PROTOCOLS: "Disruptor War Council upgrade.\nAllows the Disruptor to move while casting Purification Nova. Also allows the Disruptor to Blink.", + item_names.WARP_PRISM_WARP_REFRACTION: "Warp Prism War Council upgrade.\nWarp Prisms gain +5 pickup range and unload units 10 times faster.", + item_names.OBSERVER_INDUCE_SCOPOPHOBIA: "Observer War Council ability.\n" + _ability_desc("Observers", "Induce Scopophobia", "reduces the attack and movement speed of an enemy by 20%"), + item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: "Phoenix War Council upgrade.\nPhoenixes can now use Graviton Beam to lift two targets at once.", + item_names.CORSAIR_NETWORK_DISRUPTION: "Corsair War Council upgrade.\nTriples the radius of Disruption Web.", + item_names.MIRAGE_GRAVITON_BEAM: "Mirage War Council ability.\nAllows Mirages to use Graviton Beam.", + item_names.SKIRMISHER_PEER_CONTEMPT: "Skirmisher War Council upgrade.\nAllows Skirmishers to target air units.", + item_names.VOID_RAY_PRISMATIC_RANGE: "Void Ray War Council upgrade.\nVoid Rays gain increased range as they charge their beam.", + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: "Destroyer War Council upgrade.\nIncreases the Destroyer's bounce attack damage to 3 (+2 vs armored) at all charge levels, and allows the bounces to benefit from protoss air weapon upgrades.", + item_names.PULSAR_CHRONO_SHEAR: "Pulsar War Council upgrade.\nFully-stacked slow on non-heroic targets also applies a defense debuff.", + item_names.DAWNBRINGER_SOLARITE_LENS: "Dawnbringer War Council upgrade.\nDawnbringers gain +2 range.", + item_names.CARRIER_REPAIR_DRONES: "Carrier War Council upgrade.\nCarriers gain 2 repair drones which heal nearby mechanical units.", + item_names.SKYLORD_JUMP: "Skylord War Council ability.\n" + _ability_desc("Skylords", "Jump", "instantly teleports the Skylord a short distance"), + item_names.TRIREME_SOLAR_BEAM: "Trireme War Council weapon.\nTriremes gain an anti-air laser attack that deals more damage over time.", + item_names.TEMPEST_DISINTEGRATION: "Tempest War Council ability.\n" + _ability_desc("Tempests", "Disintegration", "deals 500 damage to a target unit or structure over 20 seconds"), + item_names.SCOUT_EXPEDITIONARY_HULL: "Scout War Council upgrade.\nScouts gain +25 shields, +50 health, +1 shield armor, and reduced shield regeneration delay.", + item_names.ARBITER_VESSEL_OF_THE_CONCLAVE: "Arbiter War Council upgrade.\nReduces the energy cost of Recall by 50 and Stasis Field by 100.", + item_names.ORACLE_STASIS_CALIBRATION: "Oracle War Council upgrade.\nEnemies caught by the Oracle's Stasis Ward may now be attacked for the first 5 seconds of stasis.", + item_names.MOTHERSHIP_INTEGRATED_POWER: "Mothership War Council upgrade.\nAllows Motherships to move at full speed outside pylon power.", + item_names.OPPRESSOR_VULCAN_BLASTER: "Oppressor War Council ability.\n" + _ability_desc("Oppressors", "Vulcan Blaster", "activates a powerful short range anti-ground weapon for a limited time. Greatly reduces movement and turning speed, and disables other weapons while active"), + item_names.CALADRIUS_CORONA_BEAM: "Caladrius War Council ability.\n" + _ability_desc("Caladrius", "Corona Beam", "channels a beam that drains up to 100 of the Caladrius' shields to deal up to 200 damage over time to a single target"), + item_names.MISTWING_PHANTOM_DASH: "Mist Wing War Council ability.\n" + _ability_desc("Mist Wings", "Phantom Dash", "dashes forward to cover some distance quickly. Deals damage in a line if the Mist Wing is cloaked"), + item_names.SUPPLICANT_SACRIFICE: "Supplicant War Council ability.\nAllows Supplicants to sacrifice themselves to save nearby units from death.", + + + item_names.SOA_CHRONO_SURGE: "The Spear of Adun increases a target structure's unit warp in and research speeds by +1000% for 20 seconds.", + item_names.SOA_PROGRESSIVE_PROXY_PYLON: inspect.cleandoc(""" + Level 1: The Spear of Adun quickly warps in a Pylon to a target location. + Level 2: The Spear of Adun warps in a Pylon, 2 melee warriors, and 2 ranged warriors to a target location. + """), + item_names.SOA_PYLON_OVERCHARGE: "The Spear of Adun temporarily gives a target Pylon increased shields and a powerful attack.", + item_names.SOA_ORBITAL_STRIKE: "The Spear of Adun fires 5 laser blasts from orbit.", + item_names.SOA_TEMPORAL_FIELD: "The Spear of Adun creates 3 temporal fields that freeze enemy units and structures in time.", + item_names.SOA_SOLAR_LANCE: "The Spear of Adun strafes a target area with 3 laser beams.", + item_names.SOA_MASS_RECALL: "The Spear of Adun warps all units in a target area back to the primary Nexus and gives them a temporary shield.", + item_names.SOA_SHIELD_OVERCHARGE: "The Spear of Adun gives all friendly units a shield that absorbs 200 damage. Lasts 20 seconds.", + item_names.SOA_DEPLOY_FENIX: "The Spear of Adun drops Fenix onto the battlefield. Fenix is a powerful warrior who will fight for 30 seconds.", + item_names.SOA_PURIFIER_BEAM: "The Spear of Adun fires a wide laser that deals large amounts of damage in a moveable area. Lasts 15 seconds.", + item_names.SOA_TIME_STOP: "The Spear of Adun freezes all enemy units and structures in time for 20 seconds.", + item_names.SOA_SOLAR_BOMBARDMENT: "The Spear of Adun fires 200 laser blasts randomly over a wide area.", + item_names.MATRIX_OVERLOAD: "All friendly units gain 25% movement speed and 15% attack speed within a Pylon's power field and for 15 seconds after leaving it.", + item_names.QUATRO: "All friendly Protoss units gain the equivalent of their +1 armor, attack, and shield upgrades.", + item_names.NEXUS_OVERCHARGE: "The Protoss Nexus gains a long-range auto-attack.", + item_names.ORBITAL_ASSIMILATORS: "Assimilators automatically harvest Vespene Gas without the need for Probes.", + item_names.WARP_HARMONIZATION: "Stargates and Robotics Facilities can transform to utilize Warp In technology. Warp In cooldowns are 20% faster than original build times.", + item_names.GUARDIAN_SHELL: "The Spear of Adun passively shields friendly Protoss units before death, making them invulnerable for 5 seconds. Each unit can only be shielded once every 60 seconds.", + item_names.RECONSTRUCTION_BEAM: "The Spear of Adun will passively heal mechanical units for 5 and non-biological structures for 10 life per second. Up to 3 targets can be repaired at once.", + item_names.OVERWATCH: "Once per second, the Spear of Adun will last-hit a damaged enemy unit that is below 50 health.", + item_names.SUPERIOR_WARP_GATES: "Protoss Warp Gates can hold up to 3 charges of unit warp-ins.", + item_names.ENHANCED_TARGETING: "Protoss defensive structures gain +2 range.", + item_names.OPTIMIZED_ORDNANCE: "Increases the attack speed of Protoss defensive structures by 25%.", + item_names.KHALAI_INGENUITY: "Pylons, Photon Cannons, Monoliths, and Shield Batteries warp in near-instantly.", + item_names.AMPLIFIED_ASSIMILATORS: "Assimilators produce Vespene gas 25% faster.", + item_names.PROGRESSIVE_WARP_RELOCATE: inspect.cleandoc(""" + Level 1: Protoss structures can be moved anywhere within pylon power after a brief delay. Max 3 charges, shared globally. + Level 2: No longer consumes or requires charges. + """), + item_names.PROBE_WARPIN: "You can warp in additonal Probes from your Nexus to any visible location within a Pylon's power field. Has a 30 second cooldown and can store up to 2 charges.", + item_names.ELDER_PROBES: "You can warp in a group of 5 Elder Probes, tough builders from the Brood War. Elder Probes can provide a Power Field and get reconstructed on death. Can only be used once per mission.", +} + +# Key descriptions +key_descriptions = { + key: GENERIC_KEY_DESC + for key in item_tables.key_item_table.keys() +} +item_descriptions.update(key_descriptions) diff --git a/worlds/sc2/item/item_groups.py b/worlds/sc2/item/item_groups.py new file mode 100644 index 00000000..ea65dc3e --- /dev/null +++ b/worlds/sc2/item/item_groups.py @@ -0,0 +1,902 @@ +import typing +from . import item_tables, item_names +from .item_tables import key_item_table +from ..mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race + +""" +Item name groups, given to Archipelago and used in YAMLs and /received filtering. +For non-developers the following will be useful: +* Items with a bracket get groups named after the unbracketed part + * eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI" + * The exception to this are item names that would be ambiguous (eg. "Resource Efficiency") +* Item flaggroups get unique groups as well as combined groups for numbered flaggroups + * eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6" + * The best place to look these up is at the bottom of Items.py +* Items that have a parent are grouped together + * eg. "Zergling Items" contains all items that have "Zergling" as a parent + * These groups do NOT contain the parent item + * This currently does not include items with multiple potential parents, like some LotV unit upgrades +* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any") +* Hand-crafted item groups can be found at the bottom of this file +""" + +item_name_groups: typing.Dict[str, typing.List[str]] = {} + +# Groups for use in world logic +item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission] +item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \ + ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]] + +# These item name groups should not show up in documentation +unlisted_item_name_groups = { + "Missions", "WoL Missions", + item_tables.TerranItemType.Progressive.display_name, + item_tables.TerranItemType.Nova_Gear.display_name, + item_tables.TerranItemType.Mercenary.display_name, + item_tables.ZergItemType.Ability.display_name, + item_tables.ZergItemType.Morph.display_name, + item_tables.ZergItemType.Strain.display_name, +} + +# Some item names only differ in bracketed parts +# These items are ambiguous for short-hand name groups +bracketless_duplicates: typing.Set[str] +# This is a list of names in ItemNames with bracketed parts removed, for internal use +_shortened_names = [(name[:name.find(' (')] if '(' in name else name) + for name in [item_names.__dict__[name] for name in item_names.__dir__() if not name.startswith('_')]] +# Remove the first instance of every short-name from the full item list +bracketless_duplicates = set(_shortened_names) +for name in bracketless_duplicates: + _shortened_names.remove(name) +# The remaining short-names are the duplicates +bracketless_duplicates = set(_shortened_names) +del _shortened_names + +# All items get sorted into their data type +for item, data in item_tables.get_full_item_list().items(): + # Items get assigned to their flaggroup's display type + item_name_groups.setdefault(data.type.display_name, []).append(item) + # Items with a bracket get a short-hand name group for ease of use in YAMLs + if '(' in item: + short_name = item[:item.find(' (')] + # Ambiguous short-names are dropped + if short_name not in bracketless_duplicates: + item_name_groups[short_name] = [item] + # Short-name groups are unlisted + unlisted_item_name_groups.add(short_name) + # Items with a parent get assigned to their parent's group + if data.parent: + # The parent groups need a special name, otherwise they are ambiguous with the parent + parent_group = f"{data.parent} Items" + item_name_groups.setdefault(parent_group, []).append(item) + # Parent groups are unlisted + unlisted_item_name_groups.add(parent_group) + # All items get assigned to their race's group + race_group = data.race.name.capitalize() + item_name_groups.setdefault(race_group, []).append(item) + + +# Hand-made groups +class ItemGroupNames: + TERRAN_ITEMS = "Terran Items" + """All Terran items""" + TERRAN_UNITS = "Terran Units" + TERRAN_GENERIC_UPGRADES = "Terran Generic Upgrades" + """+attack/armour upgrades""" + BARRACKS_UNITS = "Barracks Units" + FACTORY_UNITS = "Factory Units" + STARPORT_UNITS = "Starport Units" + WOL_UNITS = "WoL Units" + WOL_MERCS = "WoL Mercenaries" + WOL_BUILDINGS = "WoL Buildings" + WOL_UPGRADES = "WoL Upgrades" + WOL_ITEMS = "WoL Items" + """All items from vanilla WoL. Note some items are progressive where level 2 is not vanilla.""" + NCO_UNITS = "NCO Units" + NCO_BUILDINGS = "NCO Buildings" + NCO_UNIT_TECHNOLOGY = "NCO Unit Technology" + NCO_BASELINE_UPGRADES = "NCO Baseline Upgrades" + NCO_UPGRADES = "NCO Upgrades" + NOVA_EQUIPMENT = "Nova Equipment" + NOVA_WEAPONS = "Nova Weapons" + NOVA_GADGETS = "Nova Gadgets" + NCO_MAX_PROGRESSIVE_ITEMS = "NCO +Items" + """NCO item groups that should be set to maximum progressive amounts""" + NCO_MIN_PROGRESSIVE_ITEMS = "NCO -Items" + """NCO item groups that should be set to minimum progressive amounts (1)""" + TERRAN_BUILDINGS = "Terran Buildings" + TERRAN_MERCENARIES = "Terran Mercenaries" + TERRAN_STIMPACKS = "Terran Stimpacks" + TERRAN_PROGRESSIVE_UPGRADES = "Terran Progressive Upgrades" + TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES = "Terran Original Progressive Upgrades" + """Progressive items where level 1 appeared in WoL""" + MENGSK_UNITS = "Mengsk Units" + TERRAN_VETERANCY_UNITS = "Terran Veterancy Units" + ORBITAL_COMMAND_ABILITIES = "Orbital Command Abilities" + WOL_ORBITAL_COMMAND_ABILITIES = "WoL Command Center Abilities" + + ZERG_ITEMS = "Zerg Items" + ZERG_UNITS = "Zerg Units" + ZERG_NONMORPH_UNITS = "Zerg Non-morph Units" + ZERG_GENERIC_UPGRADES = "Zerg Generic Upgrades" + """+attack/armour upgrades""" + HOTS_UNITS = "HotS Units" + HOTS_BUILDINGS = "HotS Buildings" + HOTS_STRAINS = "HotS Strains" + """Vanilla HotS strains (the upgrades you play a mini-mission for)""" + HOTS_MUTATIONS = "HotS Mutations" + """Vanilla HotS Mutations (basic toggleable unit upgrades)""" + HOTS_GLOBAL_UPGRADES = "HotS Global Upgrades" + HOTS_MORPHS = "HotS Morphs" + KERRIGAN_ABILITIES = "Kerrigan Abilities" + KERRIGAN_HOTS_ABILITIES = "Kerrigan HotS Abilities" + KERRIGAN_ACTIVE_ABILITIES = "Kerrigan Active Abilities" + KERRIGAN_LOGIC_ACTIVE_ABILITIES = "Kerrigan Logic Active Abilities" + KERRIGAN_PASSIVES = "Kerrigan Passives" + KERRIGAN_TIER_1 = "Kerrigan Tier 1" + KERRIGAN_TIER_2 = "Kerrigan Tier 2" + KERRIGAN_TIER_3 = "Kerrigan Tier 3" + KERRIGAN_TIER_4 = "Kerrigan Tier 4" + KERRIGAN_TIER_5 = "Kerrigan Tier 5" + KERRIGAN_TIER_6 = "Kerrigan Tier 6" + KERRIGAN_TIER_7 = "Kerrigan Tier 7" + KERRIGAN_ULTIMATES = "Kerrigan Ultimates" + KERRIGAN_LOGIC_ULTIMATES = "Kerrigan Logic Ultimates" + KERRIGAN_NON_ULTIMATES = "Kerrigan Non-Ultimates" + KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES = "Kerrigan Non-Ultimate Active Abilities" + HOTS_ITEMS = "HotS Items" + """All items from vanilla HotS""" + OVERLORD_UPGRADES = "Overlord Upgrades" + ZERG_MORPHS = "Zerg Morphs" + ZERG_MERCENARIES = "Zerg Mercenaries" + ZERG_BUILDINGS = "Zerg Buildings" + INF_TERRAN_ITEMS = "Infested Terran Items" + """All items from Stukov co-op subfaction""" + INF_TERRAN_UNITS = "Infested Terran Units" + INF_TERRAN_UPGRADES = "Infested Terran Upgrades" + + PROTOSS_ITEMS = "Protoss Items" + PROTOSS_UNITS = "Protoss Units" + PROTOSS_GENERIC_UPGRADES = "Protoss Generic Upgrades" + """+attack/armour upgrades""" + GATEWAY_UNITS = "Gateway Units" + ROBO_UNITS = "Robo Units" + STARGATE_UNITS = "Stargate Units" + PROPHECY_UNITS = "Prophecy Units" + PROPHECY_BUILDINGS = "Prophecy Buildings" + LOTV_UNITS = "LotV Units" + LOTV_ITEMS = "LotV Items" + LOTV_GLOBAL_UPGRADES = "LotV Global Upgrades" + SOA_ITEMS = "SOA" + PROTOSS_GLOBAL_UPGRADES = "Protoss Global Upgrades" + PROTOSS_BUILDINGS = "Protoss Buildings" + WAR_COUNCIL = "Protoss War Council Upgrades" + AIUR_UNITS = "Aiur" + NERAZIM_UNITS = "Nerazim" + TAL_DARIM_UNITS = "Tal'Darim" + PURIFIER_UNITS = "Purifier" + + VANILLA_ITEMS = "Vanilla Items" + OVERPOWERED_ITEMS = "Overpowered Items" + UNRELEASED_ITEMS = "Unreleased Items" + LEGACY_ITEMS = "Legacy Items" + + KEYS = "Keys" + + @classmethod + def get_all_group_names(cls) -> typing.Set[str]: + return { + name for identifier, name in cls.__dict__.items() + if not identifier.startswith('_') + and not identifier.startswith('get_') + } + + +# Terran +item_name_groups[ItemGroupNames.TERRAN_ITEMS] = terran_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.TERRAN +] +item_name_groups[ItemGroupNames.TERRAN_UNITS] = terran_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in ( + item_tables.TerranItemType.Unit, item_tables.TerranItemType.Unit_2, item_tables.TerranItemType.Mercenary) +] +item_name_groups[ItemGroupNames.TERRAN_GENERIC_UPGRADES] = terran_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Upgrade +] +barracks_wa_group = [ + item_names.MARINE, item_names.FIREBAT, item_names.MARAUDER, + item_names.REAPER, item_names.GHOST, item_names.SPECTRE, item_names.HERC, item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, item_names.DOMINION_TROOPER, item_names.SON_OF_KORHAL, +] +item_name_groups[ItemGroupNames.BARRACKS_UNITS] = barracks_units = (barracks_wa_group + [ + item_names.MEDIC, + item_names.FIELD_RESPONSE_THETA, +]) +factory_wa_group = [ + item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK, + item_names.SIEGE_TANK, item_names.THOR, item_names.PREDATOR, + item_names.CYCLONE, item_names.WARHOUND, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.BULWARK_COMPANY, +] +item_name_groups[ItemGroupNames.FACTORY_UNITS] = factory_units = (factory_wa_group + [ + item_names.WIDOW_MINE, +]) +starport_wa_group = [ + item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, + item_names.BATTLECRUISER, item_names.RAVEN_HUNTER_SEEKER_WEAPON, + item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.STARPORT_UNITS] = starport_units = [ + item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, + item_names.BATTLECRUISER, item_names.HERCULES, item_names.SCIENCE_VESSEL, item_names.RAVEN, + item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.TERRAN_MERCENARIES] = terran_mercenaries = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Mercenary +] +item_name_groups[ItemGroupNames.NCO_UNITS] = nco_units = [ + item_names.MARINE, item_names.MARAUDER, item_names.REAPER, + item_names.HELLION, item_names.GOLIATH, item_names.SIEGE_TANK, + item_names.RAVEN, item_names.LIBERATOR, item_names.BANSHEE, item_names.BATTLECRUISER, + item_names.HERC, # From that one bonus objective in mission 5 +] +item_name_groups[ItemGroupNames.NCO_BUILDINGS] = nco_buildings = [ + item_names.BUNKER, item_names.MISSILE_TURRET, item_names.PLANETARY_FORTRESS, +] +item_name_groups[ItemGroupNames.NOVA_EQUIPMENT] = nova_equipment = [ + *[item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Nova_Gear], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, +] +item_name_groups[ItemGroupNames.NOVA_WEAPONS] = nova_weapons = [ + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, +] +item_name_groups[ItemGroupNames.NOVA_GADGETS] = nova_gadgets = [ + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_FLASHBANG_GRENADES, + item_names.NOVA_IONIC_FORCE_FIELD, + item_names.NOVA_HOLO_DECOY, +] +item_name_groups[ItemGroupNames.WOL_UNITS] = wol_units = [ + item_names.MARINE, item_names.MEDIC, item_names.FIREBAT, item_names.MARAUDER, item_names.REAPER, + item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK, item_names.SIEGE_TANK, + item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, item_names.BATTLECRUISER, + item_names.GHOST, item_names.SPECTRE, item_names.THOR, + item_names.PREDATOR, item_names.HERCULES, + item_names.SCIENCE_VESSEL, item_names.RAVEN, +] +item_name_groups[ItemGroupNames.WOL_MERCS] = wol_mercs = [ + item_names.WAR_PIGS, item_names.DEVIL_DOGS, item_names.HAMMER_SECURITIES, + item_names.SPARTAN_COMPANY, item_names.SIEGE_BREAKERS, + item_names.HELS_ANGELS, item_names.DUSK_WINGS, item_names.JACKSONS_REVENGE, +] +item_name_groups[ItemGroupNames.WOL_BUILDINGS] = wol_buildings = [ + item_names.BUNKER, item_names.MISSILE_TURRET, item_names.SENSOR_TOWER, + item_names.PERDITION_TURRET, item_names.PLANETARY_FORTRESS, + item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER, +] +item_name_groups[ItemGroupNames.TERRAN_BUILDINGS] = terran_buildings = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Building or item_name in wol_buildings +] +item_name_groups[ItemGroupNames.MENGSK_UNITS] = [ + item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW, + item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.DOMINION_TROOPER, +] +item_name_groups[ItemGroupNames.TERRAN_VETERANCY_UNITS] = [ + item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, item_names.SON_OF_KORHAL, item_names.FIELD_RESPONSE_THETA, + item_names.BULWARK_COMPANY, item_names.NIGHT_HAWK, item_names.EMPERORS_GUARDIAN, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.ORBITAL_COMMAND_ABILITIES] = orbital_command_abilities = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, +] +item_name_groups[ItemGroupNames.WOL_ORBITAL_COMMAND_ABILITIES] = wol_orbital_command_abilities = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, +] +spider_mine_sources = [ + item_names.VULTURE, + item_names.REAPER_SPIDER_MINES, + item_names.SIEGE_TANK_SPIDER_MINES, + item_names.RAVEN_SPIDER_MINES, +] + +# Terran Upgrades +item_name_groups[ItemGroupNames.WOL_UPGRADES] = wol_upgrades = [ + # Armory Base + item_names.BUNKER_PROJECTILE_ACCELERATOR, item_names.BUNKER_NEOSTEEL_BUNKER, + item_names.MISSILE_TURRET_TITANIUM_HOUSING, item_names.MISSILE_TURRET_HELLSTORM_BATTERIES, + item_names.SCV_ADVANCED_CONSTRUCTION, item_names.SCV_DUAL_FUSION_WELDERS, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, item_names.COMMAND_CENTER_MULE, item_names.COMMAND_CENTER_SCANNER_SWEEP, + # Armory Infantry + item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_COMBAT_SHIELD, + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES, item_names.MEDIC_STABILIZER_MEDPACKS, + item_names.FIREBAT_INCINERATOR_GAUNTLETS, item_names.FIREBAT_JUGGERNAUT_PLATING, + item_names.MARAUDER_CONCUSSIVE_SHELLS, item_names.MARAUDER_KINETIC_FOAM, + item_names.REAPER_U238_ROUNDS, item_names.REAPER_G4_CLUSTERBOMB, + # Armory Vehicles + item_names.HELLION_TWIN_LINKED_FLAMETHROWER, item_names.HELLION_THERMITE_FILAMENTS, + item_names.SPIDER_MINE_CERBERUS_MINE, item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM, item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM, + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, item_names.DIAMONDBACK_SHAPED_HULL, + item_names.SIEGE_TANK_MAELSTROM_ROUNDS, item_names.SIEGE_TANK_SHAPED_BLAST, + # Armory Starships + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE, item_names.MEDIVAC_ADVANCED_HEALING_AI, + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, item_names.WRAITH_DISPLACEMENT_FIELD, + item_names.VIKING_RIPWAVE_MISSILES, item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, + # Armory Dominion + item_names.GHOST_OCULAR_IMPLANTS, item_names.GHOST_CRIUS_SUIT, + item_names.SPECTRE_PSIONIC_LASH, item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE, + item_names.THOR_330MM_BARRAGE_CANNON, item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, + # Lab Zerg + item_names.BUNKER_FORTIFIED_BUNKER, item_names.BUNKER_SHRIKE_TURRET, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, item_names.CELLULAR_REACTOR, + # Other 3 levels are units/buildings (Perdition, PF, Hercules, Predator, HME, Psi Disrupter) + # Lab Protoss + item_names.VANADIUM_PLATING, item_names.ULTRA_CAPACITORS, + item_names.AUTOMATED_REFINERY, item_names.MICRO_FILTERING, + item_names.ORBITAL_DEPOTS, item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, + item_names.ORBITAL_STRIKE, item_names.TECH_REACTOR, + # Other level is units (Raven, Science Vessel) +] +item_name_groups[ItemGroupNames.TERRAN_STIMPACKS] = terran_stimpacks = [ + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.MARAUDER_PROGRESSIVE_STIMPACK, + item_names.REAPER_PROGRESSIVE_STIMPACK, + item_names.FIREBAT_PROGRESSIVE_STIMPACK, + item_names.HELLION_PROGRESSIVE_STIMPACK, +] +item_name_groups[ItemGroupNames.TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES] = terran_original_progressive_upgrades = [ + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, +] +item_name_groups[ItemGroupNames.NCO_BASELINE_UPGRADES] = nco_baseline_upgrades = [ + item_names.BUNKER_NEOSTEEL_BUNKER, # Baseline from mission 2 + item_names.BUNKER_FORTIFIED_BUNKER, # Baseline from mission 2 + item_names.MARINE_COMBAT_SHIELD, # Baseline from mission 2 + item_names.MARAUDER_KINETIC_FOAM, # Baseline outside WOL + item_names.MARAUDER_CONCUSSIVE_SHELLS, # Baseline from mission 2 + item_names.REAPER_BALLISTIC_FLIGHTSUIT, # Baseline from mission 2 + item_names.HELLION_HELLBAT, # Baseline from mission 3 + item_names.GOLIATH_INTERNAL_TECH_MODULE, # Baseline from mission 4 + item_names.GOLIATH_SHAPED_HULL, + # ItemNames.GOLIATH_RESOURCE_EFFICIENCY, # Supply savings baseline in NCO, mineral savings is non-NCO + item_names.SIEGE_TANK_SHAPED_HULL, # Baseline NCO gives +10; this upgrade gives +25 + item_names.SIEGE_TANK_SHAPED_BLAST, # Baseline from mission 3 + item_names.LIBERATOR_RAID_ARTILLERY, # Baseline in mission 5 + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE, # Baseline in mission 5 + item_names.BATTLECRUISER_TACTICAL_JUMP, + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, # Baseline from mission 2 + item_names.ORBITAL_DEPOTS, # Baseline from mission 2 + item_names.COMMAND_CENTER_SCANNER_SWEEP, # In NCO you must actually morph Command Center into Orbital Command + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, # But in AP this works WoL-style +] + nco_buildings +item_name_groups[ItemGroupNames.NCO_UNIT_TECHNOLOGY] = nco_unit_technology = [ + item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MARINE_OPTIMIZED_LOGISTICS, + item_names.MARAUDER_LASER_TARGETING_SYSTEM, + item_names.MARAUDER_INTERNAL_TECH_MODULE, + item_names.MARAUDER_PROGRESSIVE_STIMPACK, + item_names.MARAUDER_MAGRAIL_MUNITIONS, + item_names.REAPER_SPIDER_MINES, + item_names.REAPER_LASER_TARGETING_SYSTEM, + item_names.REAPER_PROGRESSIVE_STIMPACK, + item_names.REAPER_ADVANCED_CLOAKING_FIELD, + # Reaper special ordnance gives anti-building attack, which is baseline in AP + item_names.HELLION_JUMP_JETS, + item_names.HELLION_PROGRESSIVE_STIMPACK, + item_names.HELLION_SMART_SERVOS, + item_names.HELLION_OPTIMIZED_LOGISTICS, + item_names.HELLION_THERMITE_FILAMENTS, # Called Infernal Pre-Igniter in NCO + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM, # Called Laser Targeting System in NCO + item_names.GOLIATH_JUMP_JETS, + item_names.GOLIATH_OPTIMIZED_LOGISTICS, + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM, + item_names.SIEGE_TANK_SPIDER_MINES, + item_names.SIEGE_TANK_JUMP_JETS, + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE, + item_names.SIEGE_TANK_SMART_SERVOS, + # Tanks can't get Laser targeting system in NCO + item_names.BANSHEE_INTERNAL_TECH_MODULE, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, # Banshee Special Ordnance + # Banshees can't get laser targeting systems in NCO + item_names.LIBERATOR_CLOAK, + item_names.LIBERATOR_SMART_SERVOS, + item_names.LIBERATOR_OPTIMIZED_LOGISTICS, + # Liberators can't get laser targeting system in NCO + item_names.RAVEN_SPIDER_MINES, + item_names.RAVEN_INTERNAL_TECH_MODULE, + item_names.RAVEN_RAILGUN_TURRET, # Raven Magrail Munitions + item_names.RAVEN_HUNTER_SEEKER_WEAPON, # Raven Special Ordnance + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE, + item_names.BATTLECRUISER_CLOAK, + item_names.BATTLECRUISER_ATX_LASER_BATTERY, # Battlecruiser Special Ordnance + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, +] +item_name_groups[ItemGroupNames.NCO_UPGRADES] = nco_upgrades = nco_baseline_upgrades + nco_unit_technology +item_name_groups[ItemGroupNames.NCO_MAX_PROGRESSIVE_ITEMS] = nco_unit_technology + nova_equipment + terran_generic_upgrades +item_name_groups[ItemGroupNames.NCO_MIN_PROGRESSIVE_ITEMS] = nco_units + nco_baseline_upgrades +item_name_groups[ItemGroupNames.TERRAN_PROGRESSIVE_UPGRADES] = terran_progressive_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2) +] +item_name_groups[ItemGroupNames.WOL_ITEMS] = vanilla_wol_items = ( + wol_units + + wol_buildings + + wol_mercs + + wol_upgrades + + orbital_command_abilities + + terran_generic_upgrades +) + +# Zerg +item_name_groups[ItemGroupNames.ZERG_ITEMS] = zerg_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.ZERG +] +item_name_groups[ItemGroupNames.ZERG_BUILDINGS] = zerg_buildings = [ + item_names.SPINE_CRAWLER, + item_names.SPORE_CRAWLER, + item_names.BILE_LAUNCHER, + item_names.INFESTED_BUNKER, + item_names.INFESTED_MISSILE_TURRET, + item_names.NYDUS_WORM, + item_names.ECHIDNA_WORM] +item_name_groups[ItemGroupNames.ZERG_NONMORPH_UNITS] = zerg_nonmorph_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in ( + item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary + ) + and item_name not in zerg_buildings +] +item_name_groups[ItemGroupNames.ZERG_MORPHS] = zerg_morphs = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Morph +] +item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_units = zerg_nonmorph_units + zerg_morphs +# For W/A upgrades +zerg_ground_units = [ + item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION, + item_names.SWARM_HOST, item_names.INFESTOR, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT, + item_names.ROACH_RAVAGER_ASPECT, item_names.DEFILER, item_names.ROACH_PRIMAL_IGNITER_ASPECT, + item_names.PYGALISK, + item_names.INFESTED_MARINE, item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, +] +zerg_melee_wa = [ + item_names.ZERGLING, item_names.ABERRATION, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT, + item_names.ULTRALISK_TYRANNOZOR_ASPECT, item_names.INFESTED_BUNKER, item_names.PYGALISK, +] +zerg_ranged_wa = [ + item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.SWARM_HOST, + item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT, + item_names.ROACH_RAVAGER_ASPECT, item_names.ROACH_PRIMAL_IGNITER_ASPECT, item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, +] +zerg_air_units = [ + item_names.MUTALISK, item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, + item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.SCOURGE, item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, item_names.INFESTED_BANSHEE, item_names.INFESTED_LIBERATOR, +] +item_name_groups[ItemGroupNames.ZERG_GENERIC_UPGRADES] = zerg_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ZergItemType.Upgrade +] +item_name_groups[ItemGroupNames.HOTS_UNITS] = hots_units = [ + item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, + item_names.ABERRATION, item_names.SWARM_HOST, item_names.MUTALISK, + item_names.INFESTOR, item_names.ULTRALISK, + item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, + item_names.HYDRALISK_IMPALER_ASPECT, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, +] +item_name_groups[ItemGroupNames.HOTS_BUILDINGS] = hots_buildings = [ + item_names.SPINE_CRAWLER, + item_names.SPORE_CRAWLER, +] +item_name_groups[ItemGroupNames.HOTS_MORPHS] = hots_morphs = [ + item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_IMPALER_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, +] +item_name_groups[ItemGroupNames.ZERG_MERCENARIES] = zerg_mercenaries = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Mercenary +] +item_name_groups[ItemGroupNames.KERRIGAN_ABILITIES] = kerrigan_abilities = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Ability +] +item_name_groups[ItemGroupNames.KERRIGAN_PASSIVES] = kerrigan_passives = [ + item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_CHAIN_REACTION, + item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY, +] +item_name_groups[ItemGroupNames.KERRIGAN_ACTIVE_ABILITIES] = kerrigan_active_abilities = [ + item_name for item_name in kerrigan_abilities if item_name not in kerrigan_passives +] +item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ACTIVE_ABILITIES] = kerrigan_logic_active_abilities = [ + item_name for item_name in kerrigan_active_abilities if item_name != item_names.KERRIGAN_ASSIMILATION_AURA +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_1] = kerrigan_tier_1 = [ + item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_LEAPING_STRIKE +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_2] = kerrigan_tier_2= [ + item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_CHAIN_REACTION, item_names.KERRIGAN_PSIONIC_SHIFT +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_3] = kerrigan_tier_3 = [ + item_names.TWIN_DRONES, item_names.AUTOMATED_EXTRACTORS, item_names.ZERGLING_RECONSTITUTION +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_4] = kerrigan_tier_4 = [ + item_names.KERRIGAN_MEND, item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_WILD_MUTATION +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_5] = kerrigan_tier_5 = [ + item_names.MALIGNANT_CREEP, item_names.VESPENE_EFFICIENCY, item_names.OVERLORD_IMPROVED_OVERLORDS +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_6] = kerrigan_tier_6 = [ + item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_7] = kerrigan_tier_7 = [ + item_names.KERRIGAN_APOCALYPSE, item_names.KERRIGAN_SPAWN_LEVIATHAN, item_names.KERRIGAN_DROP_PODS +] +item_name_groups[ItemGroupNames.KERRIGAN_ULTIMATES] = kerrigan_ultimates = [ + *kerrigan_tier_7, item_names.KERRIGAN_ASSIMILATION_AURA, item_names.KERRIGAN_IMMOBILIZATION_WAVE +] +item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATES] = kerrigan_non_ulimates = [ + item for item in kerrigan_abilities if item not in kerrigan_ultimates +] +item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ULTIMATES] = kerrigan_logic_ultimates = [ + item for item in kerrigan_ultimates if item != item_names.KERRIGAN_ASSIMILATION_AURA +] +item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES] = kerrigan_non_ulimate_active_abilities = [ + item for item in kerrigan_non_ulimates if item in kerrigan_active_abilities +] +item_name_groups[ItemGroupNames.KERRIGAN_HOTS_ABILITIES] = kerrigan_hots_abilities = [ + ability for tiers in [ + kerrigan_tier_1, kerrigan_tier_2, kerrigan_tier_4, kerrigan_tier_6, kerrigan_tier_7 + ] for ability in tiers +] + +item_name_groups[ItemGroupNames.OVERLORD_UPGRADES] = [ + item_names.OVERLORD_ANTENNAE, + item_names.OVERLORD_VENTRAL_SACS, + item_names.OVERLORD_GENERATE_CREEP, + item_names.OVERLORD_PNEUMATIZED_CARAPACE, + item_names.OVERLORD_IMPROVED_OVERLORDS, + item_names.OVERLORD_OVERSEER_ASPECT, +] + +# Zerg Upgrades +item_name_groups[ItemGroupNames.HOTS_STRAINS] = hots_strains = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Strain +] +item_name_groups[ItemGroupNames.HOTS_MUTATIONS] = hots_mutations = [ + item_names.ZERGLING_HARDENED_CARAPACE, item_names.ZERGLING_ADRENAL_OVERLOAD, item_names.ZERGLING_METABOLIC_BOOST, + item_names.BANELING_CORROSIVE_ACID, item_names.BANELING_RUPTURE, item_names.BANELING_REGENERATIVE_ACID, + item_names.ROACH_HYDRIODIC_BILE, item_names.ROACH_ADAPTIVE_PLATING, item_names.ROACH_TUNNELING_CLAWS, + item_names.HYDRALISK_FRENZY, item_names.HYDRALISK_ANCILLARY_CARAPACE, item_names.HYDRALISK_GROOVED_SPINES, + item_names.SWARM_HOST_BURROW, item_names.SWARM_HOST_RAPID_INCUBATION, item_names.SWARM_HOST_PRESSURIZED_GLANDS, + item_names.MUTALISK_VICIOUS_GLAIVE, item_names.MUTALISK_RAPID_REGENERATION, item_names.MUTALISK_SUNDERING_GLAIVE, + item_names.ULTRALISK_BURROW_CHARGE, item_names.ULTRALISK_TISSUE_ASSIMILATION, item_names.ULTRALISK_MONARCH_BLADES, +] +item_name_groups[ItemGroupNames.HOTS_GLOBAL_UPGRADES] = hots_global_upgrades = [ + item_names.ZERGLING_RECONSTITUTION, + item_names.OVERLORD_IMPROVED_OVERLORDS, + item_names.AUTOMATED_EXTRACTORS, + item_names.TWIN_DRONES, + item_names.MALIGNANT_CREEP, + item_names.VESPENE_EFFICIENCY, +] +item_name_groups[ItemGroupNames.HOTS_ITEMS] = vanilla_hots_items = ( + hots_units + + hots_buildings + + kerrigan_hots_abilities + + hots_mutations + + hots_strains + + hots_global_upgrades + + zerg_generic_upgrades +) + +# Zerg - Infested Terran (Stukov Co-op) +item_name_groups[ItemGroupNames.INF_TERRAN_UNITS] = infterr_units = [ + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.BULLFROG, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_LIBERATOR, + item_names.INFESTED_BANSHEE, +] +item_name_groups[ItemGroupNames.INF_TERRAN_UPGRADES] = infterr_upgrades = [ + item_names.INFESTED_SCV_BUILD_CHARGES, + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS, + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION, + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR, + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING, + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS, + item_names.BULLFROG_WILD_MUTATION, + item_names.BULLFROG_BROODLINGS, + item_names.BULLFROG_HARD_IMPACT, + item_names.BULLFROG_RANGE, + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS, + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW, + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE, + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES, + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES, + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS, + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL, + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS, + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR, + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL, + item_names.INFESTED_LIBERATOR_DEFENDER_MODE, + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION, + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS, + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD, + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS, +] +item_name_groups[ItemGroupNames.INF_TERRAN_ITEMS] = ( + infterr_units + + infterr_upgrades + + [item_names.INFESTED_MISSILE_TURRET] +) + +# Protoss +item_name_groups[ItemGroupNames.PROTOSS_ITEMS] = protoss_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.PROTOSS +] +item_name_groups[ItemGroupNames.PROTOSS_UNITS] = protoss_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.ProtossItemType.Unit, item_tables.ProtossItemType.Unit_2) +] +protoss_ground_wa = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT, + item_names.SENTRY, item_names.ENERGIZER, + item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER, item_names.DRAGOON, item_names.ADEPT, + item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.BLOOD_HUNTER, item_names.AVENGER, + item_names.DARK_ARCHON, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART, + item_names.COLOSSUS, item_names.WRATHWALKER, + item_names.REAVER, +] +protoss_air_wa = [ + item_names.WARP_PRISM_PHASE_BLASTER, + item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.SKIRMISHER, + item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER, + item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, + item_names.SCOUT, item_names.TEMPEST, item_names.MOTHERSHIP, + item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR, + item_names.CALADRIUS, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.PROTOSS_GENERIC_UPGRADES] = protoss_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ProtossItemType.Upgrade +] +item_name_groups[ItemGroupNames.LOTV_UNITS] = lotv_units = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, + item_names.STALKER, item_names.DRAGOON, item_names.ADEPT, + item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER, + item_names.HIGH_TEMPLAR, item_names.DARK_ARCHON, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, + item_names.COLOSSUS, item_names.WRATHWALKER, item_names.REAVER, + item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, + item_names.VOID_RAY, item_names.DESTROYER, item_names.ARBITER, + item_names.CARRIER, item_names.TEMPEST, item_names.MOTHERSHIP, +] +item_name_groups[ItemGroupNames.PROPHECY_UNITS] = prophecy_units = [ + item_names.ZEALOT, item_names.STALKER, item_names.HIGH_TEMPLAR, item_names.DARK_TEMPLAR, + item_names.OBSERVER, item_names.COLOSSUS, + item_names.PHOENIX, item_names.VOID_RAY, item_names.CARRIER, +] +item_name_groups[ItemGroupNames.PROPHECY_BUILDINGS] = prophecy_buildings = [ + item_names.PHOTON_CANNON, +] +item_name_groups[ItemGroupNames.GATEWAY_UNITS] = gateway_units = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT, + item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER, + item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER, + item_names.DRAGOON, item_names.ADEPT, item_names.DARK_ARCHON, + item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER, +] +item_name_groups[ItemGroupNames.ROBO_UNITS] = robo_units = [ + item_names.WARP_PRISM, item_names.OBSERVER, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART, + item_names.COLOSSUS, item_names.WRATHWALKER, + item_names.REAVER, item_names.DISRUPTOR, +] +item_name_groups[ItemGroupNames.STARGATE_UNITS] = stargate_units = [ + item_names.PHOENIX, item_names.SKIRMISHER, item_names.MIRAGE, item_names.CORSAIR, + item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER, + item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, + item_names.TEMPEST, item_names.SCOUT, item_names.MOTHERSHIP, + item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR, + item_names.CALADRIUS, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.PROTOSS_BUILDINGS] = protoss_buildings = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ProtossItemType.Building +] +item_name_groups[ItemGroupNames.AIUR_UNITS] = [ + item_names.ZEALOT, item_names.DRAGOON, item_names.SENTRY, item_names.AVENGER, item_names.HIGH_TEMPLAR, + item_names.IMMORTAL, item_names.REAVER, + item_names.PHOENIX, item_names.SCOUT, item_names.ARBITER, item_names.CARRIER, +] +item_name_groups[ItemGroupNames.NERAZIM_UNITS] = [ + item_names.CENTURION, item_names.STALKER, item_names.DARK_TEMPLAR, item_names.SIGNIFIER, item_names.DARK_ARCHON, + item_names.ANNIHILATOR, + item_names.CORSAIR, item_names.ORACLE, item_names.VOID_RAY, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.TAL_DARIM_UNITS] = [ + item_names.SUPPLICANT, item_names.SLAYER, item_names.HAVOC, item_names.BLOOD_HUNTER, item_names.ASCENDANT, + item_names.VANGUARD, item_names.WRATHWALKER, + item_names.SKIRMISHER, item_names.DESTROYER, item_names.SKYLORD, item_names.MOTHERSHIP, item_names.OPPRESSOR, +] +item_name_groups[ItemGroupNames.PURIFIER_UNITS] = [ + item_names.SENTINEL, item_names.ADEPT, item_names.INSTIGATOR, item_names.ENERGIZER, + item_names.STALWART, item_names.COLOSSUS, item_names.DISRUPTOR, + item_names.MIRAGE, item_names.DAWNBRINGER, item_names.TRIREME, item_names.TEMPEST, + item_names.CALADRIUS, +] +item_name_groups[ItemGroupNames.SOA_ITEMS] = soa_items = [ + *[item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Spear_Of_Adun], + item_names.SOA_PROGRESSIVE_PROXY_PYLON, +] +lotv_soa_items = [item_name for item_name in soa_items if item_name != item_names.SOA_PYLON_OVERCHARGE] +item_name_groups[ItemGroupNames.PROTOSS_GLOBAL_UPGRADES] = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Solarite_Core +] +item_name_groups[ItemGroupNames.LOTV_GLOBAL_UPGRADES] = lotv_global_upgrades = [ + item_names.NEXUS_OVERCHARGE, + item_names.ORBITAL_ASSIMILATORS, + item_names.WARP_HARMONIZATION, + item_names.MATRIX_OVERLOAD, + item_names.GUARDIAN_SHELL, + item_names.RECONSTRUCTION_BEAM, +] +item_name_groups[ItemGroupNames.WAR_COUNCIL] = war_council_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.ProtossItemType.War_Council, item_tables.ProtossItemType.War_Council_2) +] + +lotv_war_council_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if ( + item_name in war_council_upgrades + and item_data.parent in item_name_groups[ItemGroupNames.LOTV_UNITS] + # Destroyers get a custom (non-vanilla) buff, not a nerf over their vanilla council state + and item_name != item_names.DESTROYER_REFORGED_BLOODSHARD_CORE + ) +] +item_name_groups[ItemGroupNames.LOTV_ITEMS] = vanilla_lotv_items = ( + lotv_units + + protoss_buildings + + lotv_soa_items + + lotv_global_upgrades + + protoss_generic_upgrades + + lotv_war_council_upgrades +) + +item_name_groups[ItemGroupNames.VANILLA_ITEMS] = vanilla_items = ( + vanilla_wol_items + vanilla_hots_items + vanilla_lotv_items +) + +item_name_groups[ItemGroupNames.OVERPOWERED_ITEMS] = overpowered_items = [ + # Terran general + item_names.SIEGE_TANK_GRADUATING_RANGE, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + item_names.BATTLECRUISER_ATX_LASER_BATTERY, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, + item_names.MECHANICAL_KNOW_HOW, + item_names.MERCENARY_MUNITIONS, + + # Terran Mind Control + item_names.HIVE_MIND_EMULATOR, + item_names.PSI_INDOCTRINATOR, + item_names.ARGUS_AMPLIFIER, + + # Zerg Mind Control + item_names.INFESTOR, + + # Protoss Mind Control + item_names.DARK_ARCHON_INDOMITABLE_WILL, + + # Nova + item_names.NOVA_PLASMA_RIFLE, + + # Kerrigan + item_names.KERRIGAN_APOCALYPSE, + item_names.KERRIGAN_DROP_PODS, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + item_names.KERRIGAN_IMMOBILIZATION_WAVE, + + # SOA + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_DEPLOY_FENIX, + # Note: This is more an issue of having multiple ults at the same time, rather than solar bombardment in particular. + # Can be removed from the list if we get an SOA ult combined cooldown or energy cost on it. + item_names.SOA_SOLAR_BOMBARDMENT, + + # Protoss general + item_names.QUATRO, + item_names.MOTHERSHIP_INTEGRATED_POWER, + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, + + # Mindless Broodwar garbage + item_names.GHOST_BARGAIN_BIN_PRICES, + item_names.SPECTRE_BARGAIN_BIN_PRICES, + item_names.REAVER_BARGAIN_BIN_PRICES, + item_names.SCOUT_SUPPLY_EFFICIENCY, +] + +# Items not aimed to be officially released +# These need further balancing, and they shouldn't generate normally unless explicitly locked +# Added here to not confuse the client +item_name_groups[ItemGroupNames.UNRELEASED_ITEMS] = unreleased_items = [ + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.SKY_FURY, + item_names.SHOCK_DIVISION, + item_names.BLACKHAMMER, + item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, + item_names.SON_OF_KORHAL, + item_names.BULWARK_COMPANY, + item_names.FIELD_RESPONSE_THETA, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_HAWK, + item_names.NIGHT_WOLF, + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES, +] + +# A place for traits that were released before but are to be taken down by default. +# If an item gets split to multiple ones, the original one should be set deprecated instead (see Orbital Command for an example). +# This is a place if you want to nerf or disable by default a previously released trait. +# Currently, it disables only the topmost level of the progressives. +# Don't place here anything that's present in the vanilla campaigns (if it's overpowered, use overpowered items instead) +item_name_groups[ItemGroupNames.LEGACY_ITEMS] = legacy_items = [ + item_names.ASCENDANT_ARCHON_MERGE, +] + +item_name_groups[ItemGroupNames.KEYS] = keys = [ + item_name for item_name in key_item_table.keys() +] diff --git a/worlds/sc2/item/item_names.py b/worlds/sc2/item/item_names.py new file mode 100644 index 00000000..2fbd64bd --- /dev/null +++ b/worlds/sc2/item/item_names.py @@ -0,0 +1,957 @@ +""" +A complete collection of Starcraft 2 item names as strings. +Users of this data may make some assumptions about the structure of a name: +* The upgrade for a unit will end with the unit's name in parentheses +* Weapon / armor upgrades may be grouped by a common prefix specified within this file +""" + +# Terran Units +MARINE = "Marine" +MEDIC = "Medic" +FIREBAT = "Firebat" +MARAUDER = "Marauder" +REAPER = "Reaper" +HELLION = "Hellion" +VULTURE = "Vulture" +GOLIATH = "Goliath" +DIAMONDBACK = "Diamondback" +SIEGE_TANK = "Siege Tank" +MEDIVAC = "Medivac" +WRAITH = "Wraith" +VIKING = "Viking" +BANSHEE = "Banshee" +BATTLECRUISER = "Battlecruiser" +GHOST = "Ghost" +SPECTRE = "Spectre" +THOR = "Thor" +RAVEN = "Raven" +SCIENCE_VESSEL = "Science Vessel" +PREDATOR = "Predator" +HERCULES = "Hercules" +# Extended units +LIBERATOR = "Liberator" +VALKYRIE = "Valkyrie" +WIDOW_MINE = "Widow Mine" +CYCLONE = "Cyclone" +HERC = "HERC" +WARHOUND = "Warhound" +DOMINION_TROOPER = "Dominion Trooper" +# Elites +PRIDE_OF_AUGUSTRGRAD = "Pride of Augustgrad" +SKY_FURY = "Sky Fury" +SHOCK_DIVISION = "Shock Division" +BLACKHAMMER = "Blackhammer" +AEGIS_GUARD = "Aegis Guard" +EMPERORS_SHADOW = "Emperor's Shadow" +SON_OF_KORHAL = "Son of Korhal" +BULWARK_COMPANY = "Bulwark Company" +FIELD_RESPONSE_THETA = "Field Response Theta" +EMPERORS_GUARDIAN = "Emperor's Guardian" +NIGHT_HAWK = "Night Hawk" +NIGHT_WOLF = "Night Wolf" + +# Terran Buildings +BUNKER = "Bunker" +MISSILE_TURRET = "Missile Turret" +SENSOR_TOWER = "Sensor Tower" +PLANETARY_FORTRESS = "Planetary Fortress" +PERDITION_TURRET = "Perdition Turret" +# HIVE_MIND_EMULATOR = "Hive Mind Emulator"# moved to Lab / Global upgrades +# PSI_DISRUPTER = "Psi Disrupter" # moved to Lab / Global upgrades +DEVASTATOR_TURRET = "Devastator Turret" + +# Terran Weapon / Armor Upgrades +TERRAN_UPGRADE_PREFIX = "Progressive Terran" +TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry" +TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle" +TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship" + +PROGRESSIVE_TERRAN_INFANTRY_WEAPON = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_INFANTRY_ARMOR = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_VEHICLE_WEAPON = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_VEHICLE_ARMOR = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_SHIP_WEAPON = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_SHIP_ARMOR = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_WEAPON_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_TERRAN_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_TERRAN_INFANTRY_UPGRADE = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_VEHICLE_UPGRADE = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_SHIP_UPGRADE = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Mercenaries +WAR_PIGS = "War Pigs" +DEVIL_DOGS = "Devil Dogs" +HAMMER_SECURITIES = "Hammer Securities" +SPARTAN_COMPANY = "Spartan Company" +SIEGE_BREAKERS = "Siege Breakers" +HELS_ANGELS = "Hel's Angels" +DUSK_WINGS = "Dusk Wings" +JACKSONS_REVENGE = "Jackson's Revenge" +SKIBIS_ANGELS = "Skibi's Angels" +DEATH_HEADS = "Death Heads" +WINGED_NIGHTMARES = "Winged Nightmares" +MIDNIGHT_RIDERS = "Midnight Riders" +BRYNHILDS = "Brynhilds" +JOTUN = "Jotun" + +# Lab / Global +ULTRA_CAPACITORS = "Ultra-Capacitors (Terran)" +VANADIUM_PLATING = "Vanadium Plating (Terran)" +ORBITAL_DEPOTS = "Orbital Depots (Terran)" +MICRO_FILTERING = "Micro-Filtering (Terran)" +AUTOMATED_REFINERY = "Automated Refinery (Terran)" +COMMAND_CENTER_COMMAND_CENTER_REACTOR = "Command Center Reactor (Command Center)" +COMMAND_CENTER_SCANNER_SWEEP = "Scanner Sweep (Command Center)" +COMMAND_CENTER_MULE = "MULE (Command Center)" +COMMAND_CENTER_EXTRA_SUPPLIES = "Extra Supplies (Command Center)" +TECH_REACTOR = "Tech Reactor (Terran)" +ORBITAL_STRIKE = "Orbital Strike (Barracks)" +CELLULAR_REACTOR = "Cellular Reactor (Terran)" +PROGRESSIVE_REGENERATIVE_BIO_STEEL = "Progressive Regenerative Bio-Steel (Terran)" +PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System (Terran)" +STRUCTURE_ARMOR = "Structure Armor (Terran)" +HI_SEC_AUTO_TRACKING = "Hi-Sec Auto Tracking (Terran)" +ADVANCED_OPTICS = "Advanced Optics (Terran)" +ROGUE_FORCES = "Rogue Forces (Terran)" +MECHANICAL_KNOW_HOW = "Mechanical Know-how (Terran)" +MERCENARY_MUNITIONS = "Mercenary Munitions (Terran)" +PROGRESSIVE_FAST_DELIVERY = "Progressive Fast Delivery (Terran)" +RAPID_REINFORCEMENT = "Rapid Reinforcement (Terran)" +FUSION_CORE_FUSION_REACTOR = "Fusion Reactor (Fusion Core)" +PSI_DISRUPTER = "Psi Disrupter" +PSI_SCREEN = "Psi Screen (Psi Disrupter)" +SONIC_DISRUPTER = "Sonic Disrupter (Psi Disrupter)" +HIVE_MIND_EMULATOR = "Hive Mind Emulator" +PSI_INDOCTRINATOR = "Psi Indoctrinator (Hive Mind Emulator)" +ARGUS_AMPLIFIER = "Argus Amplifier (Hive Mind Emulator)" +SIGNAL_BEACON = "Signal Beacon (Terran)" + +# Terran Unit Upgrades +BANSHEE_HYPERFLIGHT_ROTORS = "Hyperflight Rotors (Banshee)" +BANSHEE_INTERNAL_TECH_MODULE = "Internal Tech Module (Banshee)" +BANSHEE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Banshee)" +BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS = "Progressive Cross-Spectrum Dampeners (Banshee)" +BANSHEE_SHOCKWAVE_MISSILE_BATTERY = "Shockwave Missile Battery (Banshee)" +BANSHEE_SHAPED_HULL = "Shaped Hull (Banshee)" +BANSHEE_ADVANCED_TARGETING_OPTICS = "Advanced Targeting Optics (Banshee)" +BANSHEE_DISTORTION_BLASTERS = "Distortion Blasters (Banshee)" +BANSHEE_ROCKET_BARRAGE = "Rocket Barrage (Banshee)" +BATTLECRUISER_ATX_LASER_BATTERY = "ATX Laser Battery (Battlecruiser)" +BATTLECRUISER_CLOAK = "Cloak (Battlecruiser)" +BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX = "Progressive Defensive Matrix (Battlecruiser)" +BATTLECRUISER_INTERNAL_TECH_MODULE = "Internal Tech Module (Battlecruiser)" +BATTLECRUISER_PROGRESSIVE_MISSILE_PODS = "Progressive Missile Pods (Battlecruiser)" +BATTLECRUISER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Battlecruiser)" +BATTLECRUISER_TACTICAL_JUMP = "Tactical Jump (Battlecruiser)" +BATTLECRUISER_BEHEMOTH_PLATING = "Behemoth Plating (Battlecruiser)" +BATTLECRUISER_MOIRAI_IMPULSE_DRIVE = "Moirai Impulse Drive (Battlecruiser)" +BATTLECRUISER_BEHEMOTH_REACTOR = "Behemoth Reactor (Battlecruiser)" +BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM = "Field-Assist Target System (Battlecruiser)" +CYCLONE_MAG_FIELD_ACCELERATORS = "Mag-Field Accelerators (Cyclone)" +CYCLONE_MAG_FIELD_LAUNCHERS = "Mag-Field Launchers (Cyclone)" +CYCLONE_RAPID_FIRE_LAUNCHERS = "Rapid Fire Launchers (Cyclone)" +CYCLONE_TARGETING_OPTICS = "Targeting Optics (Cyclone)" +CYCLONE_RESOURCE_EFFICIENCY = "Resource Efficiency (Cyclone)" +CYCLONE_INTERNAL_TECH_MODULE = "Internal Tech Module (Cyclone)" +DIAMONDBACK_BURST_CAPACITORS = "Burst Capacitors (Diamondback)" +DIAMONDBACK_HYPERFLUXOR = "Hyperfluxor (Diamondback)" +DIAMONDBACK_RESOURCE_EFFICIENCY = "Resource Efficiency (Diamondback)" +DIAMONDBACK_SHAPED_HULL = "Shaped Hull (Diamondback)" +DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL = "Progressive Tri-Lithium Power Cell (Diamondback)" +DIAMONDBACK_MAGLEV_PROPULSION = "Maglev Propulsion (Diamondback)" +DOMINION_TROOPER_B2_HIGH_CAL_LMG = "B-2 High-Cal LMG (Dominion Trooper)" +DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER = "CPO-7 Salamander Flamethrower (Dominion Trooper)" +DOMINION_TROOPER_HAILSTORM_LAUNCHER = "Hailstorm Launcher (Dominion Trooper)" +DOMINION_TROOPER_ADVANCED_ALLOYS = "Advanced Alloys (Dominion Trooper)" +DOMINION_TROOPER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Dominion Trooper)" +EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES = "Sovereign Tactical Missiles (Emperor's Shadow)" +FIREBAT_INCINERATOR_GAUNTLETS = "Incinerator Gauntlets (Firebat)" +FIREBAT_JUGGERNAUT_PLATING = "Juggernaut Plating (Firebat)" +FIREBAT_RESOURCE_EFFICIENCY = "Resource Efficiency (Firebat)" +FIREBAT_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Firebat)" +FIREBAT_INFERNAL_PRE_IGNITER = "Infernal Pre-Igniter (Firebat)" +FIREBAT_KINETIC_FOAM = "Kinetic Foam (Firebat)" +FIREBAT_NANO_PROJECTORS = "Nano Projectors (Firebat)" +GHOST_CRIUS_SUIT = "Crius Suit (Ghost)" +GHOST_EMP_ROUNDS = "EMP Rounds (Ghost)" +GHOST_LOCKDOWN = "Lockdown (Ghost)" +GHOST_OCULAR_IMPLANTS = "Ocular Implants (Ghost)" +GHOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Ghost)" +GHOST_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Ghost)" +GOLIATH_ARES_CLASS_TARGETING_SYSTEM = "Ares-Class Targeting System (Goliath)" +GOLIATH_JUMP_JETS = "Jump Jets (Goliath)" +GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM = "Multi-Lock Weapons System (Goliath)" +GOLIATH_OPTIMIZED_LOGISTICS = "Optimized Logistics (Goliath)" +GOLIATH_SHAPED_HULL = "Shaped Hull (Goliath)" +GOLIATH_RESOURCE_EFFICIENCY = "Resource Efficiency (Goliath)" +GOLIATH_INTERNAL_TECH_MODULE = "Internal Tech Module (Goliath)" +HELLION_HELLBAT = "Hellbat (Hellion Morph)" +HELLION_JUMP_JETS = "Jump Jets (Hellion)" +HELLION_OPTIMIZED_LOGISTICS = "Optimized Logistics (Hellion)" +HELLION_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Hellion)" +HELLION_SMART_SERVOS = "Smart Servos (Hellion)" +HELLION_THERMITE_FILAMENTS = "Thermite Filaments (Hellion)" +HELLION_TWIN_LINKED_FLAMETHROWER = "Twin-Linked Flamethrower (Hellion)" +HELLION_INFERNAL_PLATING = "Infernal Plating (Hellion)" +HERC_JUGGERNAUT_PLATING = "Juggernaut Plating (HERC)" +HERC_KINETIC_FOAM = "Kinetic Foam (HERC)" +HERC_RESOURCE_EFFICIENCY = "Resource Efficiency (HERC)" +HERC_GRAPPLE_PULL = "Grapple Pull (HERC)" +HERCULES_INTERNAL_FUSION_MODULE = "Internal Fusion Module (Hercules)" +HERCULES_TACTICAL_JUMP = "Tactical Jump (Hercules)" +LIBERATOR_ADVANCED_BALLISTICS = "Advanced Ballistics (Liberator)" +LIBERATOR_CLOAK = "Cloak (Liberator)" +LIBERATOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Liberator)" +LIBERATOR_OPTIMIZED_LOGISTICS = "Optimized Logistics (Liberator)" +LIBERATOR_RAID_ARTILLERY = "Raid Artillery (Liberator)" +LIBERATOR_SMART_SERVOS = "Smart Servos (Liberator)" +LIBERATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Liberator)" +LIBERATOR_GUERILLA_MISSILES = "Guerilla Missiles (Liberator)" +LIBERATOR_UED_MISSILE_TECHNOLOGY = "UED Missile Technology (Liberator)" +MARAUDER_CONCUSSIVE_SHELLS = "Concussive Shells (Marauder)" +MARAUDER_INTERNAL_TECH_MODULE = "Internal Tech Module (Marauder)" +MARAUDER_KINETIC_FOAM = "Kinetic Foam (Marauder)" +MARAUDER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marauder)" +MARAUDER_MAGRAIL_MUNITIONS = "Magrail Munitions (Marauder)" +MARAUDER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marauder)" +MARAUDER_JUGGERNAUT_PLATING = "Juggernaut Plating (Marauder)" +MARINE_COMBAT_SHIELD = "Combat Shield (Marine)" +MARINE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marine)" +MARINE_MAGRAIL_MUNITIONS = "Magrail Munitions (Marine)" +MARINE_OPTIMIZED_LOGISTICS = "Optimized Logistics (Marine)" +MARINE_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marine)" +MEDIC_ADVANCED_MEDIC_FACILITIES = "Advanced Medic Facilities (Medic)" +MEDIC_OPTICAL_FLARE = "Optical Flare (Medic)" +MEDIC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medic)" +MEDIC_RESTORATION = "Restoration (Medic)" +MEDIC_STABILIZER_MEDPACKS = "Stabilizer Medpacks (Medic)" +MEDIC_ADAPTIVE_MEDPACKS = "Adaptive Medpacks (Medic)" +MEDIC_NANO_PROJECTOR = "Nano Projector (Medic)" +MEDIVAC_ADVANCED_HEALING_AI = "Advanced Healing AI (Medivac)" +MEDIVAC_AFTERBURNERS = "Afterburners (Medivac)" +MEDIVAC_EXPANDED_HULL = "Expanded Hull (Medivac)" +MEDIVAC_RAPID_DEPLOYMENT_TUBE = "Rapid Deployment Tube (Medivac)" +MEDIVAC_SCATTER_VEIL = "Scatter Veil (Medivac)" +MEDIVAC_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Medivac)" +MEDIVAC_RAPID_REIGNITION_SYSTEMS = "Rapid Reignition Systems (Medivac)" +MEDIVAC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medivac)" +PREDATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Predator)" +PREDATOR_CLOAK = "Phase Cloak (Predator)" +PREDATOR_CHARGE = "Concussive Charge (Predator)" +PREDATOR_VESPENE_SYNTHESIS = "Vespene Synthesis (Predator)" +PREDATOR_ADAPTIVE_DEFENSES = "Adaptive Defenses (Predator)" +RAVEN_ANTI_ARMOR_MISSILE = "Anti-Armor Missile (Raven)" +RAVEN_BIO_MECHANICAL_REPAIR_DRONE = "Bio Mechanical Repair Drone (Raven)" +RAVEN_HUNTER_SEEKER_WEAPON = "Hunter-Seeker Weapon (Raven)" +RAVEN_INTERFERENCE_MATRIX = "Interference Matrix (Raven)" +RAVEN_INTERNAL_TECH_MODULE = "Internal Tech Module (Raven)" +RAVEN_RAILGUN_TURRET = "Railgun Turret (Raven)" +RAVEN_SPIDER_MINES = "Spider Mines (Raven)" +RAVEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Raven)" +RAVEN_DURABLE_MATERIALS = "Durable Materials (Raven)" +REAPER_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Reaper)" +REAPER_COMBAT_DRUGS = "Combat Drugs (Reaper)" +REAPER_G4_CLUSTERBOMB = "G-4 Clusterbomb (Reaper)" +REAPER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Reaper)" +REAPER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Reaper)" +REAPER_SPIDER_MINES = "Spider Mines (Reaper)" +REAPER_U238_ROUNDS = "U-238 Rounds (Reaper)" +REAPER_JET_PACK_OVERDRIVE = "Jet Pack Overdrive (Reaper)" +REAPER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaper)" +REAPER_BALLISTIC_FLIGHTSUIT = "Ballistic Flightsuit (Reaper)" +SCIENCE_VESSEL_DEFENSIVE_MATRIX = "Defensive Matrix (Science Vessel)" +SCIENCE_VESSEL_EMP_SHOCKWAVE = "EMP Shockwave (Science Vessel)" +SCIENCE_VESSEL_IMPROVED_NANO_REPAIR = "Improved Nano-Repair (Science Vessel)" +SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS = "Magellan Computation Systems (Science Vessel)" +SCIENCE_VESSEL_TACTICAL_JUMP = "Tactical Jump (Science Vessel)" +SCV_ADVANCED_CONSTRUCTION = "Advanced Construction (SCV)" +SCV_DUAL_FUSION_WELDERS = "Dual-Fusion Welders (SCV)" +SCV_HOSTILE_ENVIRONMENT_ADAPTATION = "Hostile Environment Adaptation (SCV)" +SCV_CONSTRUCTION_JUMP_JETS = "Construction Jump Jets (SCV)" +SIEGE_TANK_ADVANCED_SIEGE_TECH = "Advanced Siege Tech (Siege Tank)" +SIEGE_TANK_GRADUATING_RANGE = "Graduating Range (Siege Tank)" +SIEGE_TANK_INTERNAL_TECH_MODULE = "Internal Tech Module (Siege Tank)" +SIEGE_TANK_JUMP_JETS = "Jump Jets (Siege Tank)" +SIEGE_TANK_LASER_TARGETING_SYSTEM = "Laser Targeting System (Siege Tank)" +SIEGE_TANK_MAELSTROM_ROUNDS = "Maelstrom Rounds (Siege Tank)" +SIEGE_TANK_SHAPED_BLAST = "Shaped Blast (Siege Tank)" +SIEGE_TANK_SMART_SERVOS = "Smart Servos (Siege Tank)" +SIEGE_TANK_SPIDER_MINES = "Spider Mines (Siege Tank)" +SIEGE_TANK_SHAPED_HULL = "Shaped Hull (Siege Tank)" +SIEGE_TANK_RESOURCE_EFFICIENCY = "Resource Efficiency (Siege Tank)" +SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK = "Progressive Transport Hook (Siege Tank)" +SIEGE_TANK_ALLTERRAIN_TREADS = "All-Terrain Treads (Siege Tank)" +SPECTRE_IMPALER_ROUNDS = "Impaler Rounds (Spectre)" +SPECTRE_NYX_CLASS_CLOAKING_MODULE = "Nyx-Class Cloaking Module (Spectre)" +SPECTRE_PSIONIC_LASH = "Psionic Lash (Spectre)" +SPECTRE_RESOURCE_EFFICIENCY = "Resource Efficiency (Spectre)" +SPECTRE_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Spectre)" +SPIDER_MINE_CERBERUS_MINE = "Cerberus Mine (Spider Mine)" +SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION = "High Explosive Munition (Spider Mine)" +THOR_330MM_BARRAGE_CANNON = "330mm Barrage Cannon (Thor)" +THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL = "Progressive Immortality Protocol (Thor)" +THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD = "Progressive High Impact Payload (Thor)" +THOR_BUTTON_WITH_A_SKULL_ON_IT = "Button With a Skull on It (Thor)" +THOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Thor)" +THOR_LARGE_SCALE_FIELD_CONSTRUCTION = "Large Scale Field Construction (Thor)" +THOR_RAPID_RELOAD = "Rapid Reload (Thor)" +VALKYRIE_AFTERBURNERS = "Afterburners (Valkyrie)" +VALKYRIE_FLECHETTE_MISSILES = "Flechette Missiles (Valkyrie)" +VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS = "Enhanced Cluster Launchers (Valkyrie)" +VALKYRIE_SHAPED_HULL = "Shaped Hull (Valkyrie)" +VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR = "Launching Vector Compensator (Valkyrie)" +VALKYRIE_RESOURCE_EFFICIENCY = "Resource Efficiency (Valkyrie)" +VIKING_ANTI_MECHANICAL_MUNITION = "Anti-Mechanical Munition (Viking)" +VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM = "Phobos-Class Weapons System (Viking)" +VIKING_RIPWAVE_MISSILES = "Ripwave Missiles (Viking)" +VIKING_SMART_SERVOS = "Smart Servos (Viking)" +VIKING_SHREDDER_ROUNDS = "Shredder Rounds (Viking)" +VIKING_WILD_MISSILES = "W.I.L.D. Missiles (Viking)" +VIKING_AESIR_TURBINES = "Aesir Turbines (Viking)" +VULTURE_AUTO_LAUNCHERS = "Auto Launchers (Vulture)" +VULTURE_ION_THRUSTERS = "Ion Thrusters (Vulture)" +VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE = "Progressive Replenishable Magazine (Vulture)" +VULTURE_JERRYRIGGED_PATCHUP = "Jerry-Rigged Patchup (Vulture)" +WARHOUND_RESOURCE_EFFICIENCY = "Resource Efficiency (Warhound)" +WARHOUND_AXIOM_PLATING = "Axiom Plating (Warhound)" +WARHOUND_DEPLOY_TURRET = "Deploy Turret (Warhound)" +WIDOW_MINE_BLACK_MARKET_LAUNCHERS = "Black Market Launchers (Widow Mine)" +WIDOW_MINE_CONCEALMENT = "Concealment (Widow Mine)" +WIDOW_MINE_DEMOLITION_PAYLOAD = "Demolition Payload (Widow Mine)" +WIDOW_MINE_DRILLING_CLAWS = "Drilling Claws (Widow Mine)" +WIDOW_MINE_EXECUTIONER_MISSILES = "Executioner Missiles (Widow Mine)" +WIDOW_MINE_RESOURCE_EFFICIENCY = "Resource Efficiency (Widow Mine)" +WRAITH_ADVANCED_LASER_TECHNOLOGY = "Advanced Laser Technology (Wraith)" +WRAITH_DISPLACEMENT_FIELD = "Displacement Field (Wraith)" +WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS = "Progressive Tomahawk Power Cells (Wraith)" +WRAITH_TRIGGER_OVERRIDE = "Trigger Override (Wraith)" +WRAITH_INTERNAL_TECH_MODULE = "Internal Tech Module (Wraith)" +WRAITH_RESOURCE_EFFICIENCY = "Resource Efficiency (Wraith)" + +# Terran Building upgrades +BUNKER_NEOSTEEL_BUNKER = "Neosteel Bunker (Bunker)" +BUNKER_PROJECTILE_ACCELERATOR = "Projectile Accelerator (Bunker)" +BUNKER_SHRIKE_TURRET = "Shrike Turret (Bunker)" +BUNKER_FORTIFIED_BUNKER = "Fortified Bunker (Bunker)" +DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS = "Anti-Armor Munitions (Devastator Turret)" +DEVASTATOR_TURRET_CONCUSSIVE_GRENADES = "Concussive Grenades (Devastator Turret)" +DEVASTATOR_TURRET_RESOURCE_EFFICIENCY = "Resource Efficiency (Devastator Turret)" +MISSILE_TURRET_HELLSTORM_BATTERIES = "Hellstorm Batteries (Missile Turret)" +MISSILE_TURRET_TITANIUM_HOUSING = "Titanium Housing (Missile Turret)" +MISSILE_TURRET_RESOURCE_EFFICENCY = "Resource Efficiency (Missile Turret)" +PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)" +PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS = "Ibiks Tracking Scanners (Planetary Fortress)" +PLANETARY_FORTRESS_ORBITAL_MODULE = "Orbital Module (Planetary Fortress)" +SENSOR_TOWER_ASSISTIVE_TARGETING = "Assistive Targeting (Sensor Tower)" +SENSOR_TOWER_MUILTISPECTRUM_DOPPLER = "Multispectrum Doppler (Sensor Tower)" + +# Nova +NOVA_GHOST_VISOR = "Ghost Visor (Nova Equipment)" +NOVA_RANGEFINDER_OCULUS = "Rangefinder Oculus (Nova Equipment)" +NOVA_DOMINATION = "Domination (Nova Ability)" +NOVA_BLINK = "Blink (Nova Ability)" +NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE = "Progressive Stealth Suit Module (Nova Suit Module)" +NOVA_ENERGY_SUIT_MODULE = "Energy Suit Module (Nova Suit Module)" +NOVA_ARMORED_SUIT_MODULE = "Armored Suit Module (Nova Suit Module)" +NOVA_JUMP_SUIT_MODULE = "Jump Suit Module (Nova Suit Module)" +NOVA_C20A_CANISTER_RIFLE = "C20A Canister Rifle (Nova Weapon)" +NOVA_HELLFIRE_SHOTGUN = "Hellfire Shotgun (Nova Weapon)" +NOVA_PLASMA_RIFLE = "Plasma Rifle (Nova Weapon)" +NOVA_MONOMOLECULAR_BLADE = "Monomolecular Blade (Nova Weapon)" +NOVA_BLAZEFIRE_GUNBLADE = "Blazefire Gunblade (Nova Weapon)" +NOVA_STIM_INFUSION = "Stim Infusion (Nova Gadget)" +NOVA_PULSE_GRENADES = "Pulse Grenades (Nova Gadget)" +NOVA_FLASHBANG_GRENADES = "Flashbang Grenades (Nova Gadget)" +NOVA_IONIC_FORCE_FIELD = "Ionic Force Field (Nova Gadget)" +NOVA_HOLO_DECOY = "Holo Decoy (Nova Gadget)" +NOVA_NUKE = "Tac Nuke Strike (Nova Ability)" + +# Zerg Units +ZERGLING = "Zergling" +SWARM_QUEEN = "Swarm Queen" +ROACH = "Roach" +HYDRALISK = "Hydralisk" +ABERRATION = "Aberration" +MUTALISK = "Mutalisk" +SWARM_HOST = "Swarm Host" +INFESTOR = "Infestor" +ULTRALISK = "Ultralisk" +PYGALISK = "Pygalisk" +CORRUPTOR = "Corruptor" +SCOURGE = "Scourge" +BROOD_QUEEN = "Brood Queen" +DEFILER = "Defiler" +INFESTED_MARINE = "Infested Marine" +INFESTED_SIEGE_TANK = "Infested Siege Tank" +INFESTED_DIAMONDBACK = "Infested Diamondback" +BULLFROG = "Bullfrog" +INFESTED_BANSHEE = "Infested Banshee" +INFESTED_LIBERATOR = "Infested Liberator" + +# Zerg Buildings +SPORE_CRAWLER = "Spore Crawler" +SPINE_CRAWLER = "Spine Crawler" +BILE_LAUNCHER = "Bile Launcher" +INFESTED_BUNKER = "Infested Bunker" +INFESTED_MISSILE_TURRET = "Infested Missile Turret" +NYDUS_WORM = "Nydus Worm" +ECHIDNA_WORM = "Echidna Worm" + +# Zerg Weapon / Armor Upgrades +ZERG_UPGRADE_PREFIX = "Progressive Zerg" +ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer" + +PROGRESSIVE_ZERG_MELEE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Melee Attack" +PROGRESSIVE_ZERG_MISSILE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Missile Attack" +PROGRESSIVE_ZERG_GROUND_CARAPACE = f"{ZERG_UPGRADE_PREFIX} Ground Carapace" +PROGRESSIVE_ZERG_FLYER_ATTACK = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack" +PROGRESSIVE_ZERG_FLYER_CARAPACE = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace" +PROGRESSIVE_ZERG_WEAPON_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_ZERG_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_ZERG_GROUND_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade" +PROGRESSIVE_ZERG_FLYER_UPGRADE = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Zerg Unit Upgrades +ZERGLING_HARDENED_CARAPACE = "Hardened Carapace (Zergling)" +ZERGLING_ADRENAL_OVERLOAD = "Adrenal Overload (Zergling)" +ZERGLING_METABOLIC_BOOST = "Metabolic Boost (Zergling)" +ZERGLING_SHREDDING_CLAWS = "Shredding Claws (Zergling)" +ROACH_HYDRIODIC_BILE = "Hydriodic Bile (Roach)" +ROACH_ADAPTIVE_PLATING = "Adaptive Plating (Roach)" +ROACH_TUNNELING_CLAWS = "Tunneling Claws (Roach)" +ROACH_GLIAL_RECONSTITUTION = "Glial Reconstitution (Roach)" +ROACH_ORGANIC_CARAPACE = "Organic Carapace (Roach)" +HYDRALISK_FRENZY = "Frenzy (Hydralisk)" +HYDRALISK_ANCILLARY_CARAPACE = "Ancillary Carapace (Hydralisk)" +HYDRALISK_GROOVED_SPINES = "Grooved Spines (Hydralisk)" +HYDRALISK_MUSCULAR_AUGMENTS = "Muscular Augments (Hydralisk)" +HYDRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Hydralisk)" +BANELING_CORROSIVE_ACID = "Corrosive Acid (Baneling)" +BANELING_RUPTURE = "Rupture (Baneling)" +BANELING_REGENERATIVE_ACID = "Regenerative Acid (Baneling)" +BANELING_CENTRIFUGAL_HOOKS = "Centrifugal Hooks (Baneling)" +BANELING_TUNNELING_JAWS = "Tunneling Jaws (Baneling)" +BANELING_RAPID_METAMORPH = "Rapid Metamorph (Baneling)" +MUTALISK_VICIOUS_GLAIVE = "Vicious Glaive (Mutalisk)" +MUTALISK_RAPID_REGENERATION = "Rapid Regeneration (Mutalisk)" +MUTALISK_SUNDERING_GLAIVE = "Sundering Glaive (Mutalisk)" +MUTALISK_SEVERING_GLAIVE = "Severing Glaive (Mutalisk)" +MUTALISK_AERODYNAMIC_GLAIVE_SHAPE = "Aerodynamic Glaive Shape (Mutalisk)" +SPORE_CRAWLER_BIO_BONUS = "Caustic Enzymes (Spore Crawler)" +SWARM_HOST_BURROW = "Burrow (Swarm Host)" +SWARM_HOST_RAPID_INCUBATION = "Rapid Incubation (Swarm Host)" +SWARM_HOST_PRESSURIZED_GLANDS = "Pressurized Glands (Swarm Host)" +SWARM_HOST_LOCUST_METABOLIC_BOOST = "Locust Metabolic Boost (Swarm Host)" +SWARM_HOST_ENDURING_LOCUSTS = "Enduring Locusts (Swarm Host)" +SWARM_HOST_ORGANIC_CARAPACE = "Organic Carapace (Swarm Host)" +SWARM_HOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Host)" +ULTRALISK_BURROW_CHARGE = "Burrow Charge (Ultralisk)" +ULTRALISK_TISSUE_ASSIMILATION = "Tissue Assimilation (Ultralisk)" +ULTRALISK_MONARCH_BLADES = "Monarch Blades (Ultralisk)" +ULTRALISK_ANABOLIC_SYNTHESIS = "Anabolic Synthesis (Ultralisk)" +ULTRALISK_CHITINOUS_PLATING = "Chitinous Plating (Ultralisk)" +ULTRALISK_ORGANIC_CARAPACE = "Organic Carapace (Ultralisk)" +ULTRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Ultralisk)" +PYGALISK_STIM = "Stimpack (Pygalisk)" +PYGALISK_DUCAL_BLADES = "Ducal Blades (Pygalisk)" +PYGALISK_COMBAT_CARAPACE = "Combat Carapace (Pygalisk)" +CORRUPTOR_CORRUPTION = "Corruption (Corruptor)" +CORRUPTOR_CAUSTIC_SPRAY = "Caustic Spray (Corruptor)" +SCOURGE_VIRULENT_SPORES = "Virulent Spores (Scourge)" +SCOURGE_RESOURCE_EFFICIENCY = "Resource Efficiency (Scourge)" +SCOURGE_SWARM_SCOURGE = "Swarm Scourge (Scourge)" +DEVOURER_CORROSIVE_SPRAY = "Corrosive Spray (Devourer)" +DEVOURER_GAPING_MAW = "Gaping Maw (Devourer)" +DEVOURER_IMPROVED_OSMOSIS = "Improved Osmosis (Devourer)" +DEVOURER_PRESCIENT_SPORES = "Prescient Spores (Devourer)" +GUARDIAN_PROLONGED_DISPERSION = "Prolonged Dispersion (Guardian)" +GUARDIAN_PRIMAL_ADAPTATION = "Primal Adaptation (Guardian)" +GUARDIAN_SORONAN_ACID = "Soronan Acid (Guardian)" +GUARDIAN_PROPELLANT_SACS = "Propellant Sacs (Guardian)" +GUARDIAN_EXPLOSIVE_SPORES = "Explosive Spores (Guardian)" +GUARDIAN_PRIMORDIAL_FURY = "Primordial Fury (Guardian)" +IMPALER_ADAPTIVE_TALONS = "Adaptive Talons (Impaler)" +IMPALER_SECRETION_GLANDS = "Secretion Glands (Impaler)" +IMPALER_SUNKEN_SPINES = "Sunken Spines (Impaler)" +LURKER_SEISMIC_SPINES = "Seismic Spines (Lurker)" +LURKER_ADAPTED_SPINES = "Adapted Spines (Lurker)" +RAVAGER_POTENT_BILE = "Potent Bile (Ravager)" +RAVAGER_BLOATED_BILE_DUCTS = "Bloated Bile Ducts (Ravager)" +RAVAGER_DEEP_TUNNEL = "Deep Tunnel (Ravager)" +VIPER_PARASITIC_BOMB = "Parasitic Bomb (Viper)" +VIPER_PARALYTIC_BARBS = "Paralytic Barbs (Viper)" +VIPER_VIRULENT_MICROBES = "Virulent Microbes (Viper)" +BROOD_LORD_POROUS_CARTILAGE = "Porous Cartilage (Brood Lord)" +BROOD_LORD_BEHEMOTH_STELLARSKIN = "Behemoth Stellarskin (Brood Lord)" +BROOD_LORD_SPLITTER_MITOSIS = "Splitter Mitosis (Brood Lord)" +BROOD_LORD_RESOURCE_EFFICIENCY = "Resource Efficiency (Brood Lord)" +INFESTOR_INFESTED_TERRAN = "Infested Terran (Infestor)" +INFESTOR_MICROBIAL_SHROUD = "Microbial Shroud (Infestor)" +SWARM_QUEEN_SPAWN_LARVAE = "Spawn Larvae (Swarm Queen)" +SWARM_QUEEN_DEEP_TUNNEL = "Deep Tunnel (Swarm Queen)" +SWARM_QUEEN_ORGANIC_CARAPACE = "Organic Carapace (Swarm Queen)" +SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION = "Bio-Mechanical Transfusion (Swarm Queen)" +SWARM_QUEEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Queen)" +SWARM_QUEEN_INCUBATOR_CHAMBER = "Incubator Chamber (Swarm Queen)" +BROOD_QUEEN_FUNGAL_GROWTH = "Fungal Growth (Brood Queen)" +BROOD_QUEEN_ENSNARE = "Ensnare (Brood Queen)" +BROOD_QUEEN_ENHANCED_MITOCHONDRIA = "Enhanced Mitochondria (Brood Queen)" +DEFILER_PATHOGEN_PROJECTORS = "Pathogen Projectors (Defiler)" +DEFILER_TRAPDOOR_ADAPTATION = "Trapdoor Adaptation (Defiler)" +DEFILER_PREDATORY_CONSUMPTION = "Predatory Consumption (Defiler)" +DEFILER_COMORBIDITY = "Comorbidity (Defiler)" +ABERRATION_MONSTROUS_RESILIENCE = "Monstrous Resilience (Aberration)" +ABERRATION_CONSTRUCT_REGENERATION = "Construct Regeneration (Aberration)" +ABERRATION_BANELING_INCUBATION = "Baneling Incubation (Aberration)" +ABERRATION_PROTECTIVE_COVER = "Protective Cover (Aberration)" +ABERRATION_RESOURCE_EFFICIENCY = "Resource Efficiency (Aberration)" +ABERRATION_PROGRESSIVE_BANELING_LAUNCH = "Progressive Baneling Launch (Aberration)" +CORRUPTOR_MONSTROUS_RESILIENCE = "Monstrous Resilience (Corruptor)" +CORRUPTOR_CONSTRUCT_REGENERATION = "Construct Regeneration (Corruptor)" +CORRUPTOR_SCOURGE_INCUBATION = "Scourge Incubation (Corruptor)" +CORRUPTOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Corruptor)" +PRIMAL_IGNITER_CONCENTRATED_FIRE = "Concentrated Fire (Primal Igniter)" +PRIMAL_IGNITER_PRIMAL_TENACITY = "Primal Tenacity (Primal Igniter)" +OVERLORD_IMPROVED_OVERLORDS = "Improved Overlords (Overlord)" +OVERLORD_VENTRAL_SACS = "Ventral Sacs (Overlord)" +OVERLORD_GENERATE_CREEP = "Generate Creep (Overlord)" +OVERLORD_PNEUMATIZED_CARAPACE = "Pneumatized Carapace (Overlord)" +OVERLORD_ANTENNAE = "Antennae (Overlord)" +INFESTED_SCV_BUILD_CHARGES = "Sustained Cultivation Ventricles (Infested SCV)" +INFESTED_MARINE_PLAGUED_MUNITIONS = "Plagued Munitions (Infested Marine)" +INFESTED_MARINE_RETINAL_AUGMENTATION = "Retinal Augmentation (Infested Marine)" +INFESTED_BUNKER_CALCIFIED_ARMOR = "Calcified Armor (Infested Bunker)" +INFESTED_BUNKER_REGENERATIVE_PLATING = "Regenerative Plating (Infested Bunker)" +INFESTED_BUNKER_ENGORGED_BUNKERS = "Engorged Bunkers (Infested Bunker)" +TYRANNOZOR_BARRAGE_OF_SPIKES = "Barrage of Spikes (Tyrannozor)" +TYRANNOZOR_TYRANTS_PROTECTION = "Tyrant's Protection (Tyrannozor)" +TYRANNOZOR_HEALING_ADAPTATION = "Healing Adaptation (Tyrannozor)" +TYRANNOZOR_IMPALING_STRIKE = "Impaling Strike (Tyrannozor)" +BILE_LAUNCHER_ARTILLERY_DUCTS = "Artillery Ducts (Bile Launcher)" +BILE_LAUNCHER_RAPID_BOMBARMENT = "Rapid Bombardment (Bile Launcher)" +NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES = "Subterranean Scales (Nydus Worm/Echidna Worm)" +NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN = "Jormungandr Strain (Nydus Worm/Echidna Worm)" +NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY = "Resource Efficiency (Nydus Worm/Echidna Worm)" +NYDUS_WORM_RAVENOUS_APPETITE = "Ravenous Appetite (Nydus Worm)" +ECHIDNA_WORM_OUROBOROS_STRAIN = "Ouroboros Strain (Echidna Worm)" +INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS = "Progressive Automated Mitosis (Infested Siege Tank)" +INFESTED_SIEGE_TANK_ACIDIC_ENZYMES = "Acidic Enzymes (Infested Siege Tank)" +INFESTED_SIEGE_TANK_DEEP_TUNNEL = "Deep Tunnel (Infested Siege Tank)" +INFESTED_SIEGE_TANK_SEISMIC_SONAR = "Seismic Sonar (Infested Siege Tank)" +INFESTED_SIEGE_TANK_BALANCED_ROOTS = "Balanced Roots (Infested Siege Tank)" +INFESTED_DIAMONDBACK_CAUSTIC_MUCUS = "Caustic Mucus (Infested Diamondback)" +INFESTED_DIAMONDBACK_VIOLENT_ENZYMES = "Violent Enzymes (Infested Diamondback)" +INFESTED_DIAMONDBACK_CONCENTRATED_SPEW = "Concentrated Spew (Infested Diamondback)" +INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE = "Progressive Fungal Snare (Infested Diamondback)" +INFESTED_BANSHEE_BRACED_EXOSKELETON = "Braced Exoskeleton (Infested Banshee)" +INFESTED_BANSHEE_RAPID_HIBERNATION = "Rapid Hibernation (Infested Banshee)" +INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS = "Fleshfused Targeting Optics (Infested Banshee)" +INFESTED_LIBERATOR_CLOUD_DISPERSAL = "Cloud Dispersal (Infested Liberator)" +INFESTED_LIBERATOR_VIRAL_CONTAMINATION = "Viral Contamination (Infested Liberator)" +INFESTED_LIBERATOR_DEFENDER_MODE = "Defender Mode (Infested Liberator)" +INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Siege Tank)" +INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Diamondback)" +INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Banshee)" +INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Liberator)" +INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD = "Bioelectric Payload (Infested Missile Turret)" +INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS = "Acid Spore Vents (Infested Missile Turret)" +BULLFROG_WILD_MUTATION = "Mutagen Vents (Bullfrog)" +BULLFROG_BROODLINGS = "Suffused With Vermin (Bullfrog)" +BULLFROG_HARD_IMPACT = "Lethal Impact (Bullfrog)" +BULLFROG_RANGE = "Catalytic Boosters (Bullfrog)" + +# Zerg Strains +ZERGLING_RAPTOR_STRAIN = "Raptor Strain (Zergling)" +ZERGLING_SWARMLING_STRAIN = "Swarmling Strain (Zergling)" +ROACH_VILE_STRAIN = "Vile Strain (Roach)" +ROACH_CORPSER_STRAIN = "Corpser Strain (Roach)" +BANELING_SPLITTER_STRAIN = "Splitter Strain (Baneling)" +BANELING_HUNTER_STRAIN = "Hunter Strain (Baneling)" +SWARM_HOST_CARRION_STRAIN = "Carrion Strain (Swarm Host)" +SWARM_HOST_CREEPER_STRAIN = "Creeper Strain (Swarm Host)" +ULTRALISK_NOXIOUS_STRAIN = "Noxious Strain (Ultralisk)" +ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)" + +# Morphs +ZERGLING_BANELING_ASPECT = "Baneling" +HYDRALISK_IMPALER_ASPECT = "Impaler" +HYDRALISK_LURKER_ASPECT = "Lurker" +MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT = "Brood Lord" +MUTALISK_CORRUPTOR_VIPER_ASPECT = "Viper" +MUTALISK_CORRUPTOR_GUARDIAN_ASPECT = "Guardian" +MUTALISK_CORRUPTOR_DEVOURER_ASPECT = "Devourer" +ROACH_RAVAGER_ASPECT = "Ravager" +OVERLORD_OVERSEER_ASPECT = "Overseer" +ROACH_PRIMAL_IGNITER_ASPECT = "Primal Igniter" +ULTRALISK_TYRANNOZOR_ASPECT = "Tyrannozor" + +# Zerg Mercs +INFESTED_MEDICS = "Infested Medics" +INFESTED_SIEGE_BREAKERS = "Infested Siege Breakers" +INFESTED_DUSK_WINGS = "Infested Dusk Wings" +DEVOURING_ONES = "Devouring Ones" +HUNTER_KILLERS = "Hunter Killers" +TORRASQUE_MERC = "Wise Old Torrasque" +HUNTERLING = "Hunterling" +YGGDRASIL = "Yggdrasil" +CAUSTIC_HORRORS = "Caustic Horrors" + + +# Kerrigan Upgrades +KERRIGAN_KINETIC_BLAST = "Kinetic Blast (Kerrigan Ability)" +KERRIGAN_HEROIC_FORTITUDE = "Heroic Fortitude (Kerrigan Passive)" +KERRIGAN_LEAPING_STRIKE = "Leaping Strike (Kerrigan Ability)" +KERRIGAN_CRUSHING_GRIP = "Crushing Grip (Kerrigan Ability)" +KERRIGAN_CHAIN_REACTION = "Chain Reaction (Kerrigan Passive)" +KERRIGAN_PSIONIC_SHIFT = "Psionic Shift (Kerrigan Ability)" +KERRIGAN_WILD_MUTATION = "Wild Mutation (Kerrigan Ability)" +KERRIGAN_SPAWN_BANELINGS = "Spawn Banelings (Kerrigan Ability)" +KERRIGAN_MEND = "Mend (Kerrigan Ability)" +KERRIGAN_INFEST_BROODLINGS = "Infest Broodlings (Kerrigan Passive)" +KERRIGAN_FURY = "Fury (Kerrigan Passive)" +KERRIGAN_ABILITY_EFFICIENCY = "Ability Efficiency (Kerrigan Passive)" +KERRIGAN_APOCALYPSE = "Apocalypse (Kerrigan Ability)" +KERRIGAN_SPAWN_LEVIATHAN = "Spawn Leviathan (Kerrigan Ability)" +KERRIGAN_DROP_PODS = "Drop-Pods (Kerrigan Ability)" +KERRIGAN_ASSIMILATION_AURA = "Assimilation Aura (Kerrigan Ability)" +KERRIGAN_IMMOBILIZATION_WAVE = "Immobilization Wave (Kerrigan Ability)" +KERRIGAN_PRIMAL_FORM = "Primal Form (Kerrigan)" + +# Misc Upgrades +ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Zerg)" +AUTOMATED_EXTRACTORS = "Automated Extractors (Zerg)" +TWIN_DRONES = "Twin Drones (Zerg)" +MALIGNANT_CREEP = "Malignant Creep (Zerg)" +VESPENE_EFFICIENCY = "Vespene Efficiency (Zerg)" +ZERG_CREEP_STOMACH = "Creep Stomach (Zerg)" +ZERG_EXCAVATING_CLAWS = "Excavating Claws (Zerg)" +HIVE_CLUSTER_MATURATION = "Hive Cluster Maturation (Zerg)" +MACROSCOPIC_RECUPERATION = "Macroscopic Recuperation (Zerg)" +BIOMECHANICAL_STOCKPILING = "Bio-Mechanical Stockpiling (Zerg)" +BROODLING_SPORE_SATURATION = "Broodling Spore Saturation (Zerg)" +UNRESTRICTED_MUTATION = "Unrestricted Mutation (Zerg)" +CELL_DIVISION = "Cell Division (Zerg)" +EVOLUTIONARY_LEAP = "Evolutionary Leap (Zerg)" +SELF_SUFFICIENT = "Self-Sufficient (Zerg)" + +# Kerrigan Levels +KERRIGAN_LEVELS_1 = "1 Kerrigan Level" +KERRIGAN_LEVELS_2 = "2 Kerrigan Levels" +KERRIGAN_LEVELS_3 = "3 Kerrigan Levels" +KERRIGAN_LEVELS_4 = "4 Kerrigan Levels" +KERRIGAN_LEVELS_5 = "5 Kerrigan Levels" +KERRIGAN_LEVELS_6 = "6 Kerrigan Levels" +KERRIGAN_LEVELS_7 = "7 Kerrigan Levels" +KERRIGAN_LEVELS_8 = "8 Kerrigan Levels" +KERRIGAN_LEVELS_9 = "9 Kerrigan Levels" +KERRIGAN_LEVELS_10 = "10 Kerrigan Levels" +KERRIGAN_LEVELS_14 = "14 Kerrigan Levels" +KERRIGAN_LEVELS_35 = "35 Kerrigan Levels" +KERRIGAN_LEVELS_70 = "70 Kerrigan Levels" + +# Protoss Units +ZEALOT = "Zealot" +STALKER = "Stalker" +HIGH_TEMPLAR = "High Templar" +DARK_TEMPLAR = "Dark Templar" +IMMORTAL = "Immortal" +COLOSSUS = "Colossus" +PHOENIX = "Phoenix" +VOID_RAY = "Void Ray" +CARRIER = "Carrier" +SKYLORD = "Skylord" +TRIREME = "Trireme" +OBSERVER = "Observer" +CENTURION = "Centurion" +SENTINEL = "Sentinel" +SUPPLICANT = "Supplicant" +INSTIGATOR = "Instigator" +SLAYER = "Slayer" +SENTRY = "Sentry" +ENERGIZER = "Energizer" +HAVOC = "Havoc" +SIGNIFIER = "Signifier" +ASCENDANT = "Ascendant" +AVENGER = "Avenger" +BLOOD_HUNTER = "Blood Hunter" +DRAGOON = "Dragoon" +DARK_ARCHON = "Dark Archon" +ADEPT = "Adept" +WARP_PRISM = "Warp Prism" +ANNIHILATOR = "Annihilator" +VANGUARD = "Vanguard" +STALWART = "Stalwart" +WRATHWALKER = "Wrathwalker" +REAVER = "Reaver" +DISRUPTOR = "Disruptor" +MIRAGE = "Mirage" +SKIRMISHER = "Skirmisher" +CORSAIR = "Corsair" +DESTROYER = "Destroyer" +PULSAR = "Pulsar" +DAWNBRINGER = "Dawnbringer" +SCOUT = "Scout" +OPPRESSOR = "Oppressor" +CALADRIUS = "Caladrius" +MISTWING = "Mist Wing" +TEMPEST = "Tempest" +MOTHERSHIP = "Mothership" +ARBITER = "Arbiter" +ORACLE = "Oracle" + +# Upgrades +PROTOSS_UPGRADE_PREFIX = "Progressive Protoss" +PROTOSS_GROUND_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Ground" +PROTOSS_AIR_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Air" +PROGRESSIVE_PROTOSS_GROUND_WEAPON = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_PROTOSS_GROUND_ARMOR = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor" +PROGRESSIVE_PROTOSS_SHIELDS = f"{PROTOSS_UPGRADE_PREFIX} Shields" +PROGRESSIVE_PROTOSS_AIR_WEAPON = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_PROTOSS_AIR_ARMOR = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor" +PROGRESSIVE_PROTOSS_WEAPON_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_PROTOSS_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_PROTOSS_GROUND_UPGRADE = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_PROTOSS_AIR_UPGRADE = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Buildings +PHOTON_CANNON = "Photon Cannon" +KHAYDARIN_MONOLITH = "Khaydarin Monolith" +SHIELD_BATTERY = "Shield Battery" + +# Unit Upgrades +SUPPLICANT_BLOOD_SHIELD = "Blood Shield (Supplicant)" +SUPPLICANT_SOUL_AUGMENTATION = "Soul Augmentation (Supplicant)" +SUPPLICANT_ENDLESS_SERVITUDE = "Endless Servitude (Supplicant)" +SUPPLICANT_ZENITH_PITCH = "Zenith Pitch (Supplicant)" +SUPPLICANT_SACRIFICE = "Sacrifice (Supplicant)" +ADEPT_SHOCKWAVE = "Shockwave (Adept)" +ADEPT_RESONATING_GLAIVES = "Resonating Glaives (Adept)" +ADEPT_PHASE_BULWARK = "Phase Bulwark (Adept)" +STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES = "Disintegrating Particles (Stalker/Instigator/Slayer)" +STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION = "Particle Reflection (Stalker/Instigator/Slayer)" +INSTIGATOR_BLINK_OVERDRIVE = "Blink Overdrive (Instigator)" +INSTIGATOR_RECONSTRUCTION = "Reconstruction (Instigator)" +DRAGOON_CONCENTRATED_ANTIMATTER = "Concentrated Antimatter (Dragoon)" +DRAGOON_TRILLIC_COMPRESSION_SYSTEM = "Trillic Compression System (Dragoon)" +DRAGOON_SINGULARITY_CHARGE = "Singularity Charge (Dragoon)" +DRAGOON_ENHANCED_STRIDER_SERVOS = "Enhanced Strider Servos (Dragoon)" +SCOUT_COMBAT_SENSOR_ARRAY = "Combat Sensor Array (Scout/Oppressor/Caladrius/Mist Wing)" +SCOUT_APIAL_SENSORS = "Apial Sensors (Scout)" +SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout/Oppressor/Caladrius/Mist Wing)" +SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout/Oppressor/Mist Wing)" +SCOUT_RESOURCE_EFFICIENCY = "Resource Efficiency (Scout)" +SCOUT_SUPPLY_EFFICIENCY = "Supply Efficiency (Scout)" +TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)" +TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)" +TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)" +TEMPEST_INTERPLANETARY_RANGE = "Interplanetary Range (Tempest)" +PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage/Skirmisher)" +PHOENIX_CLASS_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage/Skirmisher)" +CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)" +CORSAIR_ARGUS_JEWEL = "Argus Jewel (Corsair)" +CORSAIR_SUSTAINING_DISRUPTION = "Sustaining Disruption (Corsair)" +CORSAIR_NEUTRON_SHIELDS = "Neutron Shields (Corsair)" +ORACLE_STEALTH_DRIVE = "Stealth Drive (Oracle)" +ORACLE_SKYWARD_CHRONOANOMALY = "Skyward Chronoanomaly (Oracle)" +ORACLE_TEMPORAL_ACCELERATION_BEAM = "Temporal Acceleration Beam (Oracle)" +ORACLE_BOSONIC_CORE = "Bosonic Core (Oracle)" +ARBITER_CHRONOSTATIC_REINFORCEMENT = "Chronostatic Reinforcement (Arbiter)" +ARBITER_KHAYDARIN_CORE = "Khaydarin Core (Arbiter)" +ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)" +ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)" +ARBITER_JUDICATORS_VEIL = "Judicator's Veil (Arbiter)" +CARRIER_TRIREME_GRAVITON_CATAPULT = "Graviton Catapult (Carrier/Trireme)" +CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier/Skylord/Trireme)" +VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer/Pulsar/Dawnbringer)" +DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES = "Anti-Surface Countermeasures (Dawnbringer)" +DAWNBRINGER_ENHANCED_SHIELD_GENERATOR = "Enhanced Shield Generator (Dawnbringer)" +PULSAR_CHRONOCLYSM = "Chronoclysm (Pulsar)" +PULSAR_ENTROPIC_REVERSAL = "Entropic Reversal (Pulsar)" +DESTROYER_RESOURCE_EFFICIENCY = "Resource Efficiency (Destroyer)" +WARP_PRISM_GRAVITIC_DRIVE = "Gravitic Drive (Warp Prism)" +WARP_PRISM_PHASE_BLASTER = "Phase Blaster (Warp Prism)" +WARP_PRISM_WAR_CONFIGURATION = "War Configuration (Warp Prism)" +OBSERVER_GRAVITIC_BOOSTERS = "Gravitic Boosters (Observer)" +OBSERVER_SENSOR_ARRAY = "Sensor Array (Observer)" +REAVER_SCARAB_DAMAGE = "Scarab Damage (Reaver)" +REAVER_SOLARITE_PAYLOAD = "Solarite Payload (Reaver)" +REAVER_REAVER_CAPACITY = "Reaver Capacity (Reaver)" +REAVER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaver)" +REAVER_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Reaver)" +VANGUARD_AGONY_LAUNCHERS = "Agony Launchers (Vanguard)" +VANGUARD_MATTER_DISPERSION = "Matter Dispersion (Vanguard)" +IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE = "Singularity Charge (Immortal/Annihilator)" +IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING = "Advanced Targeting (Immortal/Annihilator)" +IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION = "Disruptor Dispersion (Immortal/Annihilator)" +STALWART_HIGH_VOLTAGE_CAPACITORS = "High Voltage Capacitors (Stalwart)" +STALWART_REINTEGRATED_FRAMEWORK = "Reintegrated Framework (Stalwart)" +STALWART_STABILIZED_ELECTRODES = "Stabilized Electrodes (Stalwart)" +STALWART_LATTICED_SHIELDING = "Latticed Shielding (Stalwart)" +DISRUPTOR_CLOAKING_MODULE = "Cloaking Module (Disruptor)" +DISRUPTOR_PERFECTED_POWER = "Perfected Power (Disruptor)" +DISRUPTOR_RESTRAINED_DESTRUCTION = "Restrained Destruction (Disruptor)" +COLOSSUS_PACIFICATION_PROTOCOL = "Pacification Protocol (Colossus)" +WRATHWALKER_RAPID_POWER_CYCLING = "Rapid Power Cycling (Wrathwalker)" +WRATHWALKER_EYE_OF_WRATH = "Eye of Wrath (Wrathwalker)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK = "Blink (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_DARK_ARCHON_MELD = "Dark Archon Meld (Dark Templar)" +DARK_TEMPLAR_ARCHON_MERGE = "Archon Merge (Dark Templar)" +HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM = "Unshackled Psionic Storm (High Templar/Signifier)" +HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION = "Hallucination (High Templar/Signifier)" +HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET = "Khaydarin Amulet (High Templar/Signifier)" +ARCHON_HIGH_ARCHON = "High Archon (Archon)" +ARCHON_TRANSCENDENCE = "Transcendence (Archon)" +ARCHON_POWER_SIPHON = "Power Siphon (Archon)" +ARCHON_ERADICATE = "Eradicate (Archon)" +ARCHON_OBLITERATE = "Obliterate (Archon)" +DARK_ARCHON_FEEDBACK = "Feedback (Dark Archon)" +DARK_ARCHON_MAELSTROM = "Maelstrom (Dark Archon)" +DARK_ARCHON_ARGUS_TALISMAN = "Argus Talisman (Dark Archon)" +ASCENDANT_POWER_OVERWHELMING = "Power Overwhelming (Ascendant)" +ASCENDANT_CHAOTIC_ATTUNEMENT = "Chaotic Attunement (Ascendant)" +ASCENDANT_BLOOD_AMULET = "Blood Amulet (Ascendant)" +ASCENDANT_ARCHON_MERGE = "Archon Merge (Ascendant)" +SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE = "Cloaking Module (Sentry/Energizer/Havoc)" +SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)" +SENTRY_FORCE_FIELD = "Force Field (Sentry)" +SENTRY_HALLUCINATION = "Hallucination (Sentry)" +ENERGIZER_RECLAMATION = "Reclamation (Energizer)" +ENERGIZER_FORGED_CHASSIS = "Forged Chassis (Energizer)" +HAVOC_DETECT_WEAKNESS = "Detect Weakness (Havoc)" +HAVOC_BLOODSHARD_RESONANCE = "Bloodshard Resonance (Havoc)" +ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS = "Leg Enhancements (Zealot/Sentinel/Centurion)" +ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY = "Shield Capacity (Zealot/Sentinel/Centurion)" +OPPRESSOR_ACCELERATED_WARP = "Accelerated Warp (Oppressor)" +OPPRESSOR_ARMOR_MELTING_BLASTERS = "Armor Melting Blasters (Oppressor)" +CALADRIUS_SIDE_MISSILES = "Side Missiles (Caladrius)" +CALADRIUS_STRUCTURE_TARGETING = "Structure Targeting (Caladrius)" +CALADRIUS_SOLARITE_REACTOR = "Solarite Reactor (Caladrius)" +MISTWING_NULL_SHROUD = "Null Shroud (Mist Wing)" +MISTWING_PILOT = "Pilot (Mist Wing)" + +# War Council +ZEALOT_WHIRLWIND = "Whirlwind (Zealot)" +CENTURION_RESOURCE_EFFICIENCY = "Resource Efficiency (Centurion)" +SENTINEL_RESOURCE_EFFICIENCY = "Resource Efficiency (Sentinel)" +STALKER_PHASE_REACTOR = "Phase Reactor (Stalker)" +DRAGOON_PHALANX_SUIT = "Phalanx Suit (Dragoon)" +INSTIGATOR_MODERNIZED_SERVOS = "Modernized Servos (Instigator)" +ADEPT_DISRUPTIVE_TRANSFER = "Disruptive Transfer (Adept)" +SLAYER_PHASE_BLINK = "Phase Blink (Slayer)" +AVENGER_KRYHAS_CLOAK = "Kryhas Cloak (Avenger)" +DARK_TEMPLAR_LESSER_SHADOW_FURY = "Lesser Shadow Fury (Dark Templar)" +DARK_TEMPLAR_GREATER_SHADOW_FURY = "Greater Shadow Fury (Dark Templar)" +BLOOD_HUNTER_BRUTAL_EFFICIENCY = "Brutal Efficiency (Blood Hunter)" +SENTRY_DOUBLE_SHIELD_RECHARGE = "Double Shield Recharge (Sentry)" +ENERGIZER_MOBILE_CHRONO_BEAM = "Mobile Chrono Beam (Energizer)" +HAVOC_ENDURING_SIGHT = "Enduring Sight (Havoc)" +HIGH_TEMPLAR_PLASMA_SURGE = "Plasma Surge (High Templar)" +SIGNIFIER_FEEDBACK = "Feedback (Signifier)" +ASCENDANT_BREATH_OF_CREATION = "Breath of Creation (Ascendant)" +DARK_ARCHON_INDOMITABLE_WILL = "Indomitable Will (Dark Archon)" +IMMORTAL_IMPROVED_BARRIER = "Improved Barrier (Immortal)" +VANGUARD_RAPIDFIRE_CANNON = "Rapid-Fire Cannon (Vanguard)" +VANGUARD_FUSION_MORTARS = "Fusion Mortars (Vanguard)" +ANNIHILATOR_TWILIGHT_CHASSIS = "Twilight Chassis (Annihilator)" +STALWART_ARC_INDUCERS = "Arc Inducers (Stalwart)" +COLOSSUS_FIRE_LANCE = "Fire Lance (Colossus)" +WRATHWALKER_AERIAL_TRACKING = "Aerial Tracking (Wrathwalker)" +REAVER_KHALAI_REPLICATORS = "Khalai Replicators (Reaver)" +DISRUPTOR_MOBILITY_PROTOCOLS = "Mobility Protocols (Disruptor)" +WARP_PRISM_WARP_REFRACTION = "Warp Refraction (Warp Prism)" +OBSERVER_INDUCE_SCOPOPHOBIA = "Induce Scopophobia (Observer)" +PHOENIX_DOUBLE_GRAVITON_BEAM = "Double Graviton Beam (Phoenix)" +CORSAIR_NETWORK_DISRUPTION = "Network Disruption (Corsair)" +MIRAGE_GRAVITON_BEAM = "Graviton Beam (Mirage)" +SKIRMISHER_PEER_CONTEMPT = "Peer Contempt (Skirmisher)" +VOID_RAY_PRISMATIC_RANGE = "Prismatic Range (Void Ray)" +DESTROYER_REFORGED_BLOODSHARD_CORE = "Reforged Bloodshard Core (Destroyer)" +PULSAR_CHRONO_SHEAR = "Chrono Shear (Pulsar)" +DAWNBRINGER_SOLARITE_LENS = "Solarite Lens (Dawnbringer)" +CARRIER_REPAIR_DRONES = "Repair Drones (Carrier)" +SKYLORD_JUMP = "Jump (Skylord)" +TRIREME_SOLAR_BEAM = "Solar Beam (Trireme)" +TEMPEST_DISINTEGRATION = "Disintegration (Tempest)" +SCOUT_EXPEDITIONARY_HULL = "Expeditionary Hull (Scout)" +ARBITER_VESSEL_OF_THE_CONCLAVE = "Vessel of the Conclave (Arbiter)" +ORACLE_STASIS_CALIBRATION = "Stasis Calibration (Oracle)" +MOTHERSHIP_INTEGRATED_POWER = "Integrated Power (Mothership)" +OPPRESSOR_VULCAN_BLASTER = "Vulcan Blaster (Oppressor)" +CALADRIUS_CORONA_BEAM = "Corona Beam (Caladrius)" +MISTWING_PHANTOM_DASH = "Phantom Dash (Mist Wing)" + +# Spear Of Adun +SOA_CHRONO_SURGE = "Chrono Surge (Spear of Adun)" +SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun)" +SOA_PYLON_OVERCHARGE = "Pylon Overcharge (Spear of Adun)" +SOA_ORBITAL_STRIKE = "Orbital Strike (Spear of Adun)" +SOA_TEMPORAL_FIELD = "Temporal Field (Spear of Adun)" +SOA_SOLAR_LANCE = "Solar Lance (Spear of Adun)" +SOA_MASS_RECALL = "Mass Recall (Spear of Adun)" +SOA_SHIELD_OVERCHARGE = "Shield Overcharge (Spear of Adun)" +SOA_DEPLOY_FENIX = "Deploy Fenix (Spear of Adun)" +SOA_PURIFIER_BEAM = "Purifier Beam (Spear of Adun)" +SOA_TIME_STOP = "Time Stop (Spear of Adun)" +SOA_SOLAR_BOMBARDMENT = "Solar Bombardment (Spear of Adun)" + +# Generic upgrades +MATRIX_OVERLOAD = "Matrix Overload (Protoss)" +QUATRO = "Quatro (Protoss)" +NEXUS_OVERCHARGE = "Nexus Overcharge (Protoss)" +ORBITAL_ASSIMILATORS = "Orbital Assimilators (Protoss)" +WARP_HARMONIZATION = "Warp Harmonization (Protoss)" +GUARDIAN_SHELL = "Guardian Shell (Spear of Adun)" +RECONSTRUCTION_BEAM = "Reconstruction Beam (Spear of Adun)" +OVERWATCH = "Overwatch (Spear of Adun)" +SUPERIOR_WARP_GATES = "Superior Warp Gates (Protoss)" +ENHANCED_TARGETING = "Enhanced Targeting (Protoss)" +OPTIMIZED_ORDNANCE = "Optimized Ordnance (Protoss)" +KHALAI_INGENUITY = "Khalai Ingenuity (Protoss)" +AMPLIFIED_ASSIMILATORS = "Amplified Assimilators (Protoss)" +PROGRESSIVE_WARP_RELOCATE = "Progressive Warp Relocate (Protoss)" +PROBE_WARPIN = "Probe Warp-In (Protoss)" +ELDER_PROBES = "Elder Probes (Protoss)" + +# Filler items +STARTING_MINERALS = "Additional Starting Minerals" +STARTING_VESPENE = "Additional Starting Vespene" +STARTING_SUPPLY = "Additional Starting Supply" +MAX_SUPPLY = "Additional Maximum Supply" +SHIELD_REGENERATION = "Increased Shield Regeneration" +BUILDING_CONSTRUCTION_SPEED = "Increased Building Construction Speed" +UPGRADE_RESEARCH_SPEED = "Increased Upgrade Research Speed" +UPGRADE_RESEARCH_COST = "Reduced Upgrade Research Cost" + +# Trap +REDUCED_MAX_SUPPLY = "Decreased Maximum Supply" +NOTHING = "Nothing" + +# Deprecated +PROGRESSIVE_ORBITAL_COMMAND = "Progressive Orbital Command (Deprecated)" + +# Keys +_TEMPLATE_MISSION_KEY = "{} Mission Key" +_TEMPLATE_NAMED_LAYOUT_KEY = "{} ({}) Questline Key" +_TEMPLATE_NUMBERED_LAYOUT_KEY = "Questline Key #{}" +_TEMPLATE_NAMED_CAMPAIGN_KEY = "{} Campaign Key" +_TEMPLATE_NUMBERED_CAMPAIGN_KEY = "Campaign Key #{}" +_TEMPLATE_FLAVOR_KEY = "{} Key" +PROGRESSIVE_MISSION_KEY = "Progressive Mission Key" +PROGRESSIVE_QUESTLINE_KEY = "Progressive Questline Key" +_TEMPLATE_PROGRESSIVE_KEY = "Progressive Key #{}" + +# Names for flavor keys, feel free to add more, but add them to the Custom Mission Order docs too +# These will never be randomly created by the generator +_flavor_key_names = [ + "Terran", "Zerg", "Protoss", + "Raynor", "Tychus", "Swann", "Stetmann", "Hanson", "Nova", "Tosh", "Valerian", "Warfield", "Mengsk", "Han", "Horner", + "Kerrigan", "Zagara", "Abathur", "Yagdra", "Kraith", "Slivan", "Zurvan", "Brakk", "Stukov", "Dehaka", "Niadra", "Izsha", + "Artanis", "Zeratul", "Tassadar", "Karax", "Vorazun", "Alarak", "Fenix", "Urun", "Mohandar", "Selendis", "Rohana", + "Reigel", "Davis", "Ji'nara" +] diff --git a/worlds/sc2/item/item_parents.py b/worlds/sc2/item/item_parents.py new file mode 100644 index 00000000..18b27b79 --- /dev/null +++ b/worlds/sc2/item/item_parents.py @@ -0,0 +1,266 @@ +""" +Utilities for telling item parentage hierarchy. +ItemData in item_tables.py will point from child item -> parent rule. +Rules have a `parent_items()` method which links rule -> parent items. +Rules may be more complex than all or any items being present. Call them to determine if they are satisfied. +""" + +from typing import Dict, List, Iterable, Sequence, Optional, TYPE_CHECKING +import abc +from . import item_names, parent_names, item_tables, item_groups + +if TYPE_CHECKING: + from ..options import Starcraft2Options + + +class PresenceRule(abc.ABC): + """Contract for a parent presence rule. This should be a protocol in Python 3.10+""" + constraint_group: Optional[str] + """Identifies the group this item rule is a part of, subject to min/max upgrades per unit""" + display_string: str + """Main item to count as the parent for min/max upgrades per unit purposes""" + @abc.abstractmethod + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: ... + @abc.abstractmethod + def parent_items(self) -> Sequence[str]: ... + + +class ItemPresent(PresenceRule): + def __init__(self, item_name: str) -> None: + self.item_name = item_name + self.constraint_group = item_name + self.display_string = item_name + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return self.item_name in inventory + + def parent_items(self) -> List[str]: + return [self.item_name] + + +class AnyOf(PresenceRule): + def __init__(self, group: Iterable[str], main_item: Optional[str] = None, display_string: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = display_string or main_item or ' | '.join(group) + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return len(self.group.intersection(inventory)) > 0 + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +class AllOf(PresenceRule): + def __init__(self, group: Iterable[str], main_item: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = main_item or ' & '.join(group) + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return len(self.group.intersection(inventory)) == len(self.group) + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +class AnyOfGroupAndOneOtherItem(PresenceRule): + def __init__(self, group: Iterable[str], item_name: str) -> None: + self.group = set(group) + self.item_name = item_name + self.constraint_group = item_name + self.display_string = item_name + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (len(self.group.intersection(inventory)) > 0) and self.item_name in inventory + + def parent_items(self) -> List[str]: + return sorted(self.group) + [self.item_name] + + +class MorphlingOrItem(PresenceRule): + def __init__(self, item_name: str, has_parent: bool = True) -> None: + self.item_name = item_name + self.constraint_group = None # Keep morphs from counting towards the parent unit's upgrade count + self.display_string = f'{item_name} Morphs' + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (options.enable_morphling.value != 0) or self.item_name in inventory + + def parent_items(self) -> List[str]: + return [self.item_name] + + +class MorphlingOrAnyOf(PresenceRule): + def __init__(self, group: Iterable[str], display_string: str, main_item: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = display_string + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (options.enable_morphling.value != 0) or (len(self.group.intersection(inventory)) > 0) + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +parent_present: Dict[str, PresenceRule] = { + item_name: ItemPresent(item_name) + for item_name in item_tables.item_table +} + +# Terran +parent_present[parent_names.DOMINION_TROOPER_WEAPONS] = AnyOf([ + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG, + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER, + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER, +], main_item=item_names.DOMINION_TROOPER) +parent_present[parent_names.INFANTRY_UNITS] = AnyOf(item_groups.barracks_units, display_string='Terran Infantry') +parent_present[parent_names.INFANTRY_WEAPON_UNITS] = AnyOf(item_groups.barracks_wa_group, display_string='Terran Infantry') +parent_present[parent_names.ORBITAL_COMMAND_AND_PLANETARY] = AnyOfGroupAndOneOtherItem( + item_groups.orbital_command_abilities, + item_names.PLANETARY_FORTRESS, +) +parent_present[parent_names.SIEGE_TANK_AND_TRANSPORT] = AnyOfGroupAndOneOtherItem( + (item_names.MEDIVAC, item_names.HERCULES), + item_names.SIEGE_TANK, +) +parent_present[parent_names.SIEGE_TANK_AND_MEDIVAC] = AllOf((item_names.SIEGE_TANK, item_names.MEDIVAC), item_names.SIEGE_TANK) +parent_present[parent_names.SPIDER_MINE_SOURCE] = AnyOf(item_groups.spider_mine_sources, display_string='Spider Mines') +parent_present[parent_names.STARSHIP_UNITS] = AnyOf(item_groups.starport_units, display_string='Terran Starships') +parent_present[parent_names.STARSHIP_WEAPON_UNITS] = AnyOf(item_groups.starport_wa_group, display_string='Terran Starships') +parent_present[parent_names.VEHICLE_UNITS] = AnyOf(item_groups.factory_units, display_string='Terran Vehicles') +parent_present[parent_names.VEHICLE_WEAPON_UNITS] = AnyOf(item_groups.factory_wa_group, display_string='Terran Vehicles') +parent_present[parent_names.TERRAN_MERCENARIES] = AnyOf(item_groups.terran_mercenaries, display_string='Terran Mercenaries') + +# Zerg +parent_present[parent_names.ANY_NYDUS_WORM] = AnyOf((item_names.NYDUS_WORM, item_names.ECHIDNA_WORM), item_names.NYDUS_WORM) +parent_present[parent_names.BANELING_SOURCE] = AnyOf( + (item_names.ZERGLING_BANELING_ASPECT, item_names.KERRIGAN_SPAWN_BANELINGS), + item_names.ZERGLING_BANELING_ASPECT, +) +parent_present[parent_names.INFESTED_UNITS] = AnyOf(item_groups.infterr_units, display_string='Infested') +parent_present[parent_names.INFESTED_FACTORY_OR_STARPORT] = AnyOf( + (item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, item_names.INFESTED_LIBERATOR, item_names.INFESTED_BANSHEE, item_names.BULLFROG) +) +parent_present[parent_names.MORPH_SOURCE_AIR] = MorphlingOrAnyOf((item_names.MUTALISK, item_names.CORRUPTOR), "Mutalisk/Corruptor Morphs") +parent_present[parent_names.MORPH_SOURCE_ROACH] = MorphlingOrItem(item_names.ROACH) +parent_present[parent_names.MORPH_SOURCE_ZERGLING] = MorphlingOrItem(item_names.ZERGLING) +parent_present[parent_names.MORPH_SOURCE_HYDRALISK] = MorphlingOrItem(item_names.HYDRALISK) +parent_present[parent_names.MORPH_SOURCE_ULTRALISK] = MorphlingOrItem(item_names.ULTRALISK) +parent_present[parent_names.ZERG_UPROOTABLE_BUILDINGS] = AnyOf( + (item_names.SPINE_CRAWLER, item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET, item_names.INFESTED_BUNKER), +) +parent_present[parent_names.ZERG_MELEE_ATTACKER] = AnyOf(item_groups.zerg_melee_wa, display_string='Zerg Ground') +parent_present[parent_names.ZERG_MISSILE_ATTACKER] = AnyOf(item_groups.zerg_ranged_wa, display_string='Zerg Ground') +parent_present[parent_names.ZERG_CARAPACE_UNIT] = AnyOf(item_groups.zerg_ground_units, display_string='Zerg Flyers') +parent_present[parent_names.ZERG_FLYING_UNIT] = AnyOf(item_groups.zerg_air_units, display_string='Zerg Flyers') +parent_present[parent_names.ZERG_MERCENARIES] = AnyOf(item_groups.zerg_mercenaries, display_string='Zerg Mercenaries') +parent_present[parent_names.ZERG_OUROBOUROS_CONDITION] = AnyOfGroupAndOneOtherItem( + (item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION), + item_names.ECHIDNA_WORM +) + +# Protoss +parent_present[parent_names.ARCHON_SOURCE] = AnyOf( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT_ARCHON_MERGE, item_names.DARK_TEMPLAR_ARCHON_MERGE), + main_item="Archon", +) +parent_present[parent_names.CARRIER_CLASS] = AnyOf( + (item_names.CARRIER, item_names.TRIREME, item_names.SKYLORD), + main_item=item_names.CARRIER, +) +parent_present[parent_names.CARRIER_OR_TRIREME] = AnyOf( + (item_names.CARRIER, item_names.TRIREME), + main_item=item_names.CARRIER, +) +parent_present[parent_names.DARK_ARCHON_SOURCE] = AnyOf( + (item_names.DARK_ARCHON, item_names.DARK_TEMPLAR_DARK_ARCHON_MELD), + main_item=item_names.DARK_ARCHON, +) +parent_present[parent_names.DARK_TEMPLAR_CLASS] = AnyOf( + (item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER), + main_item=item_names.DARK_TEMPLAR, +) +parent_present[parent_names.STORM_CASTER] = AnyOf( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER), + main_item=item_names.HIGH_TEMPLAR, +) +parent_present[parent_names.IMMORTAL_OR_ANNIHILATOR] = AnyOf( + (item_names.IMMORTAL, item_names.ANNIHILATOR), + main_item=item_names.IMMORTAL, +) +parent_present[parent_names.PHOENIX_CLASS] = AnyOf( + (item_names.PHOENIX, item_names.MIRAGE, item_names.SKIRMISHER), + main_item=item_names.PHOENIX, +) +parent_present[parent_names.SENTRY_CLASS] = AnyOf( + (item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC), + main_item=item_names.SENTRY, +) +parent_present[parent_names.SENTRY_CLASS_OR_SHIELD_BATTERY] = AnyOf( + (item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC, item_names.SHIELD_BATTERY), + main_item=item_names.SENTRY, +) +parent_present[parent_names.STALKER_CLASS] = AnyOf( + (item_names.STALKER, item_names.SLAYER, item_names.INSTIGATOR), + main_item=item_names.STALKER, +) +parent_present[parent_names.SUPPLICANT_AND_ASCENDANT] = AllOf( + (item_names.SUPPLICANT, item_names.ASCENDANT), + main_item=item_names.ASCENDANT, +) +parent_present[parent_names.VOID_RAY_CLASS] = AnyOf( + (item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER), + main_item=item_names.VOID_RAY, +) +parent_present[parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION] = AnyOf( + (item_names.ZEALOT, item_names.SENTINEL, item_names.CENTURION), + main_item=item_names.ZEALOT, +) +parent_present[parent_names.SCOUT_CLASS] = AnyOf( + (item_names.SCOUT, item_names.OPPRESSOR, item_names.CALADRIUS, item_names.MISTWING), + main_item=item_names.SCOUT, +) +parent_present[parent_names.SCOUT_OR_OPPRESSOR_OR_MISTWING] = AnyOf( + (item_names.SCOUT, item_names.OPPRESSOR, item_names.MISTWING), + main_item=item_names.SCOUT, +) +parent_present[parent_names.PROTOSS_STATIC_DEFENSE] = AnyOf( + (item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH, item_names.SHIELD_BATTERY), + main_item=item_names.PHOTON_CANNON, +) +parent_present[parent_names.PROTOSS_ATTACKING_BUILDING] = AnyOf( + (item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH), + main_item=item_names.PHOTON_CANNON, +) + + +parent_id_to_children: Dict[str, Sequence[str]] = {} +"""Parent identifier to child items. Only contains parent rules with children.""" +child_item_to_parent_items: Dict[str, Sequence[str]] = {} +"""Child item name to all parent items that can possibly affect its presence rule. Populated for all item names.""" + +parent_item_to_ids: Dict[str, Sequence[str]] = {} +"""Parent item to parent identifiers it affects. Populated for all items and parent IDs.""" +parent_item_to_children: Dict[str, Sequence[str]] = {} +"""Parent item to child item names. Populated for all items and parent IDs.""" +item_upgrade_groups: Dict[str, Sequence[str]] = {} +"""Mapping of upgradable item group -> child items. Only populated for groups with child items.""" +# Note(mm): "All items" promise satisfied by the basic ItemPresent auto-generated rules + +def _init() -> None: + for item_name, item_data in item_tables.item_table.items(): + if item_data.parent is None: + continue + parent_id_to_children.setdefault(item_data.parent, []).append(item_name) # type: ignore + child_item_to_parent_items[item_name] = parent_present[item_data.parent].parent_items() + + for parent_id, presence_func in parent_present.items(): + for parent_item in presence_func.parent_items(): + parent_item_to_ids.setdefault(parent_item, []).append(parent_id) # type: ignore + parent_item_to_children.setdefault(parent_item, []).extend(parent_id_to_children.get(parent_id, [])) # type: ignore + if presence_func.constraint_group is not None and parent_id_to_children.get(parent_id): + item_upgrade_groups.setdefault(presence_func.constraint_group, []).extend(parent_id_to_children[parent_id]) # type: ignore + +_init() diff --git a/worlds/sc2/item/item_tables.py b/worlds/sc2/item/item_tables.py new file mode 100644 index 00000000..7fb198ea --- /dev/null +++ b/worlds/sc2/item/item_tables.py @@ -0,0 +1,2415 @@ +from typing import * + +from BaseClasses import ItemClassification +import typing + +from ..mission_tables import SC2Mission, SC2Race, SC2Campaign +from ..item import parent_names, ItemData, TerranItemType, FactionlessItemType, ProtossItemType, ZergItemType +from ..mission_order.presets_static import get_used_layout_names +from . import item_names + + + +def get_full_item_list(): + return item_table + + +SC2WOL_ITEM_ID_OFFSET = 1000 +SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 +SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 +SC2_KEY_ITEM_ID_OFFSET = SC2LOTV_ITEM_ID_OFFSET + 1000 +# Reserve this many IDs for missions, layouts, campaigns, and generic keys each +SC2_KEY_ITEM_SECTION_SIZE = 1000 + +WEAPON_ARMOR_UPGRADE_MAX_LEVEL = 5 + + +# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. +item_table = { + # WoL + item_names.MARINE: + ItemData(0 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIC: + ItemData(1 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIREBAT: + ItemData(2 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MARAUDER: + ItemData(3 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.REAPER: + ItemData(4 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HELLION: + ItemData(5 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VULTURE: + ItemData(6 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GOLIATH: + ItemData(7 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DIAMONDBACK: + ItemData(8 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIEGE_TANK: + ItemData(9 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIVAC: + ItemData(10 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WRAITH: + ItemData(11 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VIKING: + ItemData(12 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BANSHEE: + ItemData(13 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BATTLECRUISER: + ItemData(14 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GHOST: + ItemData(15 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SPECTRE: + ItemData(16 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.THOR: + ItemData(17 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + # EE units + item_names.LIBERATOR: + ItemData(18 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 18, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VALKYRIE: + ItemData(19 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 19, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WIDOW_MINE: + ItemData(20 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 20, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CYCLONE: + ItemData(21 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 21, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HERC: + ItemData(22 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 26, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WARHOUND: + ItemData(23 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DOMINION_TROOPER: + ItemData(24 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + # Elites, currently disabled for balance + item_names.PRIDE_OF_AUGUSTRGRAD: + ItemData(50 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 28, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SKY_FURY: + ItemData(51 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 29, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SHOCK_DIVISION: + ItemData(52 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BLACKHAMMER: + ItemData(53 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.AEGIS_GUARD: + ItemData(54 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.EMPERORS_SHADOW: + ItemData(55 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SON_OF_KORHAL: + ItemData(56 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BULWARK_COMPANY: + ItemData(57 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIELD_RESPONSE_THETA: + ItemData(58 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.EMPERORS_GUARDIAN: + ItemData(59 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_HAWK: + ItemData(60 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_WOLF: + ItemData(61 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + + # Some other items are moved to Upgrade group because of the way how the bot message is parsed + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_UNITS), + # Bundles + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_UNITS), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Unit and structure upgrades + item_names.BUNKER_PROJECTILE_ACCELERATOR: + ItemData(200 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 0, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.BUNKER_NEOSTEEL_BUNKER: + ItemData(201 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 1, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.MISSILE_TURRET_TITANIUM_HOUSING: + ItemData(202 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 2, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: + ItemData(203 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 3, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + item_names.SCV_ADVANCED_CONSTRUCTION: + ItemData(204 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 4, SC2Race.TERRAN), + item_names.SCV_DUAL_FUSION_WELDERS: + ItemData(205 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 5, SC2Race.TERRAN), + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: + ItemData(206 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 24, SC2Race.TERRAN, + quantity=2), + item_names.PROGRESSIVE_ORBITAL_COMMAND: + ItemData(207 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Deprecated, -1, SC2Race.TERRAN, + quantity=0, classification=ItemClassification.progression), + item_names.MARINE_PROGRESSIVE_STIMPACK: + ItemData(208 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE, quantity=2), + item_names.MARINE_COMBAT_SHIELD: + ItemData(209 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 9, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: + ItemData(210 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 10, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_STABILIZER_MEDPACKS: + ItemData(211 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 11, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MEDIC), + item_names.FIREBAT_INCINERATOR_GAUNTLETS: + ItemData(212 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 12, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_JUGGERNAUT_PLATING: + ItemData(213 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 13, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT), + item_names.MARAUDER_CONCUSSIVE_SHELLS: + ItemData(214 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 14, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_KINETIC_FOAM: + ItemData(215 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 15, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.REAPER_U238_ROUNDS: + ItemData(216 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 16, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_G4_CLUSTERBOMB: + ItemData(217 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.REAPER), + item_names.CYCLONE_MAG_FIELD_ACCELERATORS: + ItemData(218 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 18, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.CYCLONE_MAG_FIELD_LAUNCHERS: + ItemData(219 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 19, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.MARINE_LASER_TARGETING_SYSTEM: + ItemData(220 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 8, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MARINE_MAGRAIL_MUNITIONS: + ItemData(221 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MARINE_OPTIMIZED_LOGISTICS: + ItemData(222 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 21, SC2Race.TERRAN, + parent=item_names.MARINE), + item_names.MEDIC_RESTORATION: + ItemData(223 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 22, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_OPTICAL_FLARE: + ItemData(224 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 23, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_RESOURCE_EFFICIENCY: + ItemData(225 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 24, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.FIREBAT_PROGRESSIVE_STIMPACK: + ItemData(226 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT, quantity=2), + item_names.FIREBAT_RESOURCE_EFFICIENCY: + ItemData(227 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 25, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.MARAUDER_PROGRESSIVE_STIMPACK: + ItemData(228 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 8, SC2Race.TERRAN, + parent=item_names.MARAUDER, quantity=2), + item_names.MARAUDER_LASER_TARGETING_SYSTEM: + ItemData(229 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 26, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_MAGRAIL_MUNITIONS: + ItemData(230 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 27, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_INTERNAL_TECH_MODULE: + ItemData(231 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 28, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: + ItemData(232 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 29, SC2Race.TERRAN), + item_names.MEDIC_ADAPTIVE_MEDPACKS: + ItemData(233 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MEDIC), + item_names.MEDIC_NANO_PROJECTOR: + ItemData(234 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 1, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.FIREBAT_INFERNAL_PRE_IGNITER: + ItemData(235 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 2, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_KINETIC_FOAM: + ItemData(236 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 3, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_NANO_PROJECTORS: + ItemData(237 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 4, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT), + item_names.MARAUDER_JUGGERNAUT_PLATING: + ItemData(238 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 5, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.REAPER_JET_PACK_OVERDRIVE: + ItemData(239 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing, parent=item_names.REAPER), + item_names.HELLION_INFERNAL_PLATING: + ItemData(240 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 7, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.VULTURE_JERRYRIGGED_PATCHUP: + ItemData(241 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 8, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.GOLIATH_SHAPED_HULL: + ItemData(242 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 9, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_RESOURCE_EFFICIENCY: + ItemData(243 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 10, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_INTERNAL_TECH_MODULE: + ItemData(244 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 11, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.SIEGE_TANK_SHAPED_HULL: + ItemData(245 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 12, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: + ItemData(246 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 13, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.PREDATOR_CLOAK: + ItemData(247 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 14, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.PREDATOR_CHARGE: + ItemData(248 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 15, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.MEDIVAC_SCATTER_VEIL: + ItemData(249 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 16, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.REAPER_PROGRESSIVE_STIMPACK: + ItemData(250 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 10, SC2Race.TERRAN, + parent=item_names.REAPER, quantity=2), + item_names.REAPER_LASER_TARGETING_SYSTEM: + ItemData(251 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 17, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_ADVANCED_CLOAKING_FIELD: + ItemData(252 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 18, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_SPIDER_MINES: + ItemData(253 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 19, SC2Race.TERRAN, + parent=item_names.REAPER, + important_for_filtering=True), + item_names.REAPER_COMBAT_DRUGS: + ItemData(254 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 20, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.HELLION_HELLBAT: + ItemData(255 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 21, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.HELLION), + item_names.HELLION_SMART_SERVOS: + ItemData(256 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 22, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_OPTIMIZED_LOGISTICS: + ItemData(257 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 23, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_JUMP_JETS: + ItemData(258 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 24, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_PROGRESSIVE_STIMPACK: + ItemData(259 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 12, SC2Race.TERRAN, + parent=item_names.HELLION, quantity=2), + item_names.VULTURE_ION_THRUSTERS: + ItemData(260 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 25, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.VULTURE_AUTO_LAUNCHERS: + ItemData(261 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 26, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: + ItemData(262 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 27, SC2Race.TERRAN, + parent=parent_names.SPIDER_MINE_SOURCE), + item_names.GOLIATH_JUMP_JETS: + ItemData(263 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GOLIATH), + item_names.GOLIATH_OPTIMIZED_LOGISTICS: + ItemData(264 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 29, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.DIAMONDBACK_HYPERFLUXOR: + ItemData(265 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 0, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_BURST_CAPACITORS: + ItemData(266 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 1, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: + ItemData(267 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 2, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_JUMP_JETS: + ItemData(268 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 3, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SPIDER_MINES: + ItemData(269 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 4, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK, + important_for_filtering=True), + item_names.SIEGE_TANK_SMART_SERVOS: + ItemData(270 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 5, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_GRADUATING_RANGE: + ItemData(271 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: + ItemData(272 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 7, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: + ItemData(273 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 8, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: + ItemData(274 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 9, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.PREDATOR_RESOURCE_EFFICIENCY: + ItemData(275 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PREDATOR), + item_names.MEDIVAC_EXPANDED_HULL: + ItemData(276 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 11, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.MEDIVAC_AFTERBURNERS: + ItemData(277 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 12, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: + ItemData(278 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 13, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WRAITH), + item_names.VIKING_SMART_SERVOS: + ItemData(279 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 14, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.VIKING_ANTI_MECHANICAL_MUNITION: + ItemData(280 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 15, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.DIAMONDBACK_MAGLEV_PROPULSION: + ItemData(281 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 21, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.WARHOUND_RESOURCE_EFFICIENCY: + ItemData(282 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 13, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.WARHOUND_AXIOM_PLATING: + ItemData(283 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 14, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.HERC_RESOURCE_EFFICIENCY: + ItemData(284 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 15, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.HERC_JUGGERNAUT_PLATING: + ItemData(285 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 16, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.HERC_KINETIC_FOAM: + ItemData(286 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 17, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.REAPER_RESOURCE_EFFICIENCY: + ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.REAPER), + item_names.REAPER_BALLISTIC_FLIGHTSUIT: + ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: + ItemData(289 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=parent_names.SIEGE_TANK_AND_TRANSPORT, quantity=2), + item_names.SIEGE_TANK_ALLTERRAIN_TREADS : + ItemData(290 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 20, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: + ItemData(291 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 21, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.BATTLECRUISER_BEHEMOTH_REACTOR: + ItemData(292 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 22, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.THOR_RAPID_RELOAD: + ItemData(293 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 23, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.LIBERATOR_GUERILLA_MISSILES: + ItemData(294 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 24, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: + ItemData(295 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 25, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.HERC_GRAPPLE_PULL: + ItemData(296 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 26, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.COMMAND_CENTER_SCANNER_SWEEP: + ItemData(297 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.COMMAND_CENTER_MULE: + ItemData(298 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 28, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: + ItemData(299 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 29, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HELLION_TWIN_LINKED_FLAMETHROWER: + ItemData(300 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 16, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_THERMITE_FILAMENTS: + ItemData(301 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 17, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.SPIDER_MINE_CERBERUS_MINE: + ItemData(302 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 18, SC2Race.TERRAN, + parent=parent_names.SPIDER_MINE_SOURCE), + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: + ItemData(303 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 16, SC2Race.TERRAN, + parent=item_names.VULTURE, quantity=2), + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: + ItemData(304 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 19, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: + ItemData(305 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 20, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: + ItemData(306 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 4, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK, quantity=2), + item_names.DIAMONDBACK_SHAPED_HULL: + ItemData(307 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 22, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_MAELSTROM_ROUNDS: + ItemData(308 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SHAPED_BLAST: + ItemData(309 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 24, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: + ItemData(310 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 25, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.MEDIVAC_ADVANCED_HEALING_AI: + ItemData(311 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 26, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: + ItemData(312 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 18, SC2Race.TERRAN, + parent=item_names.WRAITH, quantity=2), + item_names.WRAITH_DISPLACEMENT_FIELD: + ItemData(313 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 27, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.VIKING_RIPWAVE_MISSILES: + ItemData(314 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VIKING), + item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: + ItemData(315 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 29, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: + ItemData(316 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 2, SC2Race.TERRAN, + parent=item_names.BANSHEE, quantity=2), + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: + ItemData(317 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: + ItemData(318 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 2, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER, quantity=2), + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: + ItemData(319 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER, quantity=2), + item_names.GHOST_OCULAR_IMPLANTS: + ItemData(320 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 2, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.GHOST_CRIUS_SUIT: + ItemData(321 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 3, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_PSIONIC_LASH: + ItemData(322 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 4, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SPECTRE), + item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: + ItemData(323 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 5, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_330MM_BARRAGE_CANNON: + ItemData(324 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 6, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: + ItemData(325 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 22, SC2Race.TERRAN, + parent=item_names.THOR, quantity=2), + item_names.LIBERATOR_ADVANCED_BALLISTICS: + ItemData(326 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 7, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_RAID_ARTILLERY: + ItemData(327 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 8, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_DRILLING_CLAWS: + ItemData(328 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 9, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_CONCEALMENT: + ItemData(329 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WIDOW_MINE), + item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: + ItemData(330 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 11, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_TRIGGER_OVERRIDE: + ItemData(331 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 12, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.WRAITH_INTERNAL_TECH_MODULE: + ItemData(332 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 13, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.WRAITH_RESOURCE_EFFICIENCY: + ItemData(333 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 14, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.VIKING_SHREDDER_ROUNDS: + ItemData(334 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VIKING), + item_names.VIKING_WILD_MISSILES: + ItemData(335 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 16, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.BANSHEE_SHAPED_HULL: + ItemData(336 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: + ItemData(337 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BANSHEE_DISTORTION_BLASTERS: + ItemData(338 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 19, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_ROCKET_BARRAGE: + ItemData(339 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.GHOST_RESOURCE_EFFICIENCY: + ItemData(340 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 21, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_RESOURCE_EFFICIENCY: + ItemData(341 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 22, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: + ItemData(342 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.THOR), + item_names.THOR_LASER_TARGETING_SYSTEM: + ItemData(343 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 24, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: + ItemData(344 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 25, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.RAVEN_RESOURCE_EFFICIENCY: + ItemData(345 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 26, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_DURABLE_MATERIALS: + ItemData(346 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 27, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: + ItemData(347 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 28, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS: + ItemData(348 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 29, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_RESOURCE_EFFICIENCY: + ItemData(349 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 0, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.BANSHEE_HYPERFLIGHT_ROTORS: + ItemData(350 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 1, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_LASER_TARGETING_SYSTEM: + ItemData(351 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 2, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_INTERNAL_TECH_MODULE: + ItemData(352 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 3, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BATTLECRUISER_TACTICAL_JUMP: + ItemData(353 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 4, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_CLOAK: + ItemData(354 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 5, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_ATX_LASER_BATTERY: + ItemData(355 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: + ItemData(356 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 7, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: + ItemData(357 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 8, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.GHOST_EMP_ROUNDS: + ItemData(358 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 9, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GHOST), + item_names.GHOST_LOCKDOWN: + ItemData(359 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GHOST), + item_names.SPECTRE_IMPALER_ROUNDS: + ItemData(360 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 11, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: + ItemData(361 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 14, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.THOR, quantity=2), + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: + ItemData(363 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 12, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.RAVEN), + item_names.RAVEN_SPIDER_MINES: + ItemData(364 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 13, SC2Race.TERRAN, + parent=item_names.RAVEN, important_for_filtering=True), + item_names.RAVEN_RAILGUN_TURRET: + ItemData(365 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 14, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_HUNTER_SEEKER_WEAPON: + ItemData(366 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.RAVEN), + item_names.RAVEN_INTERFERENCE_MATRIX: + ItemData(367 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 16, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_ANTI_ARMOR_MISSILE: + ItemData(368 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 17, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_INTERNAL_TECH_MODULE: + ItemData(369 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 18, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: + ItemData(370 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 19, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: + ItemData(371 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 20, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_TARGETING_OPTICS: + ItemData(372 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 21, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.CYCLONE), + item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: + ItemData(373 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 22, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.LIBERATOR_CLOAK: + ItemData(374 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 23, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_LASER_TARGETING_SYSTEM: + ItemData(375 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 24, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_OPTIMIZED_LOGISTICS: + ItemData(376 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 25, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: + ItemData(377 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 26, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_EXECUTIONER_MISSILES: + ItemData(378 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 27, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: + ItemData(379 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_SHAPED_HULL: + ItemData(380 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 29, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_FLECHETTE_MISSILES: + ItemData(381 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_AFTERBURNERS: + ItemData(382 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 1, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.CYCLONE_INTERNAL_TECH_MODULE: + ItemData(383 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 2, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.LIBERATOR_SMART_SERVOS: + ItemData(384 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 3, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.LIBERATOR), + item_names.LIBERATOR_RESOURCE_EFFICIENCY: + ItemData(385 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 4, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.HERCULES_INTERNAL_FUSION_MODULE: + ItemData(386 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 5, SC2Race.TERRAN, + parent=item_names.HERCULES), + item_names.HERCULES_TACTICAL_JUMP: + ItemData(387 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 6, SC2Race.TERRAN, + parent=item_names.HERCULES), + item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: + ItemData(388 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 28, SC2Race.TERRAN, + parent=item_names.PLANETARY_FORTRESS, quantity=2), + item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS: + ItemData(389 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 7, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PLANETARY_FORTRESS), + item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: + ItemData(390 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 8, SC2Race.TERRAN, + parent=item_names.VALKYRIE), + item_names.VALKYRIE_RESOURCE_EFFICIENCY: + ItemData(391 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 9, SC2Race.TERRAN, + parent=item_names.VALKYRIE), + item_names.PREDATOR_VESPENE_SYNTHESIS: + ItemData(392 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 10, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.BATTLECRUISER_BEHEMOTH_PLATING: + ItemData(393 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 11, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE: + ItemData(394 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 12, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER), + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: + ItemData(395 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 1, SC2Race.TERRAN, + parent=parent_names.ORBITAL_COMMAND_AND_PLANETARY), + item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: + ItemData(396 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 0, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: + ItemData(397 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 1, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: + ItemData(398 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 2, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: + ItemData(399 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 3, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + # Note(mm): WoL ID 400 collides with buildings; jump forward to leave buildings room + + #Buildings + item_names.BUNKER: + ItemData(400 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MISSILE_TURRET: + ItemData(401 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SENSOR_TOWER: + ItemData(402 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 2, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEVASTATOR_TURRET: + ItemData(403 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + + item_names.WAR_PIGS: + ItemData(500 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 0, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEVIL_DOGS: + ItemData(501 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 1, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.HAMMER_SECURITIES: + ItemData(502 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 2, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SPARTAN_COMPANY: + ItemData(503 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 3, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SIEGE_BREAKERS: + ItemData(504 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 4, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.HELS_ANGELS: + ItemData(505 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 5, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DUSK_WINGS: + ItemData(506 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 6, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.JACKSONS_REVENGE: + ItemData(507 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 7, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SKIBIS_ANGELS: + ItemData(508 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 8, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEATH_HEADS: + ItemData(509 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 9, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.WINGED_NIGHTMARES: + ItemData(510 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 10, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.MIDNIGHT_RIDERS: + ItemData(511 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 11, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.BRYNHILDS: + ItemData(512 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 12, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.JOTUN: + ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + + item_names.ULTRA_CAPACITORS: + ItemData(600 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 0, SC2Race.TERRAN), + item_names.VANADIUM_PLATING: + ItemData(601 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 1, SC2Race.TERRAN), + item_names.ORBITAL_DEPOTS: + ItemData(602 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 2, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.MICRO_FILTERING: + ItemData(603 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 3, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.AUTOMATED_REFINERY: + ItemData(604 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 4, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: + ItemData(605 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 5, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.RAVEN: + ItemData(606 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 22, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SCIENCE_VESSEL: + ItemData(607 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 23, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.TECH_REACTOR: + ItemData(608 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 6, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.ORBITAL_STRIKE: + ItemData(609 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 7, SC2Race.TERRAN, + parent=parent_names.INFANTRY_UNITS), + item_names.BUNKER_SHRIKE_TURRET: + ItemData(610 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 6, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.BUNKER_FORTIFIED_BUNKER: + ItemData(611 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 7, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.PLANETARY_FORTRESS: + ItemData(612 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PERDITION_TURRET: + ItemData(613 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PREDATOR: + ItemData(614 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 24, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HERCULES: + ItemData(615 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 25, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CELLULAR_REACTOR: + ItemData(616 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 8, SC2Race.TERRAN), + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: + ItemData(617 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 4, SC2Race.TERRAN, quantity=3, + classification= ItemClassification.progression), + item_names.HIVE_MIND_EMULATOR: + ItemData(618 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 21, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_DISRUPTER: + ItemData(619 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 18, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.STRUCTURE_ARMOR: + ItemData(620 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 9, SC2Race.TERRAN), + item_names.HI_SEC_AUTO_TRACKING: + ItemData(621 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 10, SC2Race.TERRAN), + item_names.ADVANCED_OPTICS: + ItemData(622 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 11, SC2Race.TERRAN), + item_names.ROGUE_FORCES: + ItemData(623 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 12, SC2Race.TERRAN, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.MECHANICAL_KNOW_HOW: + ItemData(624 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 13, SC2Race.TERRAN), + item_names.MERCENARY_MUNITIONS: + ItemData(625 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 14, SC2Race.TERRAN), + item_names.PROGRESSIVE_FAST_DELIVERY: + ItemData(626 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 8, SC2Race.TERRAN, quantity=2, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.RAPID_REINFORCEMENT: + ItemData(627 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 16, SC2Race.TERRAN, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.FUSION_CORE_FUSION_REACTOR: + ItemData(628 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 17, SC2Race.TERRAN), + item_names.SONIC_DISRUPTER: + ItemData(629 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 19, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_SCREEN: + ItemData(630 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 20, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.ARGUS_AMPLIFIER: + ItemData(631 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 22, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_INDOCTRINATOR: + ItemData(632 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 23, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIGNAL_BEACON: + ItemData(633 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 24, SC2Race.TERRAN, parent=parent_names.TERRAN_MERCENARIES), + + # WoL Protoss takes SC2WOL + 700~708 + + item_names.SCIENCE_VESSEL_TACTICAL_JUMP: + ItemData(750 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 4, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.LIBERATOR_UED_MISSILE_TECHNOLOGY: + ItemData(751 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 5, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: + ItemData(752 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 6, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.PREDATOR_ADAPTIVE_DEFENSES: + ItemData(753 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 7, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PREDATOR), + item_names.VIKING_AESIR_TURBINES: + ItemData(754 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 8, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.MEDIVAC_RESOURCE_EFFICIENCY: + ItemData(755 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 9, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: + ItemData(756 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 10, SC2Race.TERRAN, + parent=item_names.EMPERORS_SHADOW), + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: + ItemData(757 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 11, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: + ItemData(758 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 12, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: + ItemData(759 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 13, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: + ItemData(760 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 14, SC2Race.TERRAN, + parent=parent_names.DOMINION_TROOPER_WEAPONS), + item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: + ItemData(761 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 15, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER), + item_names.SCV_CONSTRUCTION_JUMP_JETS: + ItemData(762 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 16, SC2Race.TERRAN), + item_names.WIDOW_MINE_DEMOLITION_PAYLOAD: + ItemData(763 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WIDOW_MINE), + item_names.SENSOR_TOWER_ASSISTIVE_TARGETING: + ItemData(764 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 18, SC2Race.TERRAN, + parent=item_names.SENSOR_TOWER), + item_names.SENSOR_TOWER_MUILTISPECTRUM_DOPPLER: + ItemData(765 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 19, SC2Race.TERRAN, + parent=item_names.SENSOR_TOWER), + item_names.WARHOUND_DEPLOY_TURRET: + ItemData(766 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 20, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.GHOST_BARGAIN_BIN_PRICES: + ItemData(767 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 21, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_BARGAIN_BIN_PRICES: + ItemData(768 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 22, SC2Race.TERRAN, + parent=item_names.SPECTRE), + + # Filler items to fill remaining spots + item_names.STARTING_MINERALS: + ItemData(800 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Minerals, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_VESPENE: + ItemData(801 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Vespene, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_SUPPLY: + ItemData(802 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Supply, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + # This item is used to "remove" location from the game. Never placed unless plando'd + item_names.NOTHING: + ItemData(803 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Nothing, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.trap), + item_names.MAX_SUPPLY: + ItemData(804 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.MaxSupply, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.SHIELD_REGENERATION: + ItemData(805 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.ShieldRegeneration, 1, SC2Race.PROTOSS, quantity=0, + classification=ItemClassification.filler), + item_names.BUILDING_CONSTRUCTION_SPEED: + ItemData(806 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.BuildingSpeed, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.UPGRADE_RESEARCH_SPEED: + ItemData(807 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.ResearchSpeed, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.UPGRADE_RESEARCH_COST: + ItemData(808 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.ResearchCost, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + + # Trap Filler + item_names.REDUCED_MAX_SUPPLY: + ItemData(850 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.MaxSupplyTrap, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.trap), + + + # Nova gear + item_names.NOVA_GHOST_VISOR: + ItemData(900 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 0, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.NOVA_RANGEFINDER_OCULUS: + ItemData(901 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 1, SC2Race.TERRAN), + item_names.NOVA_DOMINATION: + ItemData(902 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLINK: + ItemData(903 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: + ItemData(904 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 0, SC2Race.TERRAN, quantity=2, + classification=ItemClassification.progression), + item_names.NOVA_ENERGY_SUIT_MODULE: + ItemData(905 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_ARMORED_SUIT_MODULE: + ItemData(906 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_JUMP_SUIT_MODULE: + ItemData(907 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_C20A_CANISTER_RIFLE: + ItemData(908 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HELLFIRE_SHOTGUN: + ItemData(909 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PLASMA_RIFLE: + ItemData(910 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_MONOMOLECULAR_BLADE: + ItemData(911 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLAZEFIRE_GUNBLADE: + ItemData(912 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_STIM_INFUSION: + ItemData(913 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PULSE_GRENADES: + ItemData(914 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_FLASHBANG_GRENADES: + ItemData(915 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_IONIC_FORCE_FIELD: + ItemData(916 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HOLO_DECOY: + ItemData(917 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_NUKE: + ItemData(918 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + + # HotS + item_names.ZERGLING: + ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 0, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_QUEEN: + ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 1, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ROACH: + ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 2, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.HYDRALISK: + ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 3, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ZERGLING_BANELING_ASPECT: + ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 5, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ZERGLING), + item_names.ABERRATION: + ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 5, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.MUTALISK: + ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 6, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_HOST: + ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 7, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTOR: + ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 8, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ULTRALISK: + ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 9, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPORE_CRAWLER: + ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 10, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPINE_CRAWLER: + ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 11, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.CORRUPTOR: + ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 12, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SCOURGE: + ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 13, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BROOD_QUEEN: + ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 4, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.DEFILER: + ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 14, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_MARINE: + ItemData(16 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 15, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_BUNKER: + ItemData(17 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 16, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.NYDUS_WORM: + ItemData(18 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 17, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ECHIDNA_WORM: + ItemData(19 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 18, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_SIEGE_TANK: + ItemData(20 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 19, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_DIAMONDBACK: + ItemData(21 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 20, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_BANSHEE: + ItemData(22 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 21, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_LIBERATOR: + ItemData(23 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 22, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_MISSILE_TURRET: + ItemData(24 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 23, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.PYGALISK: + ItemData(25 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 24, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BILE_LAUNCHER: + ItemData(26 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 25, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BULLFROG: + ItemData(27 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 26, SC2Race.ZERG, + classification=ItemClassification.progression), + + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_MELEE_ATTACKER), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_MISSILE_ATTACKER), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_CARAPACE_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + # Bundles + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_CARAPACE_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + item_names.ZERGLING_HARDENED_CARAPACE: + ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 0, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.ZERGLING_ADRENAL_OVERLOAD: + ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 1, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ZERGLING_METABOLIC_BOOST: + ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 2, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ROACH_HYDRIODIC_BILE: + ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 3, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_ADAPTIVE_PLATING: + ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_TUNNELING_CLAWS: + ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 5, SC2Race.ZERG, parent=item_names.ROACH), + item_names.HYDRALISK_FRENZY: + ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.HYDRALISK_ANCILLARY_CARAPACE: + ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 7, SC2Race.ZERG, parent=item_names.HYDRALISK), + item_names.HYDRALISK_GROOVED_SPINES: + ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 8, SC2Race.ZERG, parent=item_names.HYDRALISK), + item_names.BANELING_CORROSIVE_ACID: + ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 9, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.BANELING_SOURCE), + item_names.BANELING_RUPTURE: + ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 10, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_REGENERATIVE_ACID: + ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 11, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.MUTALISK_VICIOUS_GLAIVE: + ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 12, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_RAPID_REGENERATION: + ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_SUNDERING_GLAIVE: + ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 14, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.SWARM_HOST_BURROW: + ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 15, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_RAPID_INCUBATION: + ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 16, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_PRESSURIZED_GLANDS: + ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 17, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_BURROW_CHARGE: + ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 18, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_TISSUE_ASSIMILATION: + ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 19, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_MONARCH_BLADES: + ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 20, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + item_names.CORRUPTOR_CAUSTIC_SPRAY: + ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 21, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_CORRUPTION: + ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 22, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.SCOURGE_VIRULENT_SPORES: + ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 23, SC2Race.ZERG, parent=item_names.SCOURGE), + item_names.SCOURGE_RESOURCE_EFFICIENCY: + ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 24, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SCOURGE), + item_names.SCOURGE_SWARM_SCOURGE: + ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 25, SC2Race.ZERG, parent=item_names.SCOURGE), + item_names.ZERGLING_SHREDDING_CLAWS: + ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 26, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ROACH_GLIAL_RECONSTITUTION: + ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 27, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_ORGANIC_CARAPACE: + ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 28, SC2Race.ZERG, parent=item_names.ROACH), + item_names.HYDRALISK_MUSCULAR_AUGMENTS: + ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 29, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.HYDRALISK_RESOURCE_EFFICIENCY: + ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 0, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.BANELING_CENTRIFUGAL_HOOKS: + ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 1, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_TUNNELING_JAWS: + ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 2, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_RAPID_METAMORPH: + ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 3, SC2Race.ZERG, + parent=item_names.ZERGLING_BANELING_ASPECT), + item_names.MUTALISK_SEVERING_GLAIVE: + ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: + ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 5, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: + ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 6, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_ENDURING_LOCUSTS: + ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 7, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_ORGANIC_CARAPACE: + ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 8, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_RESOURCE_EFFICIENCY: + ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 9, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_ANABOLIC_SYNTHESIS: + ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 10, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_CHITINOUS_PLATING: + ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + item_names.ULTRALISK_ORGANIC_CARAPACE: + ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 12, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_RESOURCE_EFFICIENCY: + ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 13, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.DEVOURER_CORROSIVE_SPRAY: + ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 14, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_GAPING_MAW: + ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 15, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_IMPROVED_OSMOSIS: + ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 16, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_PRESCIENT_SPORES: + ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 17, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, + classification=ItemClassification.progression), + item_names.GUARDIAN_PROLONGED_DISPERSION: + ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 18, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMAL_ADAPTATION: + ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 19, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, + classification=ItemClassification.progression), + item_names.GUARDIAN_SORONAN_ACID: + ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 20, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.IMPALER_ADAPTIVE_TALONS: + ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 21, SC2Race.ZERG, + parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.IMPALER_SECRETION_GLANDS: + ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 22, SC2Race.ZERG, + parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.IMPALER_SUNKEN_SPINES: + ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 23, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.LURKER_SEISMIC_SPINES: + ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 24, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_LURKER_ASPECT), + item_names.LURKER_ADAPTED_SPINES: + ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 25, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_LURKER_ASPECT), + item_names.RAVAGER_POTENT_BILE: + ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 26, SC2Race.ZERG, + parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_BLOATED_BILE_DUCTS: + ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 27, SC2Race.ZERG, + parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_DEEP_TUNNEL: + ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 28, SC2Race.ZERG, + classification=ItemClassification.progression_skip_balancing, parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.VIPER_PARASITIC_BOMB: + ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 29, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + classification=ItemClassification.progression), + item_names.VIPER_PARALYTIC_BARBS: + ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 0, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.VIPER_VIRULENT_MICROBES: + ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 1, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.BROOD_LORD_POROUS_CARTILAGE: + ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 2, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_BEHEMOTH_STELLARSKIN: + ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 3, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_SPLITTER_MITOSIS: + ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 4, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_RESOURCE_EFFICIENCY: + ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 5, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.INFESTOR_INFESTED_TERRAN: + ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTOR), + item_names.INFESTOR_MICROBIAL_SHROUD: + ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 7, SC2Race.ZERG, parent=item_names.INFESTOR), + item_names.SWARM_QUEEN_SPAWN_LARVAE: + ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 8, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_DEEP_TUNNEL: + ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 9, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_ORGANIC_CARAPACE: + ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 10, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: + ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: + ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 12, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: + ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 13, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.BROOD_QUEEN_FUNGAL_GROWTH: + ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 14, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENSNARE: + ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 15, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: + ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 16, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.DEFILER_PATHOGEN_PROJECTORS: + ItemData(277 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 17, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_TRAPDOOR_ADAPTATION: + ItemData(278 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 18, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_PREDATORY_CONSUMPTION: + ItemData(279 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 19, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_COMORBIDITY: + ItemData(280 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 20, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.ABERRATION_MONSTROUS_RESILIENCE: + ItemData(281 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 21, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_CONSTRUCT_REGENERATION: + ItemData(282 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 22, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_BANELING_INCUBATION: + ItemData(283 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 23, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_PROTECTIVE_COVER: + ItemData(284 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 24, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_RESOURCE_EFFICIENCY: + ItemData(285 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 25, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.CORRUPTOR_MONSTROUS_RESILIENCE: + ItemData(286 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 26, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_CONSTRUCT_REGENERATION: + ItemData(287 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 27, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_SCOURGE_INCUBATION: + ItemData(288 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 28, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_RESOURCE_EFFICIENCY: + ItemData(289 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 29, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: + ItemData(290 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 0, SC2Race.ZERG, parent=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: + ItemData(291 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 1, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.INFESTED_SCV_BUILD_CHARGES: + ItemData(292 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 2, SC2Race.ZERG, parent=parent_names.INFESTED_UNITS), + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: + ItemData(293 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 3, SC2Race.ZERG, parent=item_names.INFESTED_MARINE), + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: + ItemData(294 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 4, SC2Race.ZERG, parent=item_names.INFESTED_MARINE), + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: + ItemData(295 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 6, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: + ItemData(296 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 5, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: + ItemData(297 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 7, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: + ItemData(298 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 6, SC2Race.ZERG, parent=item_names.INFESTED_MISSILE_TURRET), + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: + ItemData(299 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 7, SC2Race.ZERG, parent=item_names.INFESTED_MISSILE_TURRET), + + item_names.ZERGLING_RAPTOR_STRAIN: + ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 0, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ZERGLING_SWARMLING_STRAIN: + ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 1, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.ROACH_VILE_STRAIN: + ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 2, SC2Race.ZERG, parent=item_names.ROACH), + item_names.ROACH_CORPSER_STRAIN: + ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 3, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.HYDRALISK_IMPALER_ASPECT: + ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 0, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_HYDRALISK), + item_names.HYDRALISK_LURKER_ASPECT: + ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 1, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_HYDRALISK), + item_names.BANELING_SPLITTER_STRAIN: + ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.BANELING_SOURCE), + item_names.BANELING_HUNTER_STRAIN: + ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 7, SC2Race.ZERG, parent=parent_names.BANELING_SOURCE), + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: + ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 2, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: + ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 3, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.SWARM_HOST_CARRION_STRAIN: + ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 10, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_CREEPER_STRAIN: + ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 11, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_NOXIOUS_STRAIN: + ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 12, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_TORRASQUE_STRAIN: + ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + + item_names.TYRANNOZOR_TYRANTS_PROTECTION: + ItemData(350 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 8, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: + ItemData(351 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 9, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_IMPALING_STRIKE: + ItemData(352 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 10, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_HEALING_ADAPTATION: + ItemData(353 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES: + ItemData(354 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 12, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN: + ItemData(355 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 13, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY: + ItemData(356 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 14, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.ECHIDNA_WORM_OUROBOROS_STRAIN: + ItemData(357 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 15, SC2Race.ZERG, parent=parent_names.ZERG_OUROBOUROS_CONDITION), + item_names.NYDUS_WORM_RAVENOUS_APPETITE: + ItemData(358 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 16, SC2Race.ZERG, parent=item_names.NYDUS_WORM), + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: + ItemData(359 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 0, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.INFESTED_SIEGE_TANK, quantity=2), + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: + ItemData(360 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 17, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: + ItemData(361 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 18, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: + ItemData(362 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 19, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: + ItemData(363 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 20, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: + ItemData(364 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 21, SC2Race.ZERG, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: + ItemData(365 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 22, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: + ItemData(366 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 23, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_LIBERATOR), + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: + ItemData(367 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 24, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR), + item_names.GUARDIAN_PROPELLANT_SACS: + ItemData(368 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 25, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_EXPLOSIVE_SPORES: + ItemData(369 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 26, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMORDIAL_FURY: + ItemData(370 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 27, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: + ItemData(371 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 28, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS: + ItemData(372 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 29, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: + ItemData(373 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 0, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: + ItemData(374 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 2, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.INFESTED_DIAMONDBACK, quantity=2), + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: + ItemData(375 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 1, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER: + ItemData(376 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 2, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER: + ItemData(377 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 3, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER: + ItemData(378 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 4, SC2Race.ZERG, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER: + ItemData(379 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 5, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR), + item_names.INFESTED_LIBERATOR_DEFENDER_MODE: + ItemData(380 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 8, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR, + classification=ItemClassification.progression), + item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH: + ItemData(381 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ABERRATION, quantity=2), + item_names.PYGALISK_STIM: + ItemData(382 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 9, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.PYGALISK_DUCAL_BLADES: + ItemData(383 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 10, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.PYGALISK_COMBAT_CARAPACE: + ItemData(384 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 11, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.BILE_LAUNCHER_ARTILLERY_DUCTS: + ItemData(385 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 12, SC2Race.ZERG, parent=item_names.BILE_LAUNCHER), + item_names.BILE_LAUNCHER_RAPID_BOMBARMENT: + ItemData(386 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.BILE_LAUNCHER), + item_names.BULLFROG_WILD_MUTATION: + ItemData(387 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 14, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_BROODLINGS: + ItemData(388 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 15, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_HARD_IMPACT: + ItemData(389 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 16, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_RANGE: + ItemData(390 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 17, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.SPORE_CRAWLER_BIO_BONUS: + ItemData(391 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 18, SC2Race.ZERG, parent=item_names.SPORE_CRAWLER), + + item_names.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 0, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 5, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 0, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.OVERLORD_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 6, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 7, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 8, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 5, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 9, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 10, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 11, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 12, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 13, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 14, SC2Race.ZERG, classification=ItemClassification.progression), + # Handled separately from other abilities + item_names.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Primal_Form, 0, SC2Race.ZERG), + item_names.KERRIGAN_ASSIMILATION_AURA: ItemData(422 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 15, SC2Race.ZERG), + item_names.KERRIGAN_IMMOBILIZATION_WAVE: ItemData(423 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 16, SC2Race.ZERG, classification=ItemClassification.progression), + + item_names.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 10, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 9, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 8, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 7, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 6, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 5, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 4, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 3, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 2, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 1, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 14, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 35, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 70, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + + # Zerg Mercs + item_names.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 0, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.INFESTED_SIEGE_BREAKERS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 1, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.INFESTED_DUSK_WINGS: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 2, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.DEVOURING_ONES: ItemData(603 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 3, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.HUNTER_KILLERS: ItemData(604 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 4, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.TORRASQUE_MERC: ItemData(605 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 5, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.HUNTERLING: ItemData(606 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 6, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.YGGDRASIL: ItemData(607 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 7, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.CAUSTIC_HORRORS: ItemData(608 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 8, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + + + # Misc Upgrades + item_names.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 6, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.OVERLORD_GENERATE_CREEP: ItemData(701 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 7, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.OVERLORD_ANTENNAE: ItemData(702 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 8, SC2Race.ZERG), + item_names.OVERLORD_PNEUMATIZED_CARAPACE: ItemData(703 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 9, SC2Race.ZERG), + item_names.ZERG_EXCAVATING_CLAWS: ItemData(704 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 11, SC2Race.ZERG, parent=parent_names.ZERG_UPROOTABLE_BUILDINGS), + item_names.ZERG_CREEP_STOMACH: ItemData(705 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 10, SC2Race.ZERG), + item_names.HIVE_CLUSTER_MATURATION: ItemData(706 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 12, SC2Race.ZERG), + item_names.MACROSCOPIC_RECUPERATION: ItemData(707 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 13, SC2Race.ZERG), + item_names.BIOMECHANICAL_STOCKPILING: ItemData(708 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 14, SC2Race.ZERG, parent=parent_names.INFESTED_FACTORY_OR_STARPORT), + item_names.BROODLING_SPORE_SATURATION: ItemData(709 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 15, SC2Race.ZERG), + item_names.CELL_DIVISION: ItemData(710 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 16, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.SELF_SUFFICIENT: ItemData(711 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 17, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.UNRESTRICTED_MUTATION: ItemData(712 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 18, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.EVOLUTIONARY_LEAP: ItemData(713 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 19, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + + # Morphs + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 7, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 8, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ROACH), + item_names.OVERLORD_OVERSEER_ASPECT: ItemData(803 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ROACH_PRIMAL_IGNITER_ASPECT: ItemData(804 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 9, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ROACH), + item_names.ULTRALISK_TYRANNOZOR_ASPECT: ItemData(805 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 10, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ULTRALISK), + + # Protoss Units + # The first several are in SC2WOL offset for historical reasons (show up in prophecy) + item_names.ZEALOT: + ItemData(700 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALKER: + ItemData(701 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HIGH_TEMPLAR: + ItemData(702 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_TEMPLAR: + ItemData(703 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.IMMORTAL: + ItemData(704 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.COLOSSUS: + ItemData(705 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.PHOENIX: + ItemData(706 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VOID_RAY: + ItemData(707 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CARRIER: + ItemData(708 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.OBSERVER: + ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 9, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CENTURION: + ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTINEL: + ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SUPPLICANT: + ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 12, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.INSTIGATOR: + ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SLAYER: + ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTRY: + ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 15, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ENERGIZER: + ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 16, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HAVOC: + ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 17, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SIGNIFIER: + ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 18, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ASCENDANT: + ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 19, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.AVENGER: + ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 20, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.BLOOD_HUNTER: + ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 21, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DRAGOON: + ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 22, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_ARCHON: + ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 23, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ADEPT: + ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 24, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WARP_PRISM: + ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 25, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ANNIHILATOR: + ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 26, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VANGUARD: + ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 27, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WRATHWALKER: + ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 28, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.REAVER: + ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 29, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DISRUPTOR: + ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MIRAGE: + ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CORSAIR: + ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DESTROYER: + ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SCOUT: + ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TEMPEST: + ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MOTHERSHIP: + ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ARBITER: + ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ORACLE: + ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALWART: + ItemData(30 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 9, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.PULSAR: + ItemData(31 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DAWNBRINGER: + ItemData(32 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKYLORD: + ItemData(33 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 12, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TRIREME: + ItemData(34 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKIRMISHER: + ItemData(35 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + # 36, 37 reserved for Mothership + item_names.OPPRESSOR: + ItemData(38 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 17, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CALADRIUS: + ItemData(39 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 18, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MISTWING: + ItemData(40 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 19, SC2Race.PROTOSS, + classification=ItemClassification.progression), + + # Protoss Upgrades + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + # Bundles + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Protoss Buildings + item_names.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + + # Protoss Unit Upgrades + item_names.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 0, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 1, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.SUPPLICANT_ENDLESS_SERVITUDE: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 2, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 3, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 4, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ADEPT), + item_names.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 5, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 6, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.STALKER_CLASS), + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.STALKER_CLASS), + item_names.DRAGOON_CONCENTRATED_ANTIMATTER: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 8, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 9, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 10, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 11, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 12, SC2Race.PROTOSS, parent=parent_names.SCOUT_CLASS), + item_names.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 13, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 14, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SCOUT_CLASS), + item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 15, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SCOUT_OR_OPPRESSOR_OR_MISTWING), + item_names.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 18, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 19, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), + item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 20, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), + item_names.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 21, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 22, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 23, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 24, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 25, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.ORACLE_SKYWARD_CHRONOANOMALY: ItemData(544 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 26, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ORACLE), + item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 28, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 29, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 0, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 1, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_JUDICATORS_VEIL: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 2, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: + ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS, parent=parent_names.CARRIER_OR_TRIREME), + item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: + ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 4, SC2Race.PROTOSS, parent=parent_names.CARRIER_CLASS), + item_names.VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES: + ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 5, SC2Race.PROTOSS, parent=parent_names.VOID_RAY_CLASS), + item_names.DESTROYER_RESOURCE_EFFICIENCY: ItemData(535 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 6, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DESTROYER), + item_names.WARP_PRISM_GRAVITIC_DRIVE: + ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 7, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.WARP_PRISM_PHASE_BLASTER: + ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression, parent=item_names.WARP_PRISM), + item_names.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 9, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 10, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 11, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 12, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 13, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 14, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 15, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 16, SC2Race.PROTOSS, parent=item_names.VANGUARD), + item_names.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 17, SC2Race.PROTOSS, parent=item_names.VANGUARD), + item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 18, SC2Race.PROTOSS, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 19, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.COLOSSUS), + item_names.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.WRATHWALKER), + item_names.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 22, SC2Race.PROTOSS, parent=item_names.WRATHWALKER), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 23, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 24, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 26, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 28, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 29, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 0, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 1, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.ARCHON_SOURCE), + item_names.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 2, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 3, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 4, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SUPPLICANT_AND_ASCENDANT), + item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 6, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 7, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 8, SC2Race.PROTOSS, parent=parent_names.SENTRY_CLASS), + item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 9, SC2Race.PROTOSS, parent=parent_names.SENTRY_CLASS_OR_SHIELD_BATTERY), + item_names.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 10, SC2Race.PROTOSS, parent=item_names.SENTRY), + item_names.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 11, SC2Race.PROTOSS, parent=item_names.SENTRY), + item_names.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 12, SC2Race.PROTOSS, parent=item_names.ENERGIZER), + item_names.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 13, SC2Race.PROTOSS, parent=item_names.ENERGIZER), + item_names.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 14, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 15, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 16, SC2Race.PROTOSS, parent=parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION), + item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 17, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION), + item_names.ORACLE_BOSONIC_CORE: ItemData(378 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 18, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.SCOUT_RESOURCE_EFFICIENCY: ItemData(379 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 19, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: ItemData(380 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 20, SC2Race.PROTOSS, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.DISRUPTOR_CLOAKING_MODULE: ItemData(381 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 21, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.DISRUPTOR_PERFECTED_POWER: ItemData(382 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 22, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DISRUPTOR), + item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: ItemData(383 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 23, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.TEMPEST_INTERPLANETARY_RANGE: ItemData(384 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 24, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: ItemData(385 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 25, SC2Race.PROTOSS, parent=item_names.DAWNBRINGER), + item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: ItemData(386 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 26, SC2Race.PROTOSS, parent=item_names.DAWNBRINGER), + item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: ItemData(387 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 27, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_REINTEGRATED_FRAMEWORK: ItemData(388 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 28, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_STABILIZED_ELECTRODES: ItemData(389 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 29, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_LATTICED_SHIELDING: ItemData(390 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 0, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.ARCHON_TRANSCENDENCE: ItemData(391 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 1, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_POWER_SIPHON: ItemData(392 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 2, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_ERADICATE: ItemData(393 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 3, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_OBLITERATE: ItemData(394 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 4, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.SUPPLICANT_ZENITH_PITCH: ItemData(395 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 5, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.SUPPLICANT), + item_names.PULSAR_CHRONOCLYSM: ItemData(396 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 6, SC2Race.PROTOSS, parent=item_names.PULSAR), + item_names.PULSAR_ENTROPIC_REVERSAL: ItemData(397 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 7, SC2Race.PROTOSS, parent=item_names.PULSAR), + # 398-407 reserved for Mothership + item_names.OPPRESSOR_ACCELERATED_WARP: ItemData(408 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 18, SC2Race.PROTOSS, parent=item_names.OPPRESSOR), + item_names.OPPRESSOR_ARMOR_MELTING_BLASTERS: ItemData(409 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 19, SC2Race.PROTOSS, parent=item_names.OPPRESSOR), + item_names.CALADRIUS_SIDE_MISSILES: ItemData(410 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 20, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.CALADRIUS_STRUCTURE_TARGETING: ItemData(411 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 21, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.CALADRIUS_SOLARITE_REACTOR: ItemData(412 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 22, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.MISTWING_NULL_SHROUD: ItemData(413 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 23, SC2Race.PROTOSS, parent=item_names.MISTWING), + item_names.MISTWING_PILOT: ItemData(414 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 24, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.MISTWING), + item_names.INSTIGATOR_BLINK_OVERDRIVE: ItemData(415 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.INSTIGATOR), + item_names.INSTIGATOR_RECONSTRUCTION: ItemData(416 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 26, SC2Race.PROTOSS, parent=item_names.INSTIGATOR), + item_names.DARK_TEMPLAR_ARCHON_MERGE: ItemData(417 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.ASCENDANT_ARCHON_MERGE: ItemData(418 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 28, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.ASCENDANT), + item_names.SCOUT_SUPPLY_EFFICIENCY: ItemData(419 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 29, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.REAVER_BARGAIN_BIN_PRICES: ItemData(420 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_5, 0, SC2Race.PROTOSS, parent=item_names.SCOUT), + + + # War Council + item_names.ZEALOT_WHIRLWIND: ItemData(500 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ZEALOT), + item_names.CENTURION_RESOURCE_EFFICIENCY: ItemData(501 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 1, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: ItemData(502 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 2, SC2Race.PROTOSS, parent=item_names.SENTINEL), + item_names.STALKER_PHASE_REACTOR: ItemData(503 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.STALKER), + item_names.DRAGOON_PHALANX_SUIT: ItemData(504 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 4, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.INSTIGATOR_MODERNIZED_SERVOS: ItemData(505 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.INSTIGATOR), + item_names.ADEPT_DISRUPTIVE_TRANSFER: ItemData(506 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 6, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.SLAYER_PHASE_BLINK: ItemData(507 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SLAYER), + item_names.AVENGER_KRYHAS_CLOAK: ItemData(508 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.AVENGER), + item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: ItemData(509 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 9, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: ItemData(510 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: ItemData(511 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 11, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.BLOOD_HUNTER), + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: ItemData(512 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SENTRY), + item_names.ENERGIZER_MOBILE_CHRONO_BEAM: ItemData(513 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 13, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ENERGIZER), + item_names.HAVOC_ENDURING_SIGHT: ItemData(514 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 14, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.HIGH_TEMPLAR_PLASMA_SURGE: ItemData(515 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 15, SC2Race.PROTOSS, parent=item_names.HIGH_TEMPLAR), + item_names.SIGNIFIER_FEEDBACK: ItemData(516 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SIGNIFIER), + item_names.ASCENDANT_BREATH_OF_CREATION: ItemData(517 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 17, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.DARK_ARCHON_INDOMITABLE_WILL: ItemData(518 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 18, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.IMMORTAL_IMPROVED_BARRIER: ItemData(519 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 19, SC2Race.PROTOSS, parent=item_names.IMMORTAL), + item_names.VANGUARD_RAPIDFIRE_CANNON: ItemData(520 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.VANGUARD), + item_names.VANGUARD_FUSION_MORTARS: ItemData(521 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.VANGUARD), + item_names.ANNIHILATOR_TWILIGHT_CHASSIS: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, parent=item_names.ANNIHILATOR), + item_names.STALWART_ARC_INDUCERS: ItemData(523 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 23, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.COLOSSUS_FIRE_LANCE: ItemData(524 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 24, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.COLOSSUS), + item_names.WRATHWALKER_AERIAL_TRACKING: ItemData(525 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.WRATHWALKER), + item_names.REAVER_KHALAI_REPLICATORS: ItemData(526 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 26, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.REAVER), + item_names.DISRUPTOR_MOBILITY_PROTOCOLS: ItemData(527 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 27, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.WARP_PRISM_WARP_REFRACTION: ItemData(528 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 28, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.OBSERVER_INDUCE_SCOPOPHOBIA: ItemData(529 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 29, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: ItemData(530 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 0, SC2Race.PROTOSS, parent=item_names.PHOENIX), + item_names.CORSAIR_NETWORK_DISRUPTION: ItemData(531 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 1, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.MIRAGE_GRAVITON_BEAM: ItemData(532 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 2, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.MIRAGE), + item_names.SKIRMISHER_PEER_CONTEMPT: ItemData(533 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SKIRMISHER), + item_names.VOID_RAY_PRISMATIC_RANGE: ItemData(534 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 4, SC2Race.PROTOSS, parent=item_names.VOID_RAY), + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DESTROYER), + item_names.PULSAR_CHRONO_SHEAR: ItemData(536 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 6, SC2Race.PROTOSS, parent=item_names.PULSAR), + item_names.DAWNBRINGER_SOLARITE_LENS: ItemData(537 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DAWNBRINGER), + item_names.CARRIER_REPAIR_DRONES: ItemData(538 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CARRIER), + item_names.SKYLORD_JUMP: ItemData(539 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 9, SC2Race.PROTOSS, parent=item_names.SKYLORD), + item_names.TRIREME_SOLAR_BEAM: ItemData(540 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.TRIREME), + item_names.TEMPEST_DISINTEGRATION: ItemData(541 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 11, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.SCOUT_EXPEDITIONARY_HULL: ItemData(542 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 12, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.ARBITER_VESSEL_OF_THE_CONCLAVE: ItemData(543 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 13, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 14, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.MOTHERSHIP_INTEGRATED_POWER: ItemData(545 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 15, SC2Race.PROTOSS, parent=item_names.MOTHERSHIP), + # 546-549 reserved for Mothership + item_names.OPPRESSOR_VULCAN_BLASTER: ItemData(550 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.OPPRESSOR), + item_names.CALADRIUS_CORONA_BEAM: ItemData(551 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CALADRIUS), + item_names.MISTWING_PHANTOM_DASH: ItemData(552 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 22, SC2Race.PROTOSS, parent=item_names.MISTWING), + item_names.SUPPLICANT_SACRIFICE: ItemData(553 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 23, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + + # SoA Calldown powers + item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS), + item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2, classification=ItemClassification.progression), + item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 3, SC2Race.PROTOSS), + item_names.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 4, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 5, SC2Race.PROTOSS), + item_names.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 6, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 9, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS, classification=ItemClassification.progression), + + # Generic Protoss Upgrades + item_names.MATRIX_OVERLOAD: + ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.QUATRO: + ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.NEXUS_OVERCHARGE: + ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression, important_for_filtering=True), + item_names.ORBITAL_ASSIMILATORS: + ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 3, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.WARP_HARMONIZATION: + ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 4, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing), + item_names.GUARDIAN_SHELL: + ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 5, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.RECONSTRUCTION_BEAM: + ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.OVERWATCH: + ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SUPERIOR_WARP_GATES: + ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 8, SC2Race.PROTOSS), + item_names.ENHANCED_TARGETING: + ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 9, SC2Race.PROTOSS, parent=parent_names.PROTOSS_STATIC_DEFENSE), + item_names.OPTIMIZED_ORDNANCE: + ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 10, SC2Race.PROTOSS, parent=parent_names.PROTOSS_ATTACKING_BUILDING), + item_names.KHALAI_INGENUITY: + ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 11, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.AMPLIFIED_ASSIMILATORS: + ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 12, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.PROGRESSIVE_WARP_RELOCATE: + ItemData(813 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 2, SC2Race.PROTOSS, quantity=2, + classification=ItemClassification.progression), + item_names.PROBE_WARPIN: + ItemData(814 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 13, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.ELDER_PROBES: + ItemData(815 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 14, SC2Race.PROTOSS, classification=ItemClassification.progression), +} + +# Add keys to item table +# Mission keys (key offset + 0-999) +# Mission IDs start at 1 so the item IDs are moved down a space +mission_key_item_table = { + item_names._TEMPLATE_MISSION_KEY.format(mission.mission_name): + ItemData(mission.id - 1 + SC2_KEY_ITEM_ID_OFFSET, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for mission in SC2Mission +} +# Numbered layout keys (key offset + 1000 - 1999) +numbered_layout_key_item_table = { + item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Numbered campaign keys (key offset + 2000 - 2999) +numbered_campaign_key_item_table = { + item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 2, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Flavor keys (key offset + 3000 - 3999) +flavor_key_item_table = { + item_names._TEMPLATE_FLAVOR_KEY.format(name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 3, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, name) in enumerate(item_names._flavor_key_names) +} +# Named layout keys (key offset + 4000 - 4999) +campaign_to_layout_names = get_used_layout_names() +named_layout_key_item_table = { + item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(layout_name, campaign.campaign_name): + ItemData(layout_start + i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 4, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (campaign, (layout_start, layout_names)) in campaign_to_layout_names.items() for (i, layout_name) in enumerate(layout_names) +} +# Named campaign keys (key offset + 5000 - 5999) +campaign_names = [campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL] +named_campaign_key_item_table = { + item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(campaign_name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 5, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, campaign_name) in enumerate(campaign_names) +} +# Numbered progressive keys (key offset + 6000 - 6999) +numbered_progressive_keys = { + item_names._TEMPLATE_PROGRESSIVE_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 6, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Special keys (key offset + 7000 - 7999) +special_keys = { + item_names.PROGRESSIVE_MISSION_KEY: + ItemData(0 + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 7, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0), + item_names.PROGRESSIVE_QUESTLINE_KEY: + ItemData(1 + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 7, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0), +} +key_item_table = {} +key_item_table.update(mission_key_item_table) +key_item_table.update(numbered_layout_key_item_table) +key_item_table.update(numbered_campaign_key_item_table) +key_item_table.update(flavor_key_item_table) +key_item_table.update(named_layout_key_item_table) +key_item_table.update(named_campaign_key_item_table) +key_item_table.update(numbered_progressive_keys) +key_item_table.update(special_keys) +item_table.update(key_item_table) + +def get_item_table(): + return item_table + + +basic_units = { + SC2Race.TERRAN: { + item_names.MARINE, + item_names.MARAUDER, + item_names.DOMINION_TROOPER, + item_names.GOLIATH, + item_names.HELLION, + item_names.VULTURE, + item_names.WARHOUND, + }, + SC2Race.ZERG: { + item_names.SWARM_QUEEN, + item_names.ROACH, + item_names.HYDRALISK, + }, + SC2Race.PROTOSS: { + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.ADEPT, + } +} + +advanced_basic_units = { + SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ + item_names.REAPER, + item_names.DIAMONDBACK, + item_names.VIKING, + item_names.SIEGE_TANK, + item_names.BANSHEE, + item_names.THOR, + item_names.BATTLECRUISER, + item_names.CYCLONE + }), + SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ + item_names.INFESTED_BANSHEE, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTOR, + item_names.ABERRATION, + }), + SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ + item_names.DARK_TEMPLAR, + item_names.DRAGOON, + item_names.AVENGER, + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.SKIRMISHER, + }) +} + +no_logic_basic_units = { + SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ + item_names.FIREBAT, + item_names.GHOST, + item_names.SPECTRE, + item_names.WRAITH, + item_names.RAVEN, + item_names.PREDATOR, + item_names.LIBERATOR, + item_names.HERC, + }), + SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ + item_names.ZERGLING, + item_names.PYGALISK, + item_names.INFESTED_SIEGE_TANK, + item_names.ULTRALISK, + item_names.SWARM_HOST + }), + SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ + item_names.BLOOD_HUNTER, + item_names.STALWART, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.TEMPEST, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.DAWNBRINGER, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.SCOUT, + item_names.OPPRESSOR, + item_names.MISTWING, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + item_names.SUPPLICANT, + }) +} + +not_balanced_starting_units = { + item_names.SIEGE_TANK, + item_names.THOR, + item_names.BANSHEE, + item_names.BATTLECRUISER, + item_names.ULTRALISK, + item_names.CARRIER, + item_names.TEMPEST, +} + + +# Defense rating table +# Commented defense ratings are handled in LogicMixin +tvx_defense_ratings = { + item_names.SIEGE_TANK: 5, + # "Graduating Range": 1, + item_names.PLANETARY_FORTRESS: 3, + # Bunker w/ Marine/Marauder: 3, + item_names.PERDITION_TURRET: 2, + item_names.DEVASTATOR_TURRET: 2, + item_names.VULTURE: 1, + item_names.BANSHEE: 1, + item_names.BATTLECRUISER: 1, + item_names.LIBERATOR: 4, + item_names.WIDOW_MINE: 1, + # "Concealment (Widow Mine)": 1 +} +tvz_defense_ratings = { + item_names.PERDITION_TURRET: 2, + # Bunker w/ Firebat: 2, + item_names.LIBERATOR: -2, + item_names.HIVE_MIND_EMULATOR: 3, + item_names.PSI_DISRUPTER: 3, +} +tvx_air_defense_ratings = { + item_names.MISSILE_TURRET: 2, +} +zvx_defense_ratings = { + # Note that this doesn't include Kerrigan because this is just for race swaps, which doesn't involve her (for now) + item_names.SPINE_CRAWLER: 3, + # w/ Twin Drones: 1 + item_names.SWARM_QUEEN: 1, + item_names.SWARM_HOST: 1, + # impaler: 3 + # "Hardened Tentacle Spines (Impaler)": 2 + # lurker: 1 + # "Seismic Spines (Lurker)": 2 + # "Adapted Spines (Lurker)": 1 + # brood lord : 2 + # corpser roach: 1 + # creep tumors (swarm queen or overseer): 1 + # w/ malignant creep: 1 + # tanks with ammo: 5 + item_names.INFESTED_BUNKER: 3, + item_names.BILE_LAUNCHER: 2, +} +# zvz_defense_ratings = { + # corpser roach: 1 + # primal igniter: 2 + # lurker: 1 + # w/ adapted spines: -1 + # impaler: -1 +# } +zvx_air_defense_ratings = { + item_names.SPORE_CRAWLER: 2, + # w/ Twin Drones: 1 + item_names.INFESTED_MISSILE_TURRET: 2, +} +pvx_defense_ratings = { + item_names.PHOTON_CANNON: 2, + item_names.KHAYDARIN_MONOLITH: 3, + item_names.SHIELD_BATTERY: 1, + item_names.NEXUS_OVERCHARGE: 2, + item_names.SKYLORD: 1, + item_names.MATRIX_OVERLOAD: 1, + item_names.COLOSSUS: 1, + item_names.VANGUARD: 1, + item_names.REAVER: 1, +} +pvz_defense_ratings = { + item_names.KHAYDARIN_MONOLITH: -2, + item_names.COLOSSUS: 1, +} + +terran_passive_ratings = { + item_names.AUTOMATED_REFINERY: 4, + item_names.COMMAND_CENTER_MULE: 4, + item_names.ORBITAL_DEPOTS: 2, + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: 2, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: 2, + item_names.MICRO_FILTERING: 2, + item_names.TECH_REACTOR: 2 +} + +zerg_passive_ratings = { + item_names.TWIN_DRONES: 7, + item_names.AUTOMATED_EXTRACTORS: 4, + item_names.VESPENE_EFFICIENCY: 3, + item_names.OVERLORD_IMPROVED_OVERLORDS: 4, + item_names.MALIGNANT_CREEP: 2 +} + +protoss_passive_ratings = { + item_names.QUATRO: 4, + item_names.ORBITAL_ASSIMILATORS: 4, + item_names.AMPLIFIED_ASSIMILATORS: 3, + item_names.PROBE_WARPIN: 2, + item_names.ELDER_PROBES: 2, + item_names.MATRIX_OVERLOAD: 2 +} + +soa_energy_ratings = { + item_names.SOA_SOLAR_LANCE: 8, + item_names.SOA_DEPLOY_FENIX: 7, + item_names.SOA_TEMPORAL_FIELD: 6, + item_names.SOA_PROGRESSIVE_PROXY_PYLON: 5, # Requires Lvl 2 (Warp in Reinforcements) + item_names.SOA_SHIELD_OVERCHARGE: 5, + item_names.SOA_ORBITAL_STRIKE: 4 +} + +soa_passive_ratings = { + item_names.GUARDIAN_SHELL: 4, + item_names.OVERWATCH: 2 +} + +soa_ultimate_ratings = { + item_names.SOA_TIME_STOP: 4, + item_names.SOA_PURIFIER_BEAM: 3, + item_names.SOA_SOLAR_BOMBARDMENT: 3 +} + +kerrigan_levels = [ + item_name for item_name, item_data in item_table.items() + if item_data.type == ZergItemType.Level and item_data.race == SC2Race.ZERG +] + + +spear_of_adun_calldowns = { + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT +} + +spear_of_adun_castable_passives = { + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.GUARDIAN_SHELL, +} + +nova_equipment = { + *[item_name for item_name, item_data in get_full_item_list().items() + if item_data.type == TerranItemType.Nova_Gear], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE +} + +upgrade_bundles: Dict[str, List[str]] = { + # Terran + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON + ], + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + # Zerg + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK + ], + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + # Protoss + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON + ], + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], +} + +# Used for logic +upgrade_bundle_inverted_lookup: Dict[str, List[str]] = dict() +for key, values in upgrade_bundles.items(): + for value in values: + if upgrade_bundle_inverted_lookup.get(value) is None: + upgrade_bundle_inverted_lookup[value] = list() + if (value != item_names.PROGRESSIVE_PROTOSS_SHIELDS + or key not in [ + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE + ] + ): + # Shield handling is trickier as it's max of Ground/Air group, not their sum + upgrade_bundle_inverted_lookup[value].append(key) + +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if + data.code} + +upgrade_item_types = (TerranItemType.Upgrade, ZergItemType.Upgrade, ProtossItemType.Upgrade) diff --git a/worlds/sc2/item/parent_names.py b/worlds/sc2/item/parent_names.py new file mode 100644 index 00000000..8bf33bec --- /dev/null +++ b/worlds/sc2/item/parent_names.py @@ -0,0 +1,57 @@ +""" +Identifiers for complex item parent structures. +Defined separately from item_parents to avoid a circular import +item_names -> item_parent_names -> item_tables -> item_parents +""" + +# Terran +DOMINION_TROOPER_WEAPONS = "Dominion Trooper Weapons" +INFANTRY_UNITS = "Infantry Units" +INFANTRY_WEAPON_UNITS = "Infantry Weapon Units" +ORBITAL_COMMAND_AND_PLANETARY = "Orbital Command Abilities + Planetary Fortress" # MULE | Scan | Supply Drop +SIEGE_TANK_AND_TRANSPORT = "Siege Tank + Transport" +SIEGE_TANK_AND_MEDIVAC = "Siege Tank + Medivac" +SPIDER_MINE_SOURCE = "Spider Mine Source" +STARSHIP_UNITS = "Starship Units" +STARSHIP_WEAPON_UNITS = "Starship Weapon Units" +VEHICLE_UNITS = "Vehicle Units" +VEHICLE_WEAPON_UNITS = "Vehicle Weapon Units" +TERRAN_MERCENARIES = "Terran Mercenaries" + +# Zerg +ANY_NYDUS_WORM = "Any Nydus Worm" +BANELING_SOURCE = "Any Baneling Source" # Baneling aspect | Kerrigan Spawn Banelings +INFESTED_UNITS = "Infested Units" +INFESTED_FACTORY_OR_STARPORT = "Infested Factory or Starport" +MORPH_SOURCE_AIR = "Air Morph Source" # Morphling | Mutalisk | Corruptor +MORPH_SOURCE_ROACH = "Roach Morph Source" # Morphling | Roach +MORPH_SOURCE_ZERGLING = "Zergling Morph Source" # Morphling | Zergling +MORPH_SOURCE_HYDRALISK = "Hydralisk Morph Source" # Morphling | Hydralisk +MORPH_SOURCE_ULTRALISK = "Ultralisk Morph Source" # Morphling | Ultralisk +ZERG_UPROOTABLE_BUILDINGS = "Zerg Uprootable Buildings" +ZERG_MELEE_ATTACKER = "Zerg Melee Attacker" +ZERG_MISSILE_ATTACKER = "Zerg Missile Attacker" +ZERG_CARAPACE_UNIT = "Zerg Carapace Unit" +ZERG_FLYING_UNIT = "Zerg Flying Unit" +ZERG_MERCENARIES = "Zerg Mercenaries" +ZERG_OUROBOUROS_CONDITION = "Zerg Ourobouros Condition" + +# Protoss +ARCHON_SOURCE = "Any Archon Source" +CARRIER_CLASS = "Carrier Class" +CARRIER_OR_TRIREME = "Carrier | Trireme" +DARK_ARCHON_SOURCE = "Dark Archon Source" +DARK_TEMPLAR_CLASS = "Dark Templar Class" +STORM_CASTER = "Storm Caster" +IMMORTAL_OR_ANNIHILATOR = "Immortal | Annihilator" +PHOENIX_CLASS = "Phoenix Class" +SENTRY_CLASS = "Sentry Class" +SENTRY_CLASS_OR_SHIELD_BATTERY = "Sentry Class | Shield Battery" +STALKER_CLASS = "Stalker Class" +SUPPLICANT_AND_ASCENDANT = "Supplicant + Ascendant" +VOID_RAY_CLASS = "Void Ray Class" +ZEALOT_OR_SENTINEL_OR_CENTURION = "Zealot | Sentinel | Centurion" +PROTOSS_STATIC_DEFENSE = "Protoss Static Defense" +PROTOSS_ATTACKING_BUILDING = "Protoss Attacking Structure" +SCOUT_CLASS = "Scout Class" +SCOUT_OR_OPPRESSOR_OR_MISTWING = "Scout | Oppressor | Mist Wing" diff --git a/worlds/sc2/location_groups.py b/worlds/sc2/location_groups.py new file mode 100644 index 00000000..c353558f --- /dev/null +++ b/worlds/sc2/location_groups.py @@ -0,0 +1,40 @@ +""" +Location group definitions +""" + +from typing import Dict, Set, Iterable +from .locations import DEFAULT_LOCATION_LIST, LocationData +from .mission_tables import lookup_name_to_mission, MissionFlag + +def get_location_groups() -> Dict[str, Set[str]]: + result: Dict[str, Set[str]] = {} + locations: Iterable[LocationData] = DEFAULT_LOCATION_LIST + + for location in locations: + if location.code is None: + # Beat events + continue + mission = lookup_name_to_mission.get(location.region) + if mission is None: + continue + + if (MissionFlag.HasRaceSwap|MissionFlag.RaceSwap) & mission.flags: + # Location group including race-swapped variants of a location + agnostic_location_name = ( + location.name + .replace(' (Terran)', '') + .replace(' (Protoss)', '') + .replace(' (Zerg)', '') + ) + result.setdefault(agnostic_location_name, set()).add(location.name) + + # Location group including all locations in all raceswaps + result.setdefault(mission.mission_name[:mission.mission_name.find(' (')], set()).add(location.name) + + # Location group including all locations in a mission + result.setdefault(mission.mission_name, set()).add(location.name) + + # Location group by location category + result.setdefault(location.type.name.title(), set()).add(location.name) + + return result diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py new file mode 100644 index 00000000..0e00f4d7 --- /dev/null +++ b/worlds/sc2/locations.py @@ -0,0 +1,14175 @@ +import enum +from typing import List, Tuple, Optional, Callable, NamedTuple, Set, TYPE_CHECKING +from .item import item_names +from .item.item_groups import kerrigan_logic_ultimates +from .options import ( + get_option_value, + RequiredTactics, + LocationInclusion, + KerriganPresence, + GrantStoryTech, + get_enabled_campaigns, +) +from .mission_tables import SC2Mission, SC2Campaign + +from BaseClasses import Location +from worlds.AutoWorld import World + +if TYPE_CHECKING: + from BaseClasses import CollectionState + from . import SC2World + +SC2WOL_LOC_ID_OFFSET = 1000 +SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda +SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 +SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 +SC2_RACESWAP_LOC_ID_OFFSET = SC2NCO_LOC_ID_OFFSET + 900 +VICTORY_CACHE_OFFSET = 90 + + +class SC2Location(Location): + game: str = "Starcraft2" + + +class LocationType(enum.IntEnum): + VICTORY = 0 # Winning a mission + VANILLA = 1 # Objectives that provided metaprogression in the original campaign, along with a few other locations for a balanced experience + EXTRA = 2 # Additional locations based on mission progression, collecting in-mission rewards, etc. that do not significantly increase the challenge. + CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission, and often associated with Achievements + MASTERY = 4 # Extremely challenging objectives often associated with Masteries and Feats of Strength in the original campaign + VICTORY_CACHE = 5 # Bonus locations for beating a mission + + +class LocationFlag(enum.IntFlag): + NONE = 0 + BASEBUST = enum.auto() + """Locations about killing challenging bases""" + SPEEDRUN = enum.auto() + """Locations that are about doing something fast""" + PREVENTATIVE = enum.auto() + """Locations that are about preventing something from happening""" + + def values(self): + """Hacky iterator for backwards-compatibility with Python <= 3.10. Not necessary on Python 3.11+""" + return tuple( + val + for val in ( + LocationFlag.SPEEDRUN, + LocationFlag.PREVENTATIVE, + ) + if val in self + ) + + +class LocationData(NamedTuple): + region: str + name: str + code: int + type: LocationType + rule: Callable[["CollectionState"], bool] = Location.access_rule + flags: LocationFlag = LocationFlag.NONE + hard_rule: Optional[Callable[["CollectionState"], bool]] = None + + +def make_location_data( + region: str, + name: str, + code: int, + type: LocationType, + rule: Callable[["CollectionState"], bool] = Location.access_rule, + flags: LocationFlag = LocationFlag.NONE, + hard_rule: Optional[Callable[["CollectionState"], bool]] = None, +) -> LocationData: + return LocationData(region, f"{region}: {name}", code, type, rule, flags, hard_rule) + + +def get_location_types(world: "SC2World", inclusion_type: int) -> Set[LocationType]: + """ + :param world: The starcraft 2 world object + :param inclusion_type: Level of inclusion to check for + :return: A list of location types that match the inclusion type + """ + exclusion_options = [ + ("vanilla_locations", LocationType.VANILLA), + ("extra_locations", LocationType.EXTRA), + ("challenge_locations", LocationType.CHALLENGE), + ("mastery_locations", LocationType.MASTERY), + ] + excluded_location_types = set() + for option_name, location_type in exclusion_options: + if get_option_value(world, option_name) is inclusion_type: + excluded_location_types.add(location_type) + return excluded_location_types + + +def get_location_flags(world: "SC2World", inclusion_type: int) -> LocationFlag: + """ + :param world: The starcraft 2 world object + :param inclusion_type: Level of inclusion to check for + :return: A list of location types that match the inclusion type + """ + matching_location_flags = LocationFlag.NONE + if world.options.basebust_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.BASEBUST + if world.options.speedrun_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.SPEEDRUN + if world.options.preventative_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.PREVENTATIVE + return matching_location_flags + + +def get_plando_locations(world: World) -> List[str]: + """ + :param multiworld: + :param player: + :return: A list of locations affected by a plando in a world + """ + if world is None: + return [] + plando_locations = [] + for plando_setting in world.options.plando_items: + plando_locations += plando_setting.locations + + return plando_locations + + +def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: + # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option + if world is None: + logic_level = int(RequiredTactics.default) + kerriganless = False + else: + logic_level = world.options.required_tactics.value + kerriganless = ( + world.options.kerrigan_presence.value != KerriganPresence.option_vanilla + or SC2Campaign.HOTS not in get_enabled_campaigns(world) + ) + adv_tactics = logic_level != RequiredTactics.option_standard + if world is not None and world.logic is not None: + logic = world.logic + else: + from .rules import SC2Logic + + logic = SC2Logic(world) + player = 1 if world is None else world.player + location_table: List[LocationData] = [ + # WoL + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "First Statue", + SC2WOL_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Second Statue", + SC2WOL_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Third Statue", + SC2WOL_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Fourth Statue", + SC2WOL_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Fifth Statue", + SC2WOL_LOC_ID_OFFSET + 105, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Sixth Statue", + SC2WOL_LOC_ID_OFFSET + 106, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Special Delivery", + SC2WOL_LOC_ID_OFFSET + 107, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Transport", + SC2WOL_LOC_ID_OFFSET + 108, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Rebel Base", + SC2WOL_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "North Resource Pickups", + SC2WOL_LOC_ID_OFFSET + 202, + LocationType.EXTRA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Bunker", + SC2WOL_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Close Resource Pickups", + SC2WOL_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + and (adv_tactics or logic.terran_basic_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "First Group Rescued", + SC2WOL_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Second Group Rescued", + SC2WOL_LOC_ID_OFFSET + 302, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Third Group Rescued", + SC2WOL_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "First Hatchery", + SC2WOL_LOC_ID_OFFSET + 304, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Second Hatchery", + SC2WOL_LOC_ID_OFFSET + 305, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Third Hatchery", + SC2WOL_LOC_ID_OFFSET + 306, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Fourth Hatchery", + SC2WOL_LOC_ID_OFFSET + 307, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Ride's on its Way", + SC2WOL_LOC_ID_OFFSET + 308, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Hold Just a Little Longer", + SC2WOL_LOC_ID_OFFSET + 309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Cavalry's on the Way", + SC2WOL_LOC_ID_OFFSET + 310, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + lambda state: ( + logic.terran_early_tech(state) + and ( + (adv_tactics and logic.terran_basic_anti_air(state)) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "North Chrysalis", + SC2WOL_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "West Chrysalis", + SC2WOL_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "East Chrysalis", + SC2WOL_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Reach Hanson", + SC2WOL_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Secret Resource Stash", + SC2WOL_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Flawless", + SC2WOL_LOC_ID_OFFSET + 406, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_early_tech(state) + and logic.terran_defense_rating(state, True, False) >= 2 + and ( + (adv_tactics and logic.terran_basic_anti_air(state)) + or logic.terran_competent_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Western Zerg Base", + SC2WOL_LOC_ID_OFFSET + 407, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Eastern Zerg Base", + SC2WOL_LOC_ID_OFFSET + 408, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Left Infestor", + SC2WOL_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Right Infestor", + SC2WOL_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "North Infested Command Center", + SC2WOL_LOC_ID_OFFSET + 503, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "South Infested Command Center", + SC2WOL_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Northwest Bar", + SC2WOL_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "North Bar", + SC2WOL_LOC_ID_OFFSET + 506, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "South Bar", + SC2WOL_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "North Nexus", + SC2WOL_LOC_ID_OFFSET + 601, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "East Nexus", + SC2WOL_LOC_ID_OFFSET + 602, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "South Nexus", + SC2WOL_LOC_ID_OFFSET + 603, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "First Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 604, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Second Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 605, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Third Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 606, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.terran_havens_fall_requirement, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "North Hive", + SC2WOL_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Hive", + SC2WOL_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "South Hive", + SC2WOL_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Northeast Colony Base", + SC2WOL_LOC_ID_OFFSET + 704, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Colony Base", + SC2WOL_LOC_ID_OFFSET + 705, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Middle Colony Base", + SC2WOL_LOC_ID_OFFSET + 706, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southeast Colony Base", + SC2WOL_LOC_ID_OFFSET + 707, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southwest Colony Base", + SC2WOL_LOC_ID_OFFSET + 708, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southwest Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southeast Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 711, + LocationType.EXTRA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "First Relic", + SC2WOL_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Second Relic", + SC2WOL_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.terran_common_unit(state)), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Third Relic", + SC2WOL_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Fourth Relic", + SC2WOL_LOC_ID_OFFSET + 804, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "First Forcefield Area Busted", + SC2WOL_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Second Forcefield Area Busted", + SC2WOL_LOC_ID_OFFSET + 806, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Defeat Kerrigan", + SC2WOL_LOC_ID_OFFSET + 807, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Left Relic", + SC2WOL_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Right Ground Relic", + SC2WOL_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Right Cliff Relic", + SC2WOL_LOC_ID_OFFSET + 903, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Moebius Base", + SC2WOL_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + lambda state: logic.marine_medic_upgrade(state) or adv_tactics, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Door Outer Layer", + SC2WOL_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Door Thermal Barrier", + SC2WOL_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Cutting Through the Core", + SC2WOL_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Structure Access Imminent", + SC2WOL_LOC_ID_OFFSET + 908, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Northwestern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 909, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Northeastern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 910, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Eastern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 911, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "1st Data Core", + SC2WOL_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "2nd Data Core", + SC2WOL_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + lambda state: ( + logic.terran_air(state) + or ( + state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "South Rescue", + SC2WOL_LOC_ID_OFFSET + 1003, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Wall Rescue", + SC2WOL_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Mid Rescue", + SC2WOL_LOC_ID_OFFSET + 1005, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Nydus Roof Rescue", + SC2WOL_LOC_ID_OFFSET + 1006, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Alive Inside Rescue", + SC2WOL_LOC_ID_OFFSET + 1007, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 1008, + LocationType.VANILLA, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "3rd Data Core", + SC2WOL_LOC_ID_OFFSET + 1009, + LocationType.VANILLA, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "West Relic", + SC2WOL_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "North Relic", + SC2WOL_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "South Relic", + SC2WOL_LOC_ID_OFFSET + 1103, + LocationType.VANILLA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "East Relic", + SC2WOL_LOC_ID_OFFSET + 1104, + LocationType.VANILLA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Landing Zone Cleared", + SC2WOL_LOC_ID_OFFSET + 1105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Middle Base", + SC2WOL_LOC_ID_OFFSET + 1106, + LocationType.EXTRA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Southeast Base", + SC2WOL_LOC_ID_OFFSET + 1107, + LocationType.EXTRA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Landing Zone Cleared", + SC2WOL_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Expansion Prisoners", + SC2WOL_LOC_ID_OFFSET + 1202, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "South Close Prisoners", + SC2WOL_LOC_ID_OFFSET + 1203, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "South Far Prisoners", + SC2WOL_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "North Prisoners", + SC2WOL_LOC_ID_OFFSET + 1205, + LocationType.VANILLA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Mothership", + SC2WOL_LOC_ID_OFFSET + 1206, + LocationType.EXTRA, + logic.terran_maw_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Expansion Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1207, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Middle Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1208, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Southeast Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1209, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Stargate Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1210, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Northwest Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1211, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "West Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1212, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Southwest Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1213, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + lambda state: ( + adv_tactics + or logic.terran_moderate_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Tosh's Miners", + SC2WOL_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + lambda state: adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "North Reapers", + SC2WOL_LOC_ID_OFFSET + 1303, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Middle Reapers", + SC2WOL_LOC_ID_OFFSET + 1304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Southwest Reapers", + SC2WOL_LOC_ID_OFFSET + 1305, + LocationType.EXTRA, + lambda state: adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Southeast Reapers", + SC2WOL_LOC_ID_OFFSET + 1306, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.terran_moderate_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "East Reapers", + SC2WOL_LOC_ID_OFFSET + 1307, + LocationType.EXTRA, + lambda state: ( + logic.terran_moderate_anti_air(state) + and ( + adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Zerg Cleared", + SC2WOL_LOC_ID_OFFSET + 1308, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Close Relic", + SC2WOL_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "West Relic", + SC2WOL_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "North-East Relic", + SC2WOL_LOC_ID_OFFSET + 1403, + LocationType.VANILLA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Middle Base", + SC2WOL_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Protoss Cleared", + SC2WOL_LOC_ID_OFFSET + 1405, + LocationType.MASTERY, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_beats_protoss_deathball(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "No Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1406, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2WOL_LOC_ID_OFFSET + 1407, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1408, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1409, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1410, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1411, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Diamondback Prison", + SC2WOL_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Siege Tank Prison", + SC2WOL_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "First Checkpoint", + SC2WOL_LOC_ID_OFFSET + 1503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Second Checkpoint", + SC2WOL_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Terrazine Tank", + SC2WOL_LOC_ID_OFFSET + 1601, + LocationType.EXTRA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Jorium Stockpile", + SC2WOL_LOC_ID_OFFSET + 1602, + LocationType.EXTRA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "First Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Second Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Third Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1605, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "North Defiler", + SC2WOL_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Mid Defiler", + SC2WOL_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "South Defiler", + SC2WOL_LOC_ID_OFFSET + 1703, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Close Diamondback", + SC2WOL_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Northwest Diamondback", + SC2WOL_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "North Diamondback", + SC2WOL_LOC_ID_OFFSET + 1706, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Northeast Diamondback", + SC2WOL_LOC_ID_OFFSET + 1707, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Southwest Diamondback", + SC2WOL_LOC_ID_OFFSET + 1708, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Southeast Diamondback", + SC2WOL_LOC_ID_OFFSET + 1709, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Kill Team", + SC2WOL_LOC_ID_OFFSET + 1710, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.terran_common_unit(state)) + and logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Flawless", + SC2WOL_LOC_ID_OFFSET + 1711, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "2 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1712, + LocationType.EXTRA, + logic.terran_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "4 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1713, + LocationType.EXTRA, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "6 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1714, + LocationType.EXTRA, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Mira Han", + SC2WOL_LOC_ID_OFFSET + 1801, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "North Relic", + SC2WOL_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Mid Relic", + SC2WOL_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Southwest Relic", + SC2WOL_LOC_ID_OFFSET + 1804, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "North Command Center", + SC2WOL_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "South Command Center", + SC2WOL_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "West Command Center", + SC2WOL_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Odin", + SC2WOL_LOC_ID_OFFSET + 1901, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Loki", + SC2WOL_LOC_ID_OFFSET + 1902, + LocationType.CHALLENGE, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Lab Devourer", + SC2WOL_LOC_ID_OFFSET + 1903, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "North Devourer", + SC2WOL_LOC_ID_OFFSET + 1904, + LocationType.VANILLA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Southeast Devourer", + SC2WOL_LOC_ID_OFFSET + 1905, + LocationType.VANILLA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "West Base", + SC2WOL_LOC_ID_OFFSET + 1906, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Northwest Base", + SC2WOL_LOC_ID_OFFSET + 1907, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Northeast Base", + SC2WOL_LOC_ID_OFFSET + 1908, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Southeast Base", + SC2WOL_LOC_ID_OFFSET + 1909, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 1", + SC2WOL_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 2", + SC2WOL_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 3", + SC2WOL_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Science Facility", + SC2WOL_LOC_ID_OFFSET + 2004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Barracks", + SC2WOL_LOC_ID_OFFSET + 2005, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Factories", + SC2WOL_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Starports", + SC2WOL_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Odin Not Trashed", + SC2WOL_LOC_ID_OFFSET + 2008, + LocationType.CHALLENGE, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Surprise Attack Ends", + SC2WOL_LOC_ID_OFFSET + 2009, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Holding Cell Relic", + SC2WOL_LOC_ID_OFFSET + 2101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Brutalisk Relic", + SC2WOL_LOC_ID_OFFSET + 2102, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "First Escape Relic", + SC2WOL_LOC_ID_OFFSET + 2103, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Second Escape Relic", + SC2WOL_LOC_ID_OFFSET + 2104, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 2105, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Fusion Reactor", + SC2WOL_LOC_ID_OFFSET + 2106, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Entrance Holding Pen", + SC2WOL_LOC_ID_OFFSET + 2107, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Cargo Bay Warbot", + SC2WOL_LOC_ID_OFFSET + 2108, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Escape Warbot", + SC2WOL_LOC_ID_OFFSET + 2109, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "First Hatchery", + SC2WOL_LOC_ID_OFFSET + 2201, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Second Hatchery", + SC2WOL_LOC_ID_OFFSET + 2202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Third Hatchery", + SC2WOL_LOC_ID_OFFSET + 2203, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "First Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Second Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2205, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Third Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2206, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Robotics Facility", + SC2WOL_LOC_ID_OFFSET + 2301, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Dark Shrine", + SC2WOL_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Templar Archives", + SC2WOL_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Northeast Base", + SC2WOL_LOC_ID_OFFSET + 2304, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Southwest Base", + SC2WOL_LOC_ID_OFFSET + 2305, + LocationType.CHALLENGE, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Maar", + SC2WOL_LOC_ID_OFFSET + 2306, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Northwest Preserver", + SC2WOL_LOC_ID_OFFSET + 2307, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Southwest Preserver", + SC2WOL_LOC_ID_OFFSET + 2308, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "East Preserver", + SC2WOL_LOC_ID_OFFSET + 2309, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + lambda state: ( + (adv_tactics and logic.protoss_static_defense(state)) + or ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Close Obelisk", + SC2WOL_LOC_ID_OFFSET + 2401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "West Obelisk", + SC2WOL_LOC_ID_OFFSET + 2402, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Base", + SC2WOL_LOC_ID_OFFSET + 2403, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Southwest Tendril", + SC2WOL_LOC_ID_OFFSET + 2404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Southeast Tendril", + SC2WOL_LOC_ID_OFFSET + 2405, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Northeast Tendril", + SC2WOL_LOC_ID_OFFSET + 2406, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Northwest Tendril", + SC2WOL_LOC_ID_OFFSET + 2407, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Defeat", + SC2WOL_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Protoss Archive", + SC2WOL_LOC_ID_OFFSET + 2501, + LocationType.VANILLA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Kills", + SC2WOL_LOC_ID_OFFSET + 2502, + LocationType.VANILLA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Urun", + SC2WOL_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Mohandar", + SC2WOL_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Selendis", + SC2WOL_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Artanis", + SC2WOL_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2600, + LocationType.VICTORY, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Large Army", + SC2WOL_LOC_ID_OFFSET + 2601, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "2 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2602, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "4 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2603, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "6 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2604, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "8 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2605, + LocationType.CHALLENGE, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Southwest Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2606, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Northwest Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2607, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Northeast Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2608, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "East Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2609, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Southeast Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2610, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Expansion Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2611, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2700, + LocationType.VICTORY, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "First Charge", + SC2WOL_LOC_ID_OFFSET + 2701, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Second Charge", + SC2WOL_LOC_ID_OFFSET + 2702, + LocationType.EXTRA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Third Charge", + SC2WOL_LOC_ID_OFFSET + 2703, + LocationType.EXTRA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "First Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2704, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Second Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2705, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Third Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2706, + LocationType.VANILLA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2800, + LocationType.VICTORY, + lambda state: logic.terran_competent_comp(state) + and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Close Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2801, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Northwest Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2802, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Southeast Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2803, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state) + and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Southwest Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2804, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state) + and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Leviathan", + SC2WOL_LOC_ID_OFFSET + 2805, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state) + and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "East Hatchery", + SC2WOL_LOC_ID_OFFSET + 2806, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "North Hatchery", + SC2WOL_LOC_ID_OFFSET + 2807, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Mid Hatchery", + SC2WOL_LOC_ID_OFFSET + 2808, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2900, + LocationType.VICTORY, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "First Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2901, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Second Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2902, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Third Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2903, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Fourth Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2904, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Fifth Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2905, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + # HotS + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Gather Minerals", + SC2HOTS_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "South Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "East Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "West Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Hatchery", + SC2HOTS_LOC_ID_OFFSET + 105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Overlord", + SC2HOTS_LOC_ID_OFFSET + 106, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Gas Turrets", + SC2HOTS_LOC_ID_OFFSET + 107, + LocationType.EXTRA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Win In Under 10 Minutes", + SC2HOTS_LOC_ID_OFFSET + 108, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + lambda state: logic.basic_kerrigan(state) + or kerriganless + or logic.grant_story_tech == GrantStoryTech.option_grant, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Defend the Tram", + SC2HOTS_LOC_ID_OFFSET + 201, + LocationType.EXTRA, + lambda state: logic.basic_kerrigan(state) + or kerriganless + or logic.grant_story_tech == GrantStoryTech.option_grant, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Kinetic Blast", + SC2HOTS_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Crushing Grip", + SC2HOTS_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Reach the Sublevel", + SC2HOTS_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Door Section Cleared", + SC2HOTS_LOC_ID_OFFSET + 205, + LocationType.EXTRA, + lambda state: logic.basic_kerrigan(state) + or kerriganless + or logic.grant_story_tech == GrantStoryTech.option_grant, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Right Queen", + SC2HOTS_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Center Queen", + SC2HOTS_LOC_ID_OFFSET + 302, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Left Queen", + SC2HOTS_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Hold Out Finished", + SC2HOTS_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Kill All Buildings Before Reinforcements", + SC2HOTS_LOC_ID_OFFSET + 305, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and (logic.basic_kerrigan(state) or kerriganless) + and logic.zerg_defense_rating(state, False, False) >= 3 + and logic.zerg_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "First Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "North Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "West Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Lost Brood", + SC2HOTS_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Northeast Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Northwest Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 406, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Southwest Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Nafash", + SC2HOTS_LOC_ID_OFFSET + 408, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "20 Unfrozen Structures", + SC2HOTS_LOC_ID_OFFSET + 409, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Center Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Destroy 4 Shuttles", + SC2HOTS_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Frozen Expansion", + SC2HOTS_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Southwest Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 506, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Southeast Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 508, + LocationType.EXTRA, + logic.zerg_common_unit_competent_aa, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + logic.zerg_common_unit_competent_aa, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 510, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Center Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 511, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 512, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + lambda state: ( + logic.zerg_pass_vents(state) + and ( + logic.grant_story_tech == GrantStoryTech.option_grant + or state.has_any( + { + item_names.ZERGLING_RAPTOR_STRAIN, + item_names.ROACH, + item_names.HYDRALISK, + item_names.INFESTOR, + }, + player, + ) + ) + ), + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Infest Giant Ursadon", + SC2HOTS_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "First Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Second Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Third Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 604, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Warp Drive", + SC2HOTS_LOC_ID_OFFSET + 605, + LocationType.EXTRA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Stasis Quadrant", + SC2HOTS_LOC_ID_OFFSET + 606, + LocationType.EXTRA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Center Infested Command Center", + SC2HOTS_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "North Infested Command Center", + SC2HOTS_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Repel Zagara", + SC2HOTS_LOC_ID_OFFSET + 703, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Close Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "South Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + lambda state: adv_tactics or logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Southwest Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 706, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Southeast Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 707, + LocationType.EXTRA, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "North Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 708, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Northeast Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Win Without 100 Eggs", + SC2HOTS_LOC_ID_OFFSET + 710, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "West Biomass", + SC2HOTS_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "North Biomass", + SC2HOTS_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Biomass", + SC2HOTS_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Destroy 3 Gorgons", + SC2HOTS_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Close Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 806, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "North Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 807, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "West Queen Rescue", + SC2HOTS_LOC_ID_OFFSET + 808, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "East Queen Rescue", + SC2HOTS_LOC_ID_OFFSET + 809, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 810, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Northwest Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 811, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Southeast Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 812, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "East Science Lab", + SC2HOTS_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "North Science Lab", + SC2HOTS_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Get Nuked", + SC2HOTS_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Entrance Gate", + SC2HOTS_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Citadel Gate", + SC2HOTS_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "South Expansion", + SC2HOTS_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Rich Mineral Expansion", + SC2HOTS_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Center Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + adv_tactics + and logic.zerg_basic_anti_air(state) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1003, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + adv_tactics + and logic.zerg_basic_anti_air(state) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Finish Feeding", + SC2HOTS_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Proxy Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1005, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Proxy Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1006, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Main Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1007, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Main Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1008, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Flawless", + SC2HOTS_LOC_ID_OFFSET + 1009, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Tyrannozor", + SC2HOTS_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Reach the Pool", + SC2HOTS_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "15 Minutes Remaining", + SC2HOTS_LOC_ID_OFFSET + 1103, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "5 Minutes Remaining", + SC2HOTS_LOC_ID_OFFSET + 1104, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Pincer Attack", + SC2HOTS_LOC_ID_OFFSET + 1105, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Yagdra Claims Brakk's Pack", + SC2HOTS_LOC_ID_OFFSET + 1106, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "First Relic", + SC2HOTS_LOC_ID_OFFSET + 1201, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Second Relic", + SC2HOTS_LOC_ID_OFFSET + 1202, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Third Relic", + SC2HOTS_LOC_ID_OFFSET + 1203, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Fourth Relic", + SC2HOTS_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Yagdra", + SC2HOTS_LOC_ID_OFFSET + 1205, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Kraith", + SC2HOTS_LOC_ID_OFFSET + 1206, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Slivan", + SC2HOTS_LOC_ID_OFFSET + 1207, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + ( + logic.zerg_competent_anti_air(state) + and state.has(item_names.INFESTOR, player) + ) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "East Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Center Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "West Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "First Intro Garrison", + SC2HOTS_LOC_ID_OFFSET + 1304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Second Intro Garrison", + SC2HOTS_LOC_ID_OFFSET + 1305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Base Garrison", + SC2HOTS_LOC_ID_OFFSET + 1306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "East Garrison", + SC2HOTS_LOC_ID_OFFSET + 1307, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Mid Garrison", + SC2HOTS_LOC_ID_OFFSET + 1308, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "North Garrison", + SC2HOTS_LOC_ID_OFFSET + 1309, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Close Southwest Garrison", + SC2HOTS_LOC_ID_OFFSET + 1310, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Far Southwest Garrison", + SC2HOTS_LOC_ID_OFFSET + 1311, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "North Brutalisk", + SC2HOTS_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "South Brutalisk", + SC2HOTS_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 1 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1403, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 2 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 3 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1405, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 4 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1406, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 5 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1407, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 6 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1408, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 7 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1409, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northwest Crystal", + SC2HOTS_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northeast Crystal", + SC2HOTS_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "South Crystal", + SC2HOTS_LOC_ID_OFFSET + 1503, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Base Established", + SC2HOTS_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Close Temple", + SC2HOTS_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Mid Temple", + SC2HOTS_LOC_ID_OFFSET + 1506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Southeast Temple", + SC2HOTS_LOC_ID_OFFSET + 1507, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northeast Temple", + SC2HOTS_LOC_ID_OFFSET + 1508, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northwest Temple", + SC2HOTS_LOC_ID_OFFSET + 1509, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Pirate Capital Ship", + SC2HOTS_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "First Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1602, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Second Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Third Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + kerriganless + or ( + logic.two_kerrigan_actives(state) + and (logic.basic_kerrigan(state) or logic.grant_story_tech == GrantStoryTech.option_grant) + and logic.kerrigan_levels(state, 25) + ) + ), + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "First Secret Documents", + SC2HOTS_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Second Secret Documents", + SC2HOTS_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + lambda state: ( + kerriganless + or ( + logic.two_kerrigan_actives(state) + and (logic.basic_kerrigan(state) or logic.grant_story_tech == GrantStoryTech.option_grant) + and logic.kerrigan_levels(state, 25) + ) + ), + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Power Coupling", + SC2HOTS_LOC_ID_OFFSET + 1703, + LocationType.EXTRA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Door Blasted", + SC2HOTS_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "East Gate", + SC2HOTS_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Northwest Gate", + SC2HOTS_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "North Gate", + SC2HOTS_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "1 Bile Launcher Deployed", + SC2HOTS_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "2 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "3 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "4 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "5 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1808, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Sons of Korhal", + SC2HOTS_LOC_ID_OFFSET + 1809, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Night Wolves", + SC2HOTS_LOC_ID_OFFSET + 1810, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "West Expansion", + SC2HOTS_LOC_ID_OFFSET + 1811, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Mid Expansion", + SC2HOTS_LOC_ID_OFFSET + 1812, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp_competent_aa(state) + and (adv_tactics or logic.zerg_base_buster(state)), + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "First Power Link", + SC2HOTS_LOC_ID_OFFSET + 1901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Second Power Link", + SC2HOTS_LOC_ID_OFFSET + 1902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Third Power Link", + SC2HOTS_LOC_ID_OFFSET + 1903, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Expansion Command Center", + SC2HOTS_LOC_ID_OFFSET + 1904, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Main Path Command Center", + SC2HOTS_LOC_ID_OFFSET + 1905, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp_competent_aa(state) + and (adv_tactics or logic.zerg_base_buster(state)), + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "South Lane", + SC2HOTS_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "North Lane", + SC2HOTS_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "East Lane", + SC2HOTS_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Odin", + SC2HOTS_LOC_ID_OFFSET + 2004, + LocationType.EXTRA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Trash the Odin Early", + SC2HOTS_LOC_ID_OFFSET + 2005, + LocationType.MASTERY, + lambda state: ( + logic.zerg_the_reckoning_requirement(state) + and ( + kerriganless + or ( + logic.kerrigan_levels(state, 50, False) + and state.has_any(kerrigan_logic_ultimates, player) + ) + ) + and logic.zerg_power_rating(state) >= 10 + ), + flags=LocationFlag.SPEEDRUN, + ), + # LotV Prologue + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "First Prisoner Group", + SC2LOTV_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Second Prisoner Group", + SC2LOTV_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "First Pylon", + SC2LOTV_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Second Pylon", + SC2LOTV_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Zerg Base", + SC2LOTV_LOC_ID_OFFSET + 105, + LocationType.MASTERY, + lambda state: logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "South Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "West Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "East Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + lambda state: ( + logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state) + and logic.protoss_can_attack_behind_chasm(state) + ), + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: adv_tactics + or state.count_from_list( + ( + item_names.STALKER_PHASE_REACTOR, + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, + ), + player, + ) + >= 2, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Temple Investigated", + SC2LOTV_LOC_ID_OFFSET + 301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Void Catalyst", + SC2LOTV_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "First Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Second Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 304, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Third Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 305, + LocationType.VANILLA, + ), + # LotV + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Southwest Hive", + SC2LOTV_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northwest Hive", + SC2LOTV_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northeast Hive", + SC2LOTV_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "East Hive", + SC2LOTV_LOC_ID_OFFSET + 404, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "West Conduit", + SC2LOTV_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Middle Conduit", + SC2LOTV_LOC_ID_OFFSET + 406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northeast Conduit", + SC2LOTV_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Close Pylon", + SC2LOTV_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "East Pylon", + SC2LOTV_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "West Pylon", + SC2LOTV_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Nexus", + SC2LOTV_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Templar Base", + SC2LOTV_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.protoss_spear_of_adun_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Close Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "West Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "North Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "North Power Cell", + SC2LOTV_LOC_ID_OFFSET + 604, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "East Power Cell", + SC2LOTV_LOC_ID_OFFSET + 605, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "South Power Cell", + SC2LOTV_LOC_ID_OFFSET + 606, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Southeast Power Cell", + SC2LOTV_LOC_ID_OFFSET + 607, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Mid EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southeast EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "North EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Mid Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southwest Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Northwest Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 706, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Northeast Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 707, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southeast Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 708, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "West Raynor Base", + SC2LOTV_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "East Raynor Base", + SC2LOTV_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Mid Science Facility", + SC2LOTV_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "North Science Facility", + SC2LOTV_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_brothers_in_arms_requirement(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and ( + logic.terran_common_unit(state) + or logic.protoss_common_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "South Science Facility", + SC2LOTV_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Raynor Forward Positions", + SC2LOTV_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Valerian Forward Positions", + SC2LOTV_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Win in under 15 minutes", + SC2LOTV_LOC_ID_OFFSET + 806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_brothers_in_arms_requirement(state) + and logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Close Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "North Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "East Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 903, + LocationType.VANILLA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "West Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "South Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Northwest Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "East Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "West Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "North Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "East Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1003, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "1 Billion Zerg", + SC2LOTV_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "1.5 Billion Zerg", + SC2LOTV_LOC_ID_OFFSET + 1005, + LocationType.VANILLA, + lambda state: ( + logic.protoss_last_stand_requirement(state) + and ( + state.has_all( + { + item_names.KHAYDARIN_MONOLITH, + item_names.PHOTON_CANNON, + item_names.SHIELD_BATTERY, + }, + player, + ) + or state.has_any( + {item_names.SOA_SOLAR_LANCE, item_names.SOA_DEPLOY_FENIX}, + player, + ) + ) + and logic.protoss_defense_rating(state, False) >= 13 + ), + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "South Solarite", + SC2LOTV_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "North Solarite", + SC2LOTV_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Northwest Solarite", + SC2LOTV_LOC_ID_OFFSET + 1103, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Rescue Sentries", + SC2LOTV_LOC_ID_OFFSET + 1104, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Destroy Gateways", + SC2LOTV_LOC_ID_OFFSET + 1105, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Mid Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "West Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1202, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "South Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1203, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "East Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1204, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "North Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1205, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Titanic Warp Prism", + SC2LOTV_LOC_ID_OFFSET + 1206, + LocationType.VANILLA, + logic.protoss_temple_of_unification_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Terran Main Base", + SC2LOTV_LOC_ID_OFFSET + 1207, + LocationType.MASTERY, + lambda state: logic.protoss_temple_of_unification_requirement(state) + and logic.protoss_deathball(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Protoss Main Base", + SC2LOTV_LOC_ID_OFFSET + 1208, + LocationType.MASTERY, + lambda state: logic.protoss_temple_of_unification_requirement(state) + and logic.protoss_deathball(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "First Hall of Revelation", + SC2LOTV_LOC_ID_OFFSET + 1301, + LocationType.EXTRA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Second Hall of Revelation", + SC2LOTV_LOC_ID_OFFSET + 1302, + LocationType.EXTRA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "First Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Second Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1304, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Third Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1305, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Artanis", + SC2LOTV_LOC_ID_OFFSET + 1401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Northwest Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1402, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Northeast Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1403, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Southwest Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Southeast Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1405, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "South Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1406, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Mid Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1407, + LocationType.VANILLA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "North Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1408, + LocationType.VANILLA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Zerg Cleared", + SC2LOTV_LOC_ID_OFFSET + 1501, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "First Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1502, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Second Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1503, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Third Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Fourth Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "South Power Core", + SC2LOTV_LOC_ID_OFFSET + 1506, + LocationType.VANILLA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + and (adv_tactics or logic.protoss_fleet(state)) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "East Power Core", + SC2LOTV_LOC_ID_OFFSET + 1507, + LocationType.VANILLA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + and (adv_tactics or logic.protoss_fleet(state)) + ), + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: Northeast Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1602, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: Southeast Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1603, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: North Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1605, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: East Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1606, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1607, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: Mid Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1608, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: East Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1609, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: North Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1610, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1611, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: South Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1612, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "Purifier Warden", + SC2LOTV_LOC_ID_OFFSET + 1613, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "First Terrazine Fog", + SC2LOTV_LOC_ID_OFFSET + 1701, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Southwest Guardian", + SC2LOTV_LOC_ID_OFFSET + 1702, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "West Guardian", + SC2LOTV_LOC_ID_OFFSET + 1703, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Northwest Guardian", + SC2LOTV_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Northeast Guardian", + SC2LOTV_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "North Mothership", + SC2LOTV_LOC_ID_OFFSET + 1706, + LocationType.VANILLA, + logic.protoss_steps_of_the_rite_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "South Mothership", + SC2LOTV_LOC_ID_OFFSET + 1707, + LocationType.VANILLA, + logic.protoss_steps_of_the_rite_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "North Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Southwest Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "East Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Resource Pickups", + SC2LOTV_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Destroy Nexuses", + SC2LOTV_LOC_ID_OFFSET + 1805, + LocationType.CHALLENGE, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Win in under 15 minutes", + SC2LOTV_LOC_ID_OFFSET + 1806, + LocationType.MASTERY, + logic.protoss_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Northwest Power Core", + SC2LOTV_LOC_ID_OFFSET + 1901, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Northeast Power Core", + SC2LOTV_LOC_ID_OFFSET + 1902, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Southeast Power Core", + SC2LOTV_LOC_ID_OFFSET + 1903, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "West Hybrid Stasis Chamber", + SC2LOTV_LOC_ID_OFFSET + 1904, + LocationType.VANILLA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2LOTV_LOC_ID_OFFSET + 1905, + LocationType.VANILLA, + logic.protoss_fleet, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.templars_return_phase_3_reach_dts_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: First Gate", + SC2LOTV_LOC_ID_OFFSET + 2001, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: Second Gate", + SC2LOTV_LOC_ID_OFFSET + 2002, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: Power Structure", + SC2LOTV_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Temple Grounds: Gather Army", + SC2LOTV_LOC_ID_OFFSET + 2004, + LocationType.VANILLA, + logic.templars_return_phase_2_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Temple Grounds: Power Structure", + SC2LOTV_LOC_ID_OFFSET + 2005, + LocationType.VANILLA, + logic.templars_return_phase_2_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Caverns: Purifier", + SC2LOTV_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + logic.templars_return_phase_3_reach_colossus_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Caverns: Dark Templar", + SC2LOTV_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + logic.templars_return_phase_3_reach_dts_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Southeast Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2101, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "South Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2102, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Southwest Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2103, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "North Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2104, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Northwest Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2105, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Nerazim Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2106, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Tal'darim Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2107, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Purifier Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2108, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Fabrication Matrix", + SC2LOTV_LOC_ID_OFFSET + 2201, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Assault Cluster", + SC2LOTV_LOC_ID_OFFSET + 2202, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Hull Breach", + SC2LOTV_LOC_ID_OFFSET + 2203, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Core Critical", + SC2LOTV_LOC_ID_OFFSET + 2204, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Kill Brutalisk", + SC2LOTV_LOC_ID_OFFSET + 2205, + LocationType.MASTERY, + logic.protoss_salvation_requirement, + ), + # Epilogue + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Corruption Source", + SC2LOTV_LOC_ID_OFFSET + 2301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Southwest Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Northwest Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Southeast Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2304, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Northeast Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2305, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Initial Void Thrashers", + SC2LOTV_LOC_ID_OFFSET + 2401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 1", + SC2LOTV_LOC_ID_OFFSET + 2402, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 2", + SC2LOTV_LOC_ID_OFFSET + 2403, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 3", + SC2LOTV_LOC_ID_OFFSET + 2404, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 4", + SC2LOTV_LOC_ID_OFFSET + 2405, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "No more than 15 Kerrigan Kills", + SC2LOTV_LOC_ID_OFFSET + 2406, + LocationType.MASTERY, + logic.essence_of_eternity_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 1 Crystal", + SC2LOTV_LOC_ID_OFFSET + 2501, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 2 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2502, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 3 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 4 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 5 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 6 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Clear Void Chasms", + SC2LOTV_LOC_ID_OFFSET + 2507, + LocationType.MASTERY, + lambda state: logic.amons_fall_requirement(state) + and logic.spread_creep(state, False) + and logic.zerg_big_monsters(state), + ), + # Nova Covert Ops + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Rifle", + SC2NCO_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + logic.the_escape_first_stage_requirement, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Grenades", + SC2NCO_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + logic.the_escape_first_stage_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Delta", + SC2NCO_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Pierce", + SC2NCO_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Stone", + SC2NCO_LOC_ID_OFFSET + 105, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Research Center", + SC2NCO_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Weaponry Labs", + SC2NCO_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Brutalisk", + SC2NCO_LOC_ID_OFFSET + 203, + LocationType.EXTRA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Gas Pickups", + SC2NCO_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics or logic.sudden_strike_requirement(state) + ), + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Protect Buildings", + SC2NCO_LOC_ID_OFFSET + 205, + LocationType.CHALLENGE, + logic.sudden_strike_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Zerg Base", + SC2NCO_LOC_ID_OFFSET + 206, + LocationType.MASTERY, + lambda state: ( + logic.sudden_strike_requirement(state) + and logic.terran_competent_comp(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 8 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + logic.enemy_intelligence_third_stage_requirement, + hard_rule=logic.enemy_intelligence_cliff_garrison_and_nova_mobility, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "West Garrison", + SC2NCO_LOC_ID_OFFSET + 301, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Close Garrison", + SC2NCO_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Northeast Garrison", + SC2NCO_LOC_ID_OFFSET + 303, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Southeast Garrison", + SC2NCO_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + lambda state: ( + logic.enemy_intelligence_first_stage_requirement(state) + and logic.enemy_intelligence_cliff_garrison(state) + ), + hard_rule=logic.enemy_intelligence_cliff_garrison, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "South Garrison", + SC2NCO_LOC_ID_OFFSET + 305, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "All Garrisons", + SC2NCO_LOC_ID_OFFSET + 306, + LocationType.VANILLA, + lambda state: ( + logic.enemy_intelligence_first_stage_requirement(state) + and logic.enemy_intelligence_cliff_garrison(state) + ), + hard_rule=logic.enemy_intelligence_cliff_garrison, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Forces Rescued", + SC2NCO_LOC_ID_OFFSET + 307, + LocationType.VANILLA, + logic.enemy_intelligence_first_stage_requirement, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Communications Hub", + SC2NCO_LOC_ID_OFFSET + 308, + LocationType.VANILLA, + logic.enemy_intelligence_second_stage_requirement, + hard_rule=logic.enemy_intelligence_cliff_garrison_and_nova_mobility, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: West Hatchery", + SC2NCO_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: North Hatchery", + SC2NCO_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: East Hatchery", + SC2NCO_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: Northwest Hatchery", + SC2NCO_LOC_ID_OFFSET + 404, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: Southwest Hatchery", + SC2NCO_LOC_ID_OFFSET + 405, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: East Hatchery", + SC2NCO_LOC_ID_OFFSET + 406, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Shield Projector", + SC2NCO_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "East Shield Projector", + SC2NCO_LOC_ID_OFFSET + 408, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Shield Projector", + SC2NCO_LOC_ID_OFFSET + 409, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "West Shield Projector", + SC2NCO_LOC_ID_OFFSET + 410, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "Fleet Beacon", + SC2NCO_LOC_ID_OFFSET + 411, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "1 Terrazine Node Collected", + SC2NCO_LOC_ID_OFFSET + 501, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "2 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 502, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "3 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 503, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "4 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "5 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "HERC Outpost", + SC2NCO_LOC_ID_OFFSET + 506, + LocationType.VANILLA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Umojan Mine", + SC2NCO_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Blightbringer", + SC2NCO_LOC_ID_OFFSET + 508, + LocationType.VANILLA, + lambda state: ( + logic.night_terrors_requirement(state) + and logic.nova_ranged_weapon(state) + and state.has_any( + { + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_HOLO_DECOY, + }, + player, + ) + ), + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Science Facility", + SC2NCO_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Eradicators", + SC2NCO_LOC_ID_OFFSET + 510, + LocationType.VANILLA, + lambda state: ( + logic.night_terrors_requirement(state) and logic.nova_any_weapon(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Close North Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 601, + LocationType.EXTRA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + or logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Close East Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 602, + LocationType.EXTRA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + or logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Far North Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 603, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Far East Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 604, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Experimental Weapon", + SC2NCO_LOC_ID_OFFSET + 605, + LocationType.VANILLA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Northwest Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 606, + LocationType.VANILLA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Southeast Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 607, + LocationType.VANILLA, + lambda state: state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Northeast Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 608, + LocationType.VANILLA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Expansion Hatchery", + SC2NCO_LOC_ID_OFFSET + 609, + LocationType.EXTRA, + lambda state: state.has(item_names.LIBERATOR_RAID_ARTILLERY, player) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Baneling Spawns", + SC2NCO_LOC_ID_OFFSET + 610, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Mutalisk Spawns", + SC2NCO_LOC_ID_OFFSET + 611, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Nydus Worm Spawns", + SC2NCO_LOC_ID_OFFSET + 612, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Lurker Spawns", + SC2NCO_LOC_ID_OFFSET + 613, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Brood Lord Spawns", + SC2NCO_LOC_ID_OFFSET + 614, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Ultralisk Spawns", + SC2NCO_LOC_ID_OFFSET + 615, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.enemy_shadow_victory, + hard_rule=lambda state: logic.nova_beat_stone(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Domination Visor", + SC2NCO_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.enemy_shadow_domination, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 702, + LocationType.EXTRA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Facility Access", + SC2NCO_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Northwest Door Lock", + SC2NCO_LOC_ID_OFFSET + 704, + LocationType.VANILLA, + logic.enemy_shadow_door_controls, + hard_rule=lambda state: logic.nova_any_nobuild_damage(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Southeast Door Lock", + SC2NCO_LOC_ID_OFFSET + 705, + LocationType.VANILLA, + logic.enemy_shadow_door_controls, + hard_rule=lambda state: logic.nova_any_nobuild_damage(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Blazefire Gunblade", + SC2NCO_LOC_ID_OFFSET + 706, + LocationType.VANILLA, + lambda state: ( + logic.enemy_shadow_second_stage(state) + and ( + logic.grant_story_tech == GrantStoryTech.option_grant + or state.has(item_names.NOVA_BLINK, player) + or ( + adv_tactics + and state.has_all( + { + item_names.NOVA_DOMINATION, + item_names.NOVA_HOLO_DECOY, + item_names.NOVA_JUMP_SUIT_MODULE, + }, + player, + ) + ) + ) + ), + hard_rule=logic.enemy_shadow_nova_damage_and_blazefire_unlock, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Blink Suit", + SC2NCO_LOC_ID_OFFSET + 707, + LocationType.VANILLA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Advanced Weaponry", + SC2NCO_LOC_ID_OFFSET + 708, + LocationType.VANILLA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Entrance Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: West Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: North Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 711, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: East Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 712, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: South Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 713, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "First Squadron of Dominion Fleet", + SC2NCO_LOC_ID_OFFSET + 801, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Remainder of Dominion Fleet", + SC2NCO_LOC_ID_OFFSET + 802, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Ji'nara", + SC2NCO_LOC_ID_OFFSET + 803, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Science Facility", + SC2NCO_LOC_ID_OFFSET + 804, + LocationType.VANILLA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + lambda state: logic.end_game_requirement(state) + and logic.nova_any_weapon(state), + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Destroy the Xanthos", + SC2NCO_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Railgun", + SC2NCO_LOC_ID_OFFSET + 902, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Flamethrower", + SC2NCO_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Fighter Bay", + SC2NCO_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Missile Pods", + SC2NCO_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Protect Hyperion", + SC2NCO_LOC_ID_OFFSET + 906, + LocationType.CHALLENGE, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Destroy Orbital Commands", + SC2NCO_LOC_ID_OFFSET + 907, + LocationType.CHALLENGE, + logic.end_game_requirement, + flags=LocationFlag.BASEBUST, + ), + # Mission Variants + # 10X/20X - Liberation Day + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Rebel Base", + SC2_RACESWAP_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "North Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Close Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Rebel Base", + SC2_RACESWAP_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "North Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 402, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Close Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "First Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Second Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Third Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "First Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 504, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Second Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 505, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Third Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 506, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Fourth Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 507, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Ride's on its Way", + SC2_RACESWAP_LOC_ID_OFFSET + 508, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Hold Just a Little Longer", + SC2_RACESWAP_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Cavalry's on the Way", + SC2_RACESWAP_LOC_ID_OFFSET + 510, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "First Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Second Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Third Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "First Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 604, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Second Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 605, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Third Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 606, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Fourth Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 607, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Ride's on its Way", + SC2_RACESWAP_LOC_ID_OFFSET + 608, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Hold Just a Little Longer", + SC2_RACESWAP_LOC_ID_OFFSET + 609, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Cavalry's on the Way", + SC2_RACESWAP_LOC_ID_OFFSET + 610, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_basic_kerriganless_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "North Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "West Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "East Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Reach Hanson", + SC2_RACESWAP_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Secret Resource Stash", + SC2_RACESWAP_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 706, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, False) >= 5 + and ( + (adv_tactics and logic.zerg_basic_kerriganless_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Western Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 707, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Eastern Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 708, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "North Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "West Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "East Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Reach Hanson", + SC2_RACESWAP_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Secret Resource Stash", + SC2_RACESWAP_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_defense_rating(state, True) >= 2 + and logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Western Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 807, + LocationType.MASTERY, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Eastern Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 808, + LocationType.MASTERY, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Left Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Right Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "South Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Northwest Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "North Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "South Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Left Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Right Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 1003, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "South Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Northwest Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1005, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "North Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1006, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "South Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1007, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "North Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1101, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "East Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1102, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "South Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1103, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "First Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1104, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Second Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1105, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Third Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1106, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "North Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "East Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1202, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "South Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1203, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "First Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Second Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1205, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Third Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1206, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + logic.zerg_havens_fall_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "North Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "South Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Northeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1304, + LocationType.CHALLENGE, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1305, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Middle Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1306, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1307, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southwest Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1308, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southwest Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1309, + LocationType.EXTRA, + lambda state: state.has_any( + (item_names.OVERLORD_VENTRAL_SACS, item_names.YGGDRASIL), player + ) + or adv_tactics + and state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ), + hard_rule=logic.zerg_can_collect_pickup_across_gap, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1310, + LocationType.EXTRA, + lambda state: ( + logic.zerg_havens_fall_requirement(state) + and ( + state.has(item_names.OVERLORD_VENTRAL_SACS, player) + or adv_tactics + and ( + state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ) + or state.has(item_names.YGGDRASIL, player) + or logic.morph_viper(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southeast Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1311, + LocationType.EXTRA, + lambda state: ( + logic.zerg_havens_fall_requirement(state) + and ( + state.has(item_names.OVERLORD_VENTRAL_SACS, player) + or adv_tactics + and ( + state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ) + or state.has(item_names.YGGDRASIL, player) + ) + ) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.protoss_havens_fall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "North Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.protoss_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "South Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1403, + LocationType.VANILLA, + logic.protoss_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Northeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1404, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1405, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Middle Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1406, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1407, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southwest Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1408, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southwest Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1409, + LocationType.EXTRA, + lambda state: ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1410, + LocationType.EXTRA, + lambda state: ( + logic.protoss_havens_fall_requirement(state) + and ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southeast Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1411, + LocationType.EXTRA, + lambda state: ( + logic.protoss_havens_fall_requirement(state) + and ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "First Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Second Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + or state.has(item_names.OVERLORD_VENTRAL_SACS, player), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Third Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Fourth Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1504, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "First Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Second Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Defeat Kerrigan", + SC2_RACESWAP_LOC_ID_OFFSET + 1507, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "First Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Second Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1602, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Third Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Fourth Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "First Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1605, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Second Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1606, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Defeat Kerrigan", + SC2_RACESWAP_LOC_ID_OFFSET + 1607, + LocationType.MASTERY, + logic.protoss_deathball, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Left Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Right Ground Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Right Cliff Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1703, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Moebius Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Door Outer Layer", + SC2_RACESWAP_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Door Thermal Barrier", + SC2_RACESWAP_LOC_ID_OFFSET + 1706, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Cutting Through the Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1707, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Structure Access Imminent", + SC2_RACESWAP_LOC_ID_OFFSET + 1708, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Northwestern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1709, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Northeastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1710, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Eastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1711, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Left Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Right Ground Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Right Cliff Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Moebius Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Door Outer Layer", + SC2_RACESWAP_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Door Thermal Barrier", + SC2_RACESWAP_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Cutting Through the Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Structure Access Imminent", + SC2_RACESWAP_LOC_ID_OFFSET + 1808, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Northwestern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1809, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Northeastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1810, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Eastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1811, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "1st Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "2nd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1902, + LocationType.VANILLA, + lambda state: ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1903, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Wall Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1904, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Mid Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1905, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Nydus Roof Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1906, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Alive Inside Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1907, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 1908, + LocationType.VANILLA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "3rd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1909, + LocationType.VANILLA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "1st Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "2nd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + lambda state: ( + logic.protoss_fleet(state) + or ( + state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2003, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Wall Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2004, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Mid Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2005, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Nydus Roof Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Alive Inside Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2008, + LocationType.VANILLA, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "3rd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2009, + LocationType.VANILLA, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "South Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2103, + LocationType.VANILLA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2104, + LocationType.VANILLA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2106, + LocationType.EXTRA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2107, + LocationType.EXTRA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2201, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "South Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2203, + LocationType.VANILLA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2204, + LocationType.VANILLA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2205, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2206, + LocationType.EXTRA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2207, + LocationType.EXTRA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Expansion Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "South Close Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "South Far Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2304, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "North Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2305, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 2306, + LocationType.EXTRA, + logic.zerg_maw_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Expansion Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2307, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Middle Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2308, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Southeast Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2309, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Stargate Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2310, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Northwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2311, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "West Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2312, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Southwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2313, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Expansion Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2402, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "South Close Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2403, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "South Far Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2404, + LocationType.VANILLA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "North Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2405, + LocationType.VANILLA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 2406, + LocationType.EXTRA, + logic.protoss_maw_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Expansion Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2407, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Middle Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2408, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Southeast Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2409, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Stargate Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2410, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Northwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2411, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "West Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2412, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Southwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2413, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Tosh's Miners", + SC2_RACESWAP_LOC_ID_OFFSET + 2501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "North Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Middle Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Southwest Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Southeast Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "East Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2507, + LocationType.EXTRA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2508, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2600, + LocationType.VICTORY, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Tosh's Miners", + SC2_RACESWAP_LOC_ID_OFFSET + 2601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2602, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "North Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2603, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Middle Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Southwest Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2605, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Southeast Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2606, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "East Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2607, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2608, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_competent_anti_air(state) + and (logic.protoss_common_unit(state)) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2700, + LocationType.VICTORY, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Close Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2702, + LocationType.VANILLA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "North-East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2703, + LocationType.VANILLA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2704, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Protoss Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2705, + LocationType.MASTERY, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "No Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2706, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_big_monsters(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2707, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2708, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2709, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2710, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2711, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2800, + LocationType.VICTORY, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Close Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2802, + LocationType.VANILLA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "North-East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2803, + LocationType.VANILLA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2804, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Protoss Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2805, + LocationType.MASTERY, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "No Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2807, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2808, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_basic_splash(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2809, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_basic_splash(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2810, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2811, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "North Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Mid Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3302, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "South Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3303, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Close Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Northwest Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "North Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Northeast Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3307, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Southwest Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3308, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Southeast Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3309, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Kill Team", + SC2_RACESWAP_LOC_ID_OFFSET + 3310, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.zerg_common_unit(state)) + and logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 3311, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "2 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3312, + LocationType.EXTRA, + logic.zerg_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "4 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3313, + LocationType.EXTRA, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "6 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3314, + LocationType.EXTRA, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "North Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Mid Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3402, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "South Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Close Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Northwest Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "North Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Northeast Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3407, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Southwest Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3408, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Southeast Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3409, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Kill Team", + SC2_RACESWAP_LOC_ID_OFFSET + 3410, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.protoss_common_unit(state)) + and logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 3411, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "2 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3412, + LocationType.EXTRA, + logic.protoss_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "4 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3413, + LocationType.EXTRA, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "6 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3414, + LocationType.EXTRA, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and (adv_tactics or logic.zerg_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Mira Han", + SC2_RACESWAP_LOC_ID_OFFSET + 3501, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3502, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Mid Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3503, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Southwest Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3504, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "North Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3505, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "South Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3506, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "West Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3507, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Mira Han", + SC2_RACESWAP_LOC_ID_OFFSET + 3601, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3602, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Mid Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3603, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Southwest Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3604, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "North Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3605, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "South Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3606, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "West Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3607, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3700, + LocationType.VICTORY, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 3701, + LocationType.EXTRA, + logic.zergling_hydra_roach_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Loki", + SC2_RACESWAP_LOC_ID_OFFSET + 3702, + LocationType.CHALLENGE, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Lab Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3703, + LocationType.VANILLA, + logic.zergling_hydra_roach_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "North Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3704, + LocationType.VANILLA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Southeast Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3705, + LocationType.VANILLA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "West Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3706, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Northwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3707, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3708, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3709, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3800, + LocationType.VICTORY, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 3801, + LocationType.EXTRA, + logic.zealot_sentry_slayer_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Loki", + SC2_RACESWAP_LOC_ID_OFFSET + 3802, + LocationType.CHALLENGE, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Lab Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3803, + LocationType.VANILLA, + logic.zealot_sentry_slayer_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "North Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3804, + LocationType.VANILLA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Southeast Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3805, + LocationType.VANILLA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "West Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3806, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Northwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3807, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3808, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3809, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3900, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 1", + SC2_RACESWAP_LOC_ID_OFFSET + 3901, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 2", + SC2_RACESWAP_LOC_ID_OFFSET + 3902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 3", + SC2_RACESWAP_LOC_ID_OFFSET + 3903, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 3904, + LocationType.VANILLA, + lambda state: ( + logic.advanced_tactics or logic.zerg_competent_comp_competent_aa(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Barracks", + SC2_RACESWAP_LOC_ID_OFFSET + 3905, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Factories", + SC2_RACESWAP_LOC_ID_OFFSET + 3906, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Starports", + SC2_RACESWAP_LOC_ID_OFFSET + 3907, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Odin Not Trashed", + SC2_RACESWAP_LOC_ID_OFFSET + 3908, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp_competent_aa(state) + and logic.zerg_repair_odin(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Surprise Attack Ends", + SC2_RACESWAP_LOC_ID_OFFSET + 3909, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4000, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 1", + SC2_RACESWAP_LOC_ID_OFFSET + 4001, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 2", + SC2_RACESWAP_LOC_ID_OFFSET + 4002, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 3", + SC2_RACESWAP_LOC_ID_OFFSET + 4003, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 4004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Barracks", + SC2_RACESWAP_LOC_ID_OFFSET + 4005, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Factories", + SC2_RACESWAP_LOC_ID_OFFSET + 4006, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Starports", + SC2_RACESWAP_LOC_ID_OFFSET + 4007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Odin Not Trashed", + SC2_RACESWAP_LOC_ID_OFFSET + 4008, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_competent_comp(state) and logic.protoss_repair_odin(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Surprise Attack Ends", + SC2_RACESWAP_LOC_ID_OFFSET + 4009, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4500, + LocationType.VICTORY, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Factory", + SC2_RACESWAP_LOC_ID_OFFSET + 4501, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Armory", + SC2_RACESWAP_LOC_ID_OFFSET + 4502, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Shadow Ops", + SC2_RACESWAP_LOC_ID_OFFSET + 4503, + LocationType.VANILLA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4504, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Southwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4505, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Maar", + SC2_RACESWAP_LOC_ID_OFFSET + 4506, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Northwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4507, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Southwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4508, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "East Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4509, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4600, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Ultralisk Cavern", + SC2_RACESWAP_LOC_ID_OFFSET + 4601, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.zerg_common_unit(state)) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Hydralisk Den", + SC2_RACESWAP_LOC_ID_OFFSET + 4602, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.zerg_common_unit(state)) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Infestation Pit", + SC2_RACESWAP_LOC_ID_OFFSET + 4603, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4604, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Southwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4605, + LocationType.CHALLENGE, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Maar", + SC2_RACESWAP_LOC_ID_OFFSET + 4606, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Northwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4607, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Southwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4608, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "East Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4609, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4700, + LocationType.VICTORY, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Close Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4701, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "West Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4702, + LocationType.VANILLA, + lambda state: adv_tactics + or (logic.terran_common_unit(state) and logic.terran_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4703, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Southwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4704, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Southeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4705, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Northeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4706, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Northwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4707, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4800, + LocationType.VICTORY, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Close Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4801, + LocationType.VANILLA, + lambda state: adv_tactics or logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "West Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4802, + LocationType.VANILLA, + lambda state: ( + adv_tactics + or ( + logic.zerg_common_unit(state) + and logic.zerg_basic_kerriganless_anti_air(state) + and logic.spread_creep(state) + ) + ), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4803, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Southwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4804, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Southeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4805, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Northeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4806, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Northwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4807, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Defeat", + SC2_RACESWAP_LOC_ID_OFFSET + 4900, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Protoss Archive", + SC2_RACESWAP_LOC_ID_OFFSET + 4901, + LocationType.VANILLA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Kills", + SC2_RACESWAP_LOC_ID_OFFSET + 4902, + LocationType.VANILLA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Urun", + SC2_RACESWAP_LOC_ID_OFFSET + 4903, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Mohandar", + SC2_RACESWAP_LOC_ID_OFFSET + 4904, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Selendis", + SC2_RACESWAP_LOC_ID_OFFSET + 4905, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 4906, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Defeat", + SC2_RACESWAP_LOC_ID_OFFSET + 5000, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Protoss Archive", + SC2_RACESWAP_LOC_ID_OFFSET + 5001, + LocationType.VANILLA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Kills", + SC2_RACESWAP_LOC_ID_OFFSET + 5002, + LocationType.VANILLA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Urun", + SC2_RACESWAP_LOC_ID_OFFSET + 5003, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Mohandar", + SC2_RACESWAP_LOC_ID_OFFSET + 5004, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Selendis", + SC2_RACESWAP_LOC_ID_OFFSET + 5005, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 5006, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5100, + LocationType.VICTORY, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Large Army", + SC2_RACESWAP_LOC_ID_OFFSET + 5101, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "2 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5102, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "4 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5103, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "6 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5104, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "8 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5105, + LocationType.CHALLENGE, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Southwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5106, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Northwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5107, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Northeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5108, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "East Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5109, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Southeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5110, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Expansion Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5111, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5200, + LocationType.VICTORY, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Large Army", + SC2_RACESWAP_LOC_ID_OFFSET + 5201, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "2 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5202, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "4 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5203, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "6 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5204, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "8 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5205, + LocationType.CHALLENGE, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Southwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5206, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Northwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5207, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Northeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5208, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "East Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5209, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Southeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5210, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Expansion Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5211, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5500, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Close Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5501, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Northwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5502, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Southeast Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5503, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Southwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5504, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Leviathan", + SC2_RACESWAP_LOC_ID_OFFSET + 5505, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "East Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5506, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "North Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5507, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Mid Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5508, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5600, + LocationType.VICTORY, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Close Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5601, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Northwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Southeast Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5603, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Southwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5604, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Leviathan", + SC2_RACESWAP_LOC_ID_OFFSET + 5605, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "East Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5606, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "North Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5607, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Mid Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5608, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5700, + LocationType.VICTORY, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "First Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5701, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Second Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5702, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Third Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5703, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Fourth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5704, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Fifth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5705, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5800, + LocationType.VICTORY, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "First Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5801, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Second Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5802, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Third Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5803, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Fourth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5804, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Fifth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5805, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5900, + LocationType.VICTORY, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Gather Minerals", + SC2_RACESWAP_LOC_ID_OFFSET + 5901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "South Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5902, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "East Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5903, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "West Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5904, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 5905, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Supply Depot", + SC2_RACESWAP_LOC_ID_OFFSET + 5906, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Gas Turrets", + SC2_RACESWAP_LOC_ID_OFFSET + 5907, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Win In Under 10 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 5908, + LocationType.CHALLENGE, + lambda state: logic.terran_common_unit(state) + and logic.terran_early_tech(state), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6000, + LocationType.VICTORY, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Gather Minerals", + SC2_RACESWAP_LOC_ID_OFFSET + 6001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "South Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6002, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "East Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6003, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "West Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 6005, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 6006, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Gas Turrets", + SC2_RACESWAP_LOC_ID_OFFSET + 6007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Win In Under 10 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 6008, + LocationType.CHALLENGE, + logic.protoss_common_unit, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Right Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6301, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Center Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Left Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Hold Out Finished", + SC2_RACESWAP_LOC_ID_OFFSET + 6304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Kill All Buildings Before Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 6305, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and logic.terran_defense_rating(state, False, False) >= 3 + and logic.terran_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Right Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Center Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6402, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Left Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6403, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Hold Out Finished", + SC2_RACESWAP_LOC_ID_OFFSET + 6404, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Kill All Buildings Before Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 6405, + LocationType.MASTERY, + lambda state: ( + logic.protoss_competent_comp(state) + and logic.protoss_defense_rating(state, False) >= 3 + and logic.protoss_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6500, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "First Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "North Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6502, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "West Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6503, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Lost Base", + SC2_RACESWAP_LOC_ID_OFFSET + 6504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Northeast Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6505, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Northwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6506, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Southwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6507, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Nafash", + SC2_RACESWAP_LOC_ID_OFFSET + 6508, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "20 Unfrozen Structures", + SC2_RACESWAP_LOC_ID_OFFSET + 6509, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "First Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "North Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6602, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "West Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6603, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Lost Base", + SC2_RACESWAP_LOC_ID_OFFSET + 6604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Northeast Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6605, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Northwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6606, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Southwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6607, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Nafash", + SC2_RACESWAP_LOC_ID_OFFSET + 6608, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "20 Unfrozen Structures", + SC2_RACESWAP_LOC_ID_OFFSET + 6609, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6700, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6701, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Center Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6702, + LocationType.VANILLA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Destroy 4 Shuttles", + SC2_RACESWAP_LOC_ID_OFFSET + 6704, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Frozen Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 6705, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Southwest Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6706, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Southeast Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6707, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6708, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6709, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6710, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_common_unit(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Center Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6711, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6712, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6800, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6801, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Center Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6802, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Destroy 4 Shuttles", + SC2_RACESWAP_LOC_ID_OFFSET + 6804, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Frozen Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 6805, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Southwest Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6806, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Southeast Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6807, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6808, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6809, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6810, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Center Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6811, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6812, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7100, + LocationType.VICTORY, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Center Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7101, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7102, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Repel Zagara", + SC2_RACESWAP_LOC_ID_OFFSET + 7103, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Close Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7104, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "South Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7105, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Southwest Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7106, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Southeast Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7107, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "North Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7108, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Northeast Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7109, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Win Without 100 Eggs", + SC2_RACESWAP_LOC_ID_OFFSET + 7110, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7200, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Center Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7201, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7202, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Repel Zagara", + SC2_RACESWAP_LOC_ID_OFFSET + 7203, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Close Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "South Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7205, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Southwest Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7206, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Southeast Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7207, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "North Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7208, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Northeast Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7209, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Win Without 100 Eggs", + SC2_RACESWAP_LOC_ID_OFFSET + 7210, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "West Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "North Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Destroy 3 Gorgons", + SC2_RACESWAP_LOC_ID_OFFSET + 7304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Close Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7306, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "North Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7307, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "West Medic Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7308, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "East Medic Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7310, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Northwest Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7311, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Southeast Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7312, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "West Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "North Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7402, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7403, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Destroy 3 Gorgons", + SC2_RACESWAP_LOC_ID_OFFSET + 7404, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Close Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7406, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "North Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7407, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "West Energizer Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7408, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "East Energizer Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7409, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7410, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Northwest Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7411, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Southeast Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7412, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7500, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "East Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7501, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "North Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7502, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Get Nuked", + SC2_RACESWAP_LOC_ID_OFFSET + 7503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Entrance Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Citadel Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7505, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "South Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7506, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Rich Mineral Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7507, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7600, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "East Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7601, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "North Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Get Nuked", + SC2_RACESWAP_LOC_ID_OFFSET + 7603, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Entrance Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Citadel Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7605, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "South Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7606, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Rich Mineral Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7607, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7700, + LocationType.VICTORY, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Center Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7702, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_basic_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_basic_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Finish Feeding", + SC2_RACESWAP_LOC_ID_OFFSET + 7704, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7705, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7706, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7707, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7708, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 7709, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and ( + # Fast unit + state.has_any( + ( + item_names.BANSHEE, + item_names.VULTURE, + item_names.DIAMONDBACK, + item_names.WARHOUND, + item_names.CYCLONE, + ), + player, + ) + or state.has_all( + (item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), + player, + ) + or state.has_all( + ( + item_names.WRAITH, + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY, + ), + player, + ) + ) + ), + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7800, + LocationType.VICTORY, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Center Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Finish Feeding", + SC2_RACESWAP_LOC_ID_OFFSET + 7804, + LocationType.EXTRA, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7805, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7806, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7807, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7808, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 7809, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7900, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Tyrannozor", + SC2_RACESWAP_LOC_ID_OFFSET + 7901, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Reach the Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7902, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "15 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 7903, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "5 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 7904, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Pincer Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 7905, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Yagdra Claims Brakk's Pack", + SC2_RACESWAP_LOC_ID_OFFSET + 7906, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8000, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Tyrannozor", + SC2_RACESWAP_LOC_ID_OFFSET + 8001, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Reach the Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 8002, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "15 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 8003, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "5 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 8004, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Pincer Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 8005, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Yagdra Claims Brakk's Pack", + SC2_RACESWAP_LOC_ID_OFFSET + 8006, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "East Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8301, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Center Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "West Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "First Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Second Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Base Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "East Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8307, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Mid Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8308, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "North Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Close Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8310, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Far Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8311, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8400, + LocationType.VICTORY, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "East Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Center Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8402, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "West Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8403, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "First Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Second Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Base Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "East Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8407, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Mid Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8408, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "North Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8409, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Close Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8410, + LocationType.EXTRA, + lambda state: ( + logic.protoss_competent_comp(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Far Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8411, + LocationType.EXTRA, + lambda state: ( + logic.protoss_competent_comp(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8500, + LocationType.VICTORY, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "North War Bot", + SC2_RACESWAP_LOC_ID_OFFSET + 8501, + LocationType.VANILLA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "South War Bot", + SC2_RACESWAP_LOC_ID_OFFSET + 8502, + LocationType.VANILLA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 1 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8503, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 2 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8504, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 3 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8505, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 4 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8506, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 5 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8507, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 6 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8508, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 7 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8509, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8600, + LocationType.VICTORY, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "North Stone Zealot", + SC2_RACESWAP_LOC_ID_OFFSET + 8601, + LocationType.VANILLA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "South Stone Zealot", + SC2_RACESWAP_LOC_ID_OFFSET + 8602, + LocationType.VANILLA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 1 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8603, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 2 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8604, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 3 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8605, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 4 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8606, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 5 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8607, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 6 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8608, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 7 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8609, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8700, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northwest Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8701, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northeast Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8702, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "South Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8703, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Base Established", + SC2_RACESWAP_LOC_ID_OFFSET + 8704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Close Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8705, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Mid Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8706, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Southeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8707, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8708, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northwest Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8709, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8800, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northwest Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8801, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northeast Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8802, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "South Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8803, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Base Established", + SC2_RACESWAP_LOC_ID_OFFSET + 8804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Close Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8805, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Mid Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8806, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Southeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8807, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8808, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northwest Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8809, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9300, + LocationType.VICTORY, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "East Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9301, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Northwest Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9302, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "North Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9303, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "1 Laser Drill Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9304, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "2 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9305, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "3 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9306, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "4 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9307, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "5 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9308, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Sons of Korhal", + SC2_RACESWAP_LOC_ID_OFFSET + 9309, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Night Wolves", + SC2_RACESWAP_LOC_ID_OFFSET + 9310, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "West Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9311, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Mid Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9312, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9400, + LocationType.VICTORY, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "East Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9401, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Northwest Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9402, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "North Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9403, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "1 Particle Cannon Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9404, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "2 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9405, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "3 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9406, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "4 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9407, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "5 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9408, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Sons of Korhal", + SC2_RACESWAP_LOC_ID_OFFSET + 9409, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Night Wolves", + SC2_RACESWAP_LOC_ID_OFFSET + 9410, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "West Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9411, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Mid Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9412, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9500, + LocationType.VICTORY, + logic.terran_base_trasher, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "First Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Second Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9502, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Third Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9503, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Expansion Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9504, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Main Path Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9505, + LocationType.EXTRA, + logic.terran_base_trasher, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9600, + LocationType.VICTORY, + lambda state: logic.protoss_deathball + or (adv_tactics and logic.protoss_competent_comp(state)), + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "First Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Second Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Third Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9603, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Expansion Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9604, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Main Path Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9605, + LocationType.EXTRA, + lambda state: logic.protoss_deathball + or (adv_tactics and logic.protoss_competent_comp(state)), + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9700, + LocationType.VICTORY, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "South Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9701, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "North Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9702, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "East Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9703, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 9704, + LocationType.EXTRA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Trash the Odin Early", + SC2_RACESWAP_LOC_ID_OFFSET + 9705, + LocationType.MASTERY, + lambda state: ( + logic.terran_the_reckoning_requirement(state) + and logic.terran_power_rating(state) >= 10 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9800, + LocationType.VICTORY, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "South Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9801, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "North Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9802, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "East Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9803, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 9804, + LocationType.EXTRA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Trash the Odin Early", + SC2_RACESWAP_LOC_ID_OFFSET + 9805, + LocationType.MASTERY, + lambda state: ( + logic.protoss_the_reckoning_requirement(state) + and ( + logic.protoss_fleet(state) + or logic.protoss_power_rating(state) >= 10 + ) + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9900, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "First Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 9901, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Second Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 9902, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "First Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 9903, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Second Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 9904, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 9905, + LocationType.MASTERY, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 6 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10000, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "First Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 10001, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Second Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 10002, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "First Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10003, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Second Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10004, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10005, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.zerg_base_buster(state) + and logic.zerg_power_rating(state) >= 6 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10100, + LocationType.VICTORY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "South Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10101, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "West Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10102, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "East Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10103, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + and logic.terran_can_grab_ghosts_in_the_fog_east_rock_formation(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10200, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "South Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10201, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "West Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10202, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "East Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10203, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + and logic.zerg_can_grab_ghosts_in_the_fog_east_rock_formation(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10700, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Close Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "East Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10702, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + or ( + logic.terran_moderate_anti_air(state) + and logic.terran_any_air_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "West Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Templar Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10705, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10800, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Close Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "East Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10802, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "West Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10803, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Templar Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10805, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10900, + LocationType.VICTORY, + logic.terran_spear_of_adun_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Factory", + SC2_RACESWAP_LOC_ID_OFFSET + 10901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Armory", + SC2_RACESWAP_LOC_ID_OFFSET + 10902, + LocationType.VANILLA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Starport", + SC2_RACESWAP_LOC_ID_OFFSET + 10903, + LocationType.VANILLA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "North Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10904, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "East Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10905, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "South Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10906, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Southeast Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10907, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Baneling Nest", + SC2_RACESWAP_LOC_ID_OFFSET + 11001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Roach Warren", + SC2_RACESWAP_LOC_ID_OFFSET + 11002, + LocationType.VANILLA, + lambda state: ( + logic.zerg_spear_of_adun_requirement(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Infestation Pit", + SC2_RACESWAP_LOC_ID_OFFSET + 11003, + LocationType.VANILLA, + lambda state: ( + logic.zerg_spear_of_adun_requirement(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "North Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11004, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "East Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11005, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "South Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11006, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Southeast Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11007, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11100, + LocationType.VICTORY, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Mid EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11101, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southeast EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11102, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "North EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11103, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Mid Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11104, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11105, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Northwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11106, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Northeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11107, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11108, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "West Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11109, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "East Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11110, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11200, + LocationType.VICTORY, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Mid EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11201, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southeast EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11202, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "North EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11203, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Mid Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11205, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Northwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11206, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Northeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11207, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11208, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "West Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11209, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "East Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11210, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Mid Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "North Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "South Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Raynor Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Valerian Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11305, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Win in under 15 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 11306, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11400, + LocationType.VICTORY, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Mid Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "North Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11402, + LocationType.VANILLA, + lambda state: ( + logic.zerg_brothers_in_arms_requirement(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and ( + logic.zerg_common_unit(state) or logic.terran_common_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "South Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11403, + LocationType.VANILLA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Raynor Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11404, + LocationType.EXTRA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Valerian Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11405, + LocationType.EXTRA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Win in under 15 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 11406, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_brothers_in_arms_requirement + and logic.zerg_base_buster(state) + and logic.zerg_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11500, + LocationType.VICTORY, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Close Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "North Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11502, + LocationType.VANILLA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "East Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11503, + LocationType.VANILLA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11504, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "South Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11505, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Northwest Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11506, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11507, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11600, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Close Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "North Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11602, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "East Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11603, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11604, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "South Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11605, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Northwest Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11606, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11607, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11700, + LocationType.VICTORY, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "West Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11701, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "North Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11702, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "East Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11703, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "1 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11704, + LocationType.EXTRA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "1.5 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11705, + LocationType.VANILLA, + lambda state: logic.terran_last_stand_requirement(state) + and logic.terran_defense_rating(state, True, True) >= 13, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11800, + LocationType.VICTORY, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "West Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11801, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "North Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11802, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "East Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11803, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "1 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11804, + LocationType.EXTRA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "1.5 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11805, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11900, + LocationType.VICTORY, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "South Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11901, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "North Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11902, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Northwest Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11903, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Rescue Medics", + SC2_RACESWAP_LOC_ID_OFFSET + 11904, + LocationType.EXTRA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Destroy Gateways", + SC2_RACESWAP_LOC_ID_OFFSET + 11905, + LocationType.CHALLENGE, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "South Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12001, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "North Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12002, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Northwest Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12003, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Rescue Infested Medics", + SC2_RACESWAP_LOC_ID_OFFSET + 12004, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Destroy Gateways", + SC2_RACESWAP_LOC_ID_OFFSET + 12005, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12100, + LocationType.VICTORY, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Mid Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12101, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "West Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12102, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "South Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12103, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "East Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12104, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "North Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12105, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Titanic Warp Prism", + SC2_RACESWAP_LOC_ID_OFFSET + 12106, + LocationType.VANILLA, + logic.terran_temple_of_unification_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Terran Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12107, + LocationType.MASTERY, + lambda state: ( + logic.terran_temple_of_unification_requirement(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Protoss Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12108, + LocationType.MASTERY, + lambda state: ( + logic.terran_temple_of_unification_requirement(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12200, + LocationType.VICTORY, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Mid Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12201, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "West Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12202, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "South Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12203, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "East Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12204, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "North Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12205, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Titanic Warp Prism", + SC2_RACESWAP_LOC_ID_OFFSET + 12206, + LocationType.VANILLA, + logic.zerg_temple_of_unification_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Terran Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12207, + LocationType.MASTERY, + lambda state: ( + logic.zerg_temple_of_unification_requirement(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Protoss Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12208, + LocationType.MASTERY, + lambda state: ( + logic.zerg_temple_of_unification_requirement(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12500, + LocationType.VICTORY, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 12501, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Northwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12502, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Northeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12503, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Southwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12504, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Southeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12505, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "South Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12506, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Mid Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12507, + LocationType.VANILLA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "North Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12508, + LocationType.VANILLA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12600, + LocationType.VICTORY, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 12601, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Northwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12602, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Northeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12603, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Southwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12604, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Southeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12605, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "South Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12606, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Mid Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12607, + LocationType.VANILLA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "North Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12608, + LocationType.VANILLA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12700, + LocationType.VICTORY, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 12701, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "First Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12702, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics + or logic.terran_unsealing_the_past_requirement(state) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Second Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12703, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Third Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12704, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Fourth Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12705, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "South Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12706, + LocationType.VANILLA, + lambda state: ( + logic.terran_unsealing_the_past_requirement(state) + and ( + adv_tactics + or logic.terran_air(state) + or state.has_all( + {item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, player + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "East Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12707, + LocationType.VANILLA, + lambda state: ( + logic.terran_unsealing_the_past_requirement(state) + and ( + adv_tactics + or logic.terran_air(state) + or state.has_all( + {item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, player + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12800, + LocationType.VICTORY, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 12801, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "First Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12802, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics + or logic.zerg_unsealing_the_past_requirement(state) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Second Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12803, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Third Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12804, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Fourth Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12805, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "South Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12806, + LocationType.VANILLA, + lambda state: ( + logic.zerg_unsealing_the_past_requirement(state) + and ( + adv_tactics + or ( + state.has(item_names.MUTALISK, player) + or logic.morph_brood_lord(state) + or logic.morph_guardian(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "East Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12807, + LocationType.VANILLA, + lambda state: ( + logic.zerg_unsealing_the_past_requirement(state) + and ( + adv_tactics + or ( + state.has(item_names.MUTALISK, player) + or logic.morph_brood_lord(state) + or logic.morph_guardian(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12900, + LocationType.VICTORY, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12901, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: Northeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12902, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: Southeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12903, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12904, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12905, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12906, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12907, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: Mid Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12908, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12909, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12910, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12911, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: South Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12912, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "Purifier Warden", + SC2_RACESWAP_LOC_ID_OFFSET + 12913, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13000, + LocationType.VICTORY, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13001, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: Northeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13002, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: Southeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13003, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13004, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13005, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13006, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13007, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: Mid Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13008, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13009, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13010, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13011, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: South Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13012, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "Purifier Warden", + SC2_RACESWAP_LOC_ID_OFFSET + 13013, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13100, + LocationType.VICTORY, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "First Terrazine Fog", + SC2_RACESWAP_LOC_ID_OFFSET + 13101, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Southwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13102, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "West Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13103, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Northwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13104, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Northeast Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13105, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "North Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13106, + LocationType.VANILLA, + logic.terran_steps_of_the_rite_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "South Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13107, + LocationType.VANILLA, + logic.terran_steps_of_the_rite_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13200, + LocationType.VICTORY, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "First Terrazine Fog", + SC2_RACESWAP_LOC_ID_OFFSET + 13201, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Southwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13202, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "West Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13203, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Northwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13204, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Northeast Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13205, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "North Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13206, + LocationType.VANILLA, + logic.zerg_steps_of_the_rite_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "South Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13207, + LocationType.VANILLA, + logic.zerg_steps_of_the_rite_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13300, + LocationType.VICTORY, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "North Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13301, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Southwest Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13302, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "East Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13303, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 13304, + LocationType.EXTRA, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Destroy Nexuses", + SC2_RACESWAP_LOC_ID_OFFSET + 13305, + LocationType.CHALLENGE, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Win in under 15 minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 13306, + LocationType.MASTERY, + logic.terran_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13400, + LocationType.VICTORY, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "North Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13401, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Southwest Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13402, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "East Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13403, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 13404, + LocationType.EXTRA, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Destroy Nexuses", + SC2_RACESWAP_LOC_ID_OFFSET + 13405, + LocationType.CHALLENGE, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Win in under 15 minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 13406, + LocationType.MASTERY, + logic.zerg_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13500, + LocationType.VICTORY, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Northwest Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13501, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Northeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13502, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Southeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13503, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "West Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13504, + LocationType.VANILLA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13505, + LocationType.VANILLA, + lambda state: ( + logic.terran_templars_charge_requirement(state) + and logic.terran_air(state) + ), + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13600, + LocationType.VICTORY, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Northwest Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13601, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Northeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13602, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Southeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13603, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "West Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13604, + LocationType.VANILLA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13605, + LocationType.VANILLA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13900, + LocationType.VICTORY, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Southeast Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13901, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "South Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13902, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Southwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13903, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "North Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13904, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Northwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13905, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Nerazim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13906, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Tal'darim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13907, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Purifier Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13908, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14000, + LocationType.VICTORY, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Southeast Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14001, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "South Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14002, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Southwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14003, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "North Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14004, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Northwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14005, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Nerazim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14006, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Tal'darim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14007, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Purifier Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14008, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14100, + LocationType.VICTORY, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Fabrication Matrix", + SC2_RACESWAP_LOC_ID_OFFSET + 14101, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Assault Cluster", + SC2_RACESWAP_LOC_ID_OFFSET + 14102, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Hull Breach", + SC2_RACESWAP_LOC_ID_OFFSET + 14103, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Core Critical", + SC2_RACESWAP_LOC_ID_OFFSET + 14104, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Kill Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 14105, + LocationType.MASTERY, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14200, + LocationType.VICTORY, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Fabrication Matrix", + SC2_RACESWAP_LOC_ID_OFFSET + 14201, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Assault Cluster", + SC2_RACESWAP_LOC_ID_OFFSET + 14202, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Hull Breach", + SC2_RACESWAP_LOC_ID_OFFSET + 14203, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Core Critical", + SC2_RACESWAP_LOC_ID_OFFSET + 14204, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Kill Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 14205, + LocationType.MASTERY, + logic.zerg_salvation_requirement, + ), + ] + + # Filtering out excluded locations + if world is not None: + excluded_location_types = get_location_types( + world, LocationInclusion.option_disabled + ) + excluded_location_flags = get_location_flags( + world, LocationInclusion.option_disabled + ) + chance_location_types = get_location_types( + world, LocationInclusion.option_half_chance + ) + chance_location_flags = get_location_flags( + world, LocationInclusion.option_half_chance + ) + plando_locations = get_plando_locations(world) + exclude_locations = world.options.exclude_locations.value + + def include_location(location: LocationData) -> bool: + if location.type is LocationType.VICTORY: + return True + if location.name in plando_locations: + return True + if location.name in exclude_locations: + return False + if location.flags & excluded_location_flags: + return False + if location.type in excluded_location_types: + return False + if location.flags & chance_location_flags: + if world.random.random() < 0.5: + return False + if location.type in chance_location_types: + if world.random.random() < 0.5: + return False + return True + + location_table = [ + location for location in location_table if include_location(location) + ] + beat_events: List[LocationData] = [] + victory_caches: List[LocationData] = [] + VICTORY_CACHE_SIZE = 10 + for location_data in location_table: + # Generating Beat event and Victory Cache locations + if location_data.type == LocationType.VICTORY: + beat_events.append( + location_data._replace(name="Beat " + location_data.region, code=None) # type: ignore + ) + for v in range(VICTORY_CACHE_SIZE): + victory_caches.append( + location_data._replace( + name=location_data.name + f" Cache ({v + 1})", + code=location_data.code + VICTORY_CACHE_OFFSET + v, + type=LocationType.VICTORY_CACHE, + ) + ) + + return tuple(location_table + beat_events + victory_caches) + + +DEFAULT_LOCATION_LIST = get_locations(None) +"""A location table with `None` as the input world; does not contain logic rules""" + +lookup_location_id_to_type = { + loc.code: loc.type for loc in DEFAULT_LOCATION_LIST if loc.code is not None +} +lookup_location_id_to_flags = { + loc.code: loc.flags for loc in DEFAULT_LOCATION_LIST if loc.code is not None +} diff --git a/worlds/sc2/mission_groups.py b/worlds/sc2/mission_groups.py new file mode 100644 index 00000000..de6e7d34 --- /dev/null +++ b/worlds/sc2/mission_groups.py @@ -0,0 +1,194 @@ +""" +Mission group aliases for use in yaml options. +""" + +from typing import Dict, List, Set +from .mission_tables import SC2Mission, MissionFlag, SC2Campaign + + +class MissionGroupNames: + ALL_MISSIONS = "All Missions" + WOL_MISSIONS = "WoL Missions" + HOTS_MISSIONS = "HotS Missions" + LOTV_MISSIONS = "LotV Missions" + NCO_MISSIONS = "NCO Missions" + PROPHECY_MISSIONS = "Prophecy Missions" + PROLOGUE_MISSIONS = "Prologue Missions" + EPILOGUE_MISSIONS = "Epilogue Missions" + + TERRAN_MISSIONS = "Terran Missions" + ZERG_MISSIONS = "Zerg Missions" + PROTOSS_MISSIONS = "Protoss Missions" + NOBUILD_MISSIONS = "No-Build Missions" + DEFENSE_MISSIONS = "Defense Missions" + AUTO_SCROLLER_MISSIONS = "Auto-Scroller Missions" + COUNTDOWN_MISSIONS = "Countdown Missions" + KERRIGAN_MISSIONS = "Kerrigan Missions" + VANILLA_SOA_MISSIONS = "Vanilla SOA Missions" + TERRAN_ALLY_MISSIONS = "Controllable Terran Ally Missions" + ZERG_ALLY_MISSIONS = "Controllable Zerg Ally Missions" + PROTOSS_ALLY_MISSIONS = "Controllable Protoss Ally Missions" + VS_TERRAN_MISSIONS = "Vs Terran Missions" + VS_ZERG_MISSIONS = "Vs Zerg Missions" + VS_PROTOSS_MISSIONS = "Vs Protoss Missions" + RACESWAP_MISSIONS = "Raceswap Missions" + + # By planet + PLANET_MAR_SARA_MISSIONS = "Planet Mar Sara" + PLANET_CHAR_MISSIONS = "Planet Char" + PLANET_KORHAL_MISSIONS = "Planet Korhal" + PLANET_AIUR_MISSIONS = "Planet Aiur" + + # By quest chain + WOL_MAR_SARA_MISSIONS = "WoL Mar Sara" + WOL_COLONIST_MISSIONS = "WoL Colonist" + WOL_ARTIFACT_MISSIONS = "WoL Artifact" + WOL_COVERT_MISSIONS = "WoL Covert" + WOL_REBELLION_MISSIONS = "WoL Rebellion" + WOL_CHAR_MISSIONS = "WoL Char" + + HOTS_UMOJA_MISSIONS = "HotS Umoja" + HOTS_KALDIR_MISSIONS = "HotS Kaldir" + HOTS_CHAR_MISSIONS = "HotS Char" + HOTS_ZERUS_MISSIONS = "HotS Zerus" + HOTS_SKYGEIRR_MISSIONS = "HotS Skygeirr Station" + HOTS_DOMINION_SPACE_MISSIONS = "HotS Dominion Space" + HOTS_KORHAL_MISSIONS = "HotS Korhal" + + LOTV_AIUR_MISSIONS = "LotV Aiur" + LOTV_KORHAL_MISSIONS = "LotV Korhal" + LOTV_SHAKURAS_MISSIONS = "LotV Shakuras" + LOTV_ULNAR_MISSIONS = "LotV Ulnar" + LOTV_PURIFIER_MISSIONS = "LotV Purifier" + LOTV_TALDARIM_MISSIONS = "LotV Tal'darim" + LOTV_MOEBIUS_MISSIONS = "LotV Moebius" + LOTV_RETURN_TO_AIUR_MISSIONS = "LotV Return to Aiur" + + NCO_MISSION_PACK_1 = "NCO Mission Pack 1" + NCO_MISSION_PACK_2 = "NCO Mission Pack 2" + NCO_MISSION_PACK_3 = "NCO Mission Pack 3" + + @classmethod + def get_all_group_names(cls) -> Set[str]: + return { + name + for identifier, name in cls.__dict__.items() + if not identifier.startswith("_") and not identifier.startswith("get_") + } + + +mission_groups: Dict[str, List[str]] = {} + +mission_groups[MissionGroupNames.ALL_MISSIONS] = [mission.mission_name for mission in SC2Mission] +for group_name, campaign in ( + (MissionGroupNames.WOL_MISSIONS, SC2Campaign.WOL), + (MissionGroupNames.HOTS_MISSIONS, SC2Campaign.HOTS), + (MissionGroupNames.LOTV_MISSIONS, SC2Campaign.LOTV), + (MissionGroupNames.NCO_MISSIONS, SC2Campaign.NCO), + (MissionGroupNames.PROPHECY_MISSIONS, SC2Campaign.PROPHECY), + (MissionGroupNames.PROLOGUE_MISSIONS, SC2Campaign.PROLOGUE), + (MissionGroupNames.EPILOGUE_MISSIONS, SC2Campaign.EPILOGUE), +): + mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if mission.campaign == campaign] + +for group_name, flags in ( + (MissionGroupNames.TERRAN_MISSIONS, MissionFlag.Terran), + (MissionGroupNames.ZERG_MISSIONS, MissionFlag.Zerg), + (MissionGroupNames.PROTOSS_MISSIONS, MissionFlag.Protoss), + (MissionGroupNames.NOBUILD_MISSIONS, MissionFlag.NoBuild), + (MissionGroupNames.DEFENSE_MISSIONS, MissionFlag.Defense), + (MissionGroupNames.AUTO_SCROLLER_MISSIONS, MissionFlag.AutoScroller), + (MissionGroupNames.COUNTDOWN_MISSIONS, MissionFlag.Countdown), + (MissionGroupNames.KERRIGAN_MISSIONS, MissionFlag.Kerrigan), + (MissionGroupNames.VANILLA_SOA_MISSIONS, MissionFlag.VanillaSoa), + (MissionGroupNames.TERRAN_ALLY_MISSIONS, MissionFlag.AiTerranAlly), + (MissionGroupNames.ZERG_ALLY_MISSIONS, MissionFlag.AiZergAlly), + (MissionGroupNames.PROTOSS_ALLY_MISSIONS, MissionFlag.AiProtossAlly), + (MissionGroupNames.VS_TERRAN_MISSIONS, MissionFlag.VsTerran), + (MissionGroupNames.VS_ZERG_MISSIONS, MissionFlag.VsZerg), + (MissionGroupNames.VS_PROTOSS_MISSIONS, MissionFlag.VsProtoss), + (MissionGroupNames.RACESWAP_MISSIONS, MissionFlag.RaceSwap), +): + mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if flags in mission.flags] + +for group_name, campaign, chain_name in ( + (MissionGroupNames.WOL_MAR_SARA_MISSIONS, SC2Campaign.WOL, "Mar Sara"), + (MissionGroupNames.WOL_COLONIST_MISSIONS, SC2Campaign.WOL, "Colonist"), + (MissionGroupNames.WOL_ARTIFACT_MISSIONS, SC2Campaign.WOL, "Artifact"), + (MissionGroupNames.WOL_COVERT_MISSIONS, SC2Campaign.WOL, "Covert"), + (MissionGroupNames.WOL_REBELLION_MISSIONS, SC2Campaign.WOL, "Rebellion"), + (MissionGroupNames.WOL_CHAR_MISSIONS, SC2Campaign.WOL, "Char"), + (MissionGroupNames.HOTS_UMOJA_MISSIONS, SC2Campaign.HOTS, "Umoja"), + (MissionGroupNames.HOTS_KALDIR_MISSIONS, SC2Campaign.HOTS, "Kaldir"), + (MissionGroupNames.HOTS_CHAR_MISSIONS, SC2Campaign.HOTS, "Char"), + (MissionGroupNames.HOTS_ZERUS_MISSIONS, SC2Campaign.HOTS, "Zerus"), + (MissionGroupNames.HOTS_SKYGEIRR_MISSIONS, SC2Campaign.HOTS, "Skygeirr Station"), + (MissionGroupNames.HOTS_DOMINION_SPACE_MISSIONS, SC2Campaign.HOTS, "Dominion Space"), + (MissionGroupNames.HOTS_KORHAL_MISSIONS, SC2Campaign.HOTS, "Korhal"), + (MissionGroupNames.LOTV_AIUR_MISSIONS, SC2Campaign.LOTV, "Aiur"), + (MissionGroupNames.LOTV_KORHAL_MISSIONS, SC2Campaign.LOTV, "Korhal"), + (MissionGroupNames.LOTV_SHAKURAS_MISSIONS, SC2Campaign.LOTV, "Shakuras"), + (MissionGroupNames.LOTV_ULNAR_MISSIONS, SC2Campaign.LOTV, "Ulnar"), + (MissionGroupNames.LOTV_PURIFIER_MISSIONS, SC2Campaign.LOTV, "Purifier"), + (MissionGroupNames.LOTV_TALDARIM_MISSIONS, SC2Campaign.LOTV, "Tal'darim"), + (MissionGroupNames.LOTV_MOEBIUS_MISSIONS, SC2Campaign.LOTV, "Moebius"), + (MissionGroupNames.LOTV_RETURN_TO_AIUR_MISSIONS, SC2Campaign.LOTV, "Return to Aiur"), +): + mission_groups[group_name] = [ + mission.mission_name for mission in SC2Mission if mission.campaign == campaign and mission.area == chain_name + ] + +mission_groups[MissionGroupNames.NCO_MISSION_PACK_1] = [ + SC2Mission.THE_ESCAPE.mission_name, + SC2Mission.SUDDEN_STRIKE.mission_name, + SC2Mission.ENEMY_INTELLIGENCE.mission_name, +] +mission_groups[MissionGroupNames.NCO_MISSION_PACK_2] = [ + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + SC2Mission.NIGHT_TERRORS.mission_name, + SC2Mission.FLASHPOINT.mission_name, +] +mission_groups[MissionGroupNames.NCO_MISSION_PACK_3] = [ + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + SC2Mission.DARK_SKIES.mission_name, + SC2Mission.END_GAME.mission_name, +] + +mission_groups[MissionGroupNames.PLANET_MAR_SARA_MISSIONS] = [ + SC2Mission.LIBERATION_DAY.mission_name, + SC2Mission.THE_OUTLAWS.mission_name, + SC2Mission.ZERO_HOUR.mission_name, +] +mission_groups[MissionGroupNames.PLANET_CHAR_MISSIONS] = [ + SC2Mission.GATES_OF_HELL.mission_name, + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + SC2Mission.SHATTER_THE_SKY.mission_name, + SC2Mission.ALL_IN.mission_name, + SC2Mission.DOMINATION.mission_name, + SC2Mission.FIRE_IN_THE_SKY.mission_name, + SC2Mission.OLD_SOLDIERS.mission_name, +] +mission_groups[MissionGroupNames.PLANET_KORHAL_MISSIONS] = [ + SC2Mission.MEDIA_BLITZ.mission_name, + SC2Mission.PLANETFALL.mission_name, + SC2Mission.DEATH_FROM_ABOVE.mission_name, + SC2Mission.THE_RECKONING.mission_name, + SC2Mission.SKY_SHIELD.mission_name, + SC2Mission.BROTHERS_IN_ARMS.mission_name, +] +mission_groups[MissionGroupNames.PLANET_AIUR_MISSIONS] = [ + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + SC2Mission.FOR_AIUR.mission_name, + SC2Mission.THE_GROWING_SHADOW.mission_name, + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + SC2Mission.TEMPLAR_S_RETURN.mission_name, + SC2Mission.THE_HOST.mission_name, + SC2Mission.SALVATION.mission_name, +] + +for mission in SC2Mission: + if mission.flags & MissionFlag.HasRaceSwap: + short_name = mission.get_short_name() + mission_groups[short_name] = [ + mission_var.mission_name for mission_var in SC2Mission if short_name in mission_var.mission_name + ] diff --git a/worlds/sc2/mission_order/__init__.py b/worlds/sc2/mission_order/__init__.py new file mode 100644 index 00000000..ec533ccd --- /dev/null +++ b/worlds/sc2/mission_order/__init__.py @@ -0,0 +1,66 @@ +from typing import List, Dict, Any, Callable, TYPE_CHECKING + +from BaseClasses import CollectionState +from ..mission_tables import SC2Mission, MissionFlag, get_goal_location +from .mission_pools import SC2MOGenMissionPools + +if TYPE_CHECKING: + from .nodes import SC2MOGenMissionOrder, SC2MOGenMission + +class SC2MissionOrder: + """ + Wrapper class for a generated mission order. Contains helper functions for getting data about generated missions. + """ + + def __init__(self, mission_order_node: 'SC2MOGenMissionOrder', mission_pools: SC2MOGenMissionPools): + self.mission_order_node: 'SC2MOGenMissionOrder' = mission_order_node + """Root node of the mission order structure.""" + self.mission_pools: SC2MOGenMissionPools = mission_pools + """Manager for missions in the mission order.""" + + def get_used_flags(self) -> Dict[MissionFlag, int]: + """Returns a dictionary of all used flags and their appearance count within the mission order. + Flags that don't appear in the mission order also don't appear in this dictionary.""" + return self.mission_pools.get_used_flags() + + def get_used_missions(self) -> List[SC2Mission]: + """Returns a list of all missions used in the mission order.""" + return self.mission_pools.get_used_missions() + + def get_mission_count(self) -> int: + """Returns the amount of missions in the mission order.""" + return sum( + len([mission for mission in layout.missions if not mission.option_empty]) + for campaign in self.mission_order_node.campaigns for layout in campaign.layouts + ) + + def get_starting_missions(self) -> List[SC2Mission]: + """Returns a list containing all the missions that are accessible without beating any other missions.""" + return [ + slot.mission + for campaign in self.mission_order_node.campaigns if campaign.is_always_unlocked() + for layout in campaign.layouts if layout.is_always_unlocked() + for slot in layout.missions if slot.is_always_unlocked() and not slot.option_empty + ] + + def get_completion_condition(self, player: int) -> Callable[[CollectionState], bool]: + """Returns a lambda to determine whether a state has beaten the mission order's required campaigns.""" + final_locations = [get_goal_location(mission.mission) for mission in self.get_final_missions()] + return lambda state, final_locations=final_locations: all(state.can_reach_location(loc, player) for loc in final_locations) + + def get_final_mission_ids(self) -> List[int]: + """Returns the IDs of all missions that are required to beat the mission order.""" + return [mission.mission.id for mission in self.get_final_missions()] + + def get_final_missions(self) -> List['SC2MOGenMission']: + """Returns the slots of all missions that are required to beat the mission order.""" + return self.mission_order_node.goal_missions + + def get_items_to_lock(self) -> Dict[str, int]: + """Returns a dict of item names and amounts that are required by Item entry rules.""" + return self.mission_order_node.items_to_lock + + def get_slot_data(self) -> List[Dict[str, Any]]: + """Parses the mission order into a format usable for slot data.""" + return self.mission_order_node.get_slot_data() + diff --git a/worlds/sc2/mission_order/entry_rules.py b/worlds/sc2/mission_order/entry_rules.py new file mode 100644 index 00000000..cb3afb37 --- /dev/null +++ b/worlds/sc2/mission_order/entry_rules.py @@ -0,0 +1,389 @@ +from __future__ import annotations +from typing import Set, Callable, Dict, List, Union, TYPE_CHECKING, Any, NamedTuple +from abc import ABC, abstractmethod +from dataclasses import dataclass + +from ..mission_tables import SC2Mission +from ..item.item_tables import item_table +from BaseClasses import CollectionState + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + + +class EntryRule(ABC): + buffer_fulfilled: bool + buffer_depth: int + + def __init__(self) -> None: + self.buffer_fulfilled = False + self.buffer_depth = -1 + + def is_always_fulfilled(self, in_region_creation: bool = False) -> bool: + return self.is_fulfilled(set(), in_region_creation) + + @abstractmethod + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_creation: bool) -> bool: + """Used during region creation to ensure a beatable mission order. + + `in_region_creation` should determine whether rules that cannot be handled during region creation (like Item rules) + report themselves as fulfilled or unfulfilled.""" + return False + + def is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_creation: bool) -> bool: + if len(beaten_missions) == 0: + # Special-cased to avoid the buffer + # This is used to determine starting missions + return self._is_fulfilled(beaten_missions, in_region_creation) + self.buffer_fulfilled = self.buffer_fulfilled or self._is_fulfilled(beaten_missions, in_region_creation) + return self.buffer_fulfilled + + @abstractmethod + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + """Used during region creation to determine the minimum depth this entry rule can be cleared at.""" + return -1 + + def get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + if not self.is_fulfilled(beaten_missions, in_region_creation = True): + return -1 + if self.buffer_depth == -1: + self.buffer_depth = self._get_depth(beaten_missions) + return self.buffer_depth + + @abstractmethod + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + """Passed to Archipelago for use during item placement.""" + return lambda _: False + + @abstractmethod + def to_slot_data(self) -> RuleData: + """Used in the client to determine accessibility while playing and to populate tooltips.""" + pass + + +@dataclass +class RuleData(ABC): + @abstractmethod + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + return "" + + @abstractmethod + def shows_single_rule(self) -> bool: + return False + + @abstractmethod + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + return False + + +class BeatMissionsEntryRule(EntryRule): + missions_to_beat: List[SC2MOGenMission] + visual_reqs: List[Union[str, SC2MOGenMission]] + + def __init__(self, missions_to_beat: List[SC2MOGenMission], visual_reqs: List[Union[str, SC2MOGenMission]]): + super().__init__() + self.missions_to_beat = missions_to_beat + self.visual_reqs = visual_reqs + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + return beaten_missions.issuperset(self.missions_to_beat) + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + return max(mission.min_depth for mission in self.missions_to_beat) + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + return lambda state: state.has_all([mission.beat_item() for mission in self.missions_to_beat], player) + + def to_slot_data(self) -> RuleData: + resolved_reqs: List[Union[str, int]] = [req if isinstance(req, str) else req.mission.id for req in self.visual_reqs] + mission_ids = [mission.mission.id for mission in self.missions_to_beat] + return BeatMissionsRuleData( + mission_ids, + resolved_reqs + ) + + +@dataclass +class BeatMissionsRuleData(RuleData): + mission_ids: List[int] + visual_reqs: List[Union[str, int]] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if len(self.visual_reqs) == 1: + req = self.visual_reqs[0] + return f"Beat {missions[req].mission_name if isinstance(req, int) else req}" + tooltip = f"Beat all of these:\n{indent}- " + reqs = [missions[req].mission_name if isinstance(req, int) else req for req in self.visual_reqs] + tooltip += f"\n{indent}- ".join(req for req in reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Beat rules are accessible if all their missions are beaten and accessible + if not beaten_missions.issuperset(self.mission_ids): + return False + return True + + +class CountMissionsEntryRule(EntryRule): + missions_to_count: List[SC2MOGenMission] + target_amount: int + visual_reqs: List[Union[str, SC2MOGenMission]] + + def __init__(self, missions_to_count: List[SC2MOGenMission], target_amount: int, visual_reqs: List[Union[str, SC2MOGenMission]]): + super().__init__() + self.missions_to_count = missions_to_count + if target_amount == -1 or target_amount > len(missions_to_count): + self.target_amount = len(missions_to_count) + else: + self.target_amount = target_amount + self.visual_reqs = visual_reqs + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + return self.target_amount <= len(beaten_missions.intersection(self.missions_to_count)) + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + sorted_missions = sorted(beaten_missions.intersection(self.missions_to_count), key = lambda mission: mission.min_depth) + mission_depth = max(mission.min_depth for mission in sorted_missions[:self.target_amount]) + return max(mission_depth, self.target_amount - 1) # -1 because depth is zero-based but amount is one-based + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + return lambda state: self.target_amount <= sum(state.has(mission.beat_item(), player) for mission in self.missions_to_count) + + def to_slot_data(self) -> RuleData: + resolved_reqs: List[Union[str, int]] = [req if isinstance(req, str) else req.mission.id for req in self.visual_reqs] + mission_ids = [mission.mission.id for mission in sorted(self.missions_to_count, key = lambda mission: mission.min_depth)] + return CountMissionsRuleData( + mission_ids, + self.target_amount, + resolved_reqs + ) + + +@dataclass +class CountMissionsRuleData(RuleData): + mission_ids: List[int] + amount: int + visual_reqs: List[Union[str, int]] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if self.amount == len(self.mission_ids): + amount = "all" + else: + amount = str(self.amount) + if len(self.visual_reqs) == 1: + req = self.visual_reqs[0] + req_str = missions[req].mission_name if isinstance(req, int) else req + if self.amount == 1: + if type(req) == int: + return f"Beat {req_str}" + return f"Beat any mission from {req_str}" + return f"Beat {amount} missions from {req_str}" + if self.amount == 1: + tooltip = f"Beat any mission from:\n{indent}- " + else: + tooltip = f"Beat {amount} missions from:\n{indent}- " + reqs = [missions[req].mission_name if isinstance(req, int) else req for req in self.visual_reqs] + tooltip += f"\n{indent}- ".join(req for req in reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Count rules are accessible if enough of their missions are beaten and accessible + return len([mission_id for mission_id in self.mission_ids if mission_id in beaten_missions]) >= self.amount + + +class SubRuleEntryRule(EntryRule): + rule_id: int + rules_to_check: List[EntryRule] + target_amount: int + min_depth: int + + def __init__(self, rules_to_check: List[EntryRule], target_amount: int, rule_id: int): + super().__init__() + self.rule_id = rule_id + self.rules_to_check = rules_to_check + self.min_depth = -1 + if target_amount == -1 or target_amount > len(rules_to_check): + self.target_amount = len(rules_to_check) + else: + self.target_amount = target_amount + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + return self.target_amount <= sum(rule.is_fulfilled(beaten_missions, in_region_check) for rule in self.rules_to_check) + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + if len(self.rules_to_check) == 0: + return self.min_depth + # It should be guaranteed by is_fulfilled that enough rules have a valid depth because they are fulfilled + filtered_rules = [rule for rule in self.rules_to_check if rule.get_depth(beaten_missions) > -1] + sorted_rules = sorted(filtered_rules, key = lambda rule: rule.get_depth(beaten_missions)) + required_depth = max(rule.get_depth(beaten_missions) for rule in sorted_rules[:self.target_amount]) + return max(required_depth, self.min_depth) + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + sub_lambdas = [rule.to_lambda(player) for rule in self.rules_to_check] + return lambda state, sub_lambdas=sub_lambdas: self.target_amount <= sum(sub_lambda(state) for sub_lambda in sub_lambdas) + + def to_slot_data(self) -> SubRuleRuleData: + sub_rules = [rule.to_slot_data() for rule in self.rules_to_check] + return SubRuleRuleData( + self.rule_id, + sub_rules, + self.target_amount + ) + + +@dataclass +class SubRuleRuleData(RuleData): + rule_id: int + sub_rules: List[RuleData] + amount: int + + @staticmethod + def parse_from_dict(data: Dict[str, Any]) -> SubRuleRuleData: + amount = data["amount"] + rule_id = data["rule_id"] + sub_rules: List[RuleData] = [] + for rule_data in data["sub_rules"]: + if "sub_rules" in rule_data: + rule: RuleData = SubRuleRuleData.parse_from_dict(rule_data) + elif "item_ids" in rule_data: + # Slot data converts Dict[int, int] to Dict[str, int] for some reason + item_ids = {int(item): item_amount for (item, item_amount) in rule_data["item_ids"].items()} + rule = ItemRuleData( + item_ids, + rule_data["visual_reqs"] + ) + elif "amount" in rule_data: + rule = CountMissionsRuleData( + **{field: value for field, value in rule_data.items()} + ) + else: + rule = BeatMissionsRuleData( + **{field: value for field, value in rule_data.items()} + ) + sub_rules.append(rule) + rule = SubRuleRuleData( + rule_id, + sub_rules, + amount + ) + return rule + + @staticmethod + def empty() -> SubRuleRuleData: + return SubRuleRuleData(-1, [], 0) + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if self.amount == len(self.sub_rules): + if self.amount == 1: + return self.sub_rules[0].tooltip(indents, missions, done_color, not_done_color) + amount = "all" + elif self.amount == 1: + amount = "any" + else: + amount = str(self.amount) + tooltip = f"Fulfill {amount} of these conditions:\n{indent}- " + subrule_tooltips: List[str] = [] + for rule in self.sub_rules: + sub_tooltip = rule.tooltip(indents + 4, missions, done_color, not_done_color) + if getattr(rule, "was_accessible", False): + subrule_tooltips.append(f"[color={done_color}]{sub_tooltip}[/color]") + else: + subrule_tooltips.append(f"[color={not_done_color}]{sub_tooltip}[/color]") + tooltip += f"\n{indent}- ".join(sub_tooltip for sub_tooltip in subrule_tooltips) + return tooltip + + def shows_single_rule(self) -> bool: + return self.amount == len(self.sub_rules) == 1 and self.sub_rules[0].shows_single_rule() + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Sub-rule rules are accessible if enough of their child rules are accessible + accessible_count = 0 + success = accessible_count >= self.amount + if self.amount > 0: + for rule in self.sub_rules: + if rule.is_accessible(beaten_missions, received_items): + rule.was_accessible = True + accessible_count += 1 + if accessible_count >= self.amount: + success = True + break + else: + rule.was_accessible = False + + return success + +class MissionEntryRules(NamedTuple): + mission_rule: SubRuleRuleData + layout_rule: SubRuleRuleData + campaign_rule: SubRuleRuleData + + +class ItemEntryRule(EntryRule): + items_to_check: Dict[str, int] + + def __init__(self, items_to_check: Dict[str, int]) -> None: + super().__init__() + self.items_to_check = items_to_check + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + # Region creation should assume items can be placed, + # but later uses (eg. starter missions) should respect that this locks a mission + return in_region_check + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + # Depth 0 means this rule requires 0 prior beaten missions + return 0 + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + return lambda state: state.has_all_counts(self.items_to_check, player) + + def to_slot_data(self) -> RuleData: + item_ids = {item_table[item].code: amount for (item, amount) in self.items_to_check.items()} + visual_reqs = [item if amount == 1 else str(amount) + "x " + item for (item, amount) in self.items_to_check.items()] + return ItemRuleData( + item_ids, + visual_reqs + ) + + +@dataclass +class ItemRuleData(RuleData): + item_ids: Dict[int, int] + visual_reqs: List[str] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if len(self.visual_reqs) == 1: + return f"Find {self.visual_reqs[0]}" + tooltip = f"Find all of these:\n{indent}- " + tooltip += f"\n{indent}- ".join(req for req in self.visual_reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + return all( + item in received_items and received_items[item] >= amount + for (item, amount) in self.item_ids.items() + ) diff --git a/worlds/sc2/mission_order/generation.py b/worlds/sc2/mission_order/generation.py new file mode 100644 index 00000000..5582d7c3 --- /dev/null +++ b/worlds/sc2/mission_order/generation.py @@ -0,0 +1,702 @@ +""" +Contains the complex data manipulation functions for mission order generation and Archipelago region creation. +Incoming data is validated to match specifications in .options.py. +The functions here are called from ..regions.py. +""" + +from typing import Set, Dict, Any, List, Tuple, Union, Optional, Callable, TYPE_CHECKING +import logging + +from BaseClasses import Location, Region, Entrance +from ..mission_tables import SC2Mission, MissionFlag, lookup_name_to_mission, lookup_id_to_mission +from ..item.item_tables import named_layout_key_item_table, named_campaign_key_item_table +from ..item import item_names +from .nodes import MissionOrderNode, SC2MOGenMissionOrder, SC2MOGenCampaign, SC2MOGenLayout, SC2MOGenMission +from .entry_rules import EntryRule, SubRuleEntryRule, ItemEntryRule, CountMissionsEntryRule, BeatMissionsEntryRule +from .mission_pools import ( + SC2MOGenMissionPools, Difficulty, modified_difficulty_thresholds, STANDARD_DIFFICULTY_FILL_ORDER +) +from .options import GENERIC_KEY_NAME, GENERIC_PROGRESSIVE_KEY_NAME + +if TYPE_CHECKING: + from ..locations import LocationData + from .. import SC2World + +def resolve_unlocks(mission_order: SC2MOGenMissionOrder): + """Parses a mission order's entry rule dicts into entry rule objects.""" + rolling_rule_id = 0 + for campaign in mission_order.campaigns: + entry_rule = { + "rules": campaign.option_entry_rules, + "amount": -1 + } + campaign.entry_rule = dict_to_entry_rule(mission_order, entry_rule, campaign, rolling_rule_id) + rolling_rule_id += 1 + for layout in campaign.layouts: + entry_rule = { + "rules": layout.option_entry_rules, + "amount": -1 + } + layout.entry_rule = dict_to_entry_rule(mission_order, entry_rule, layout, rolling_rule_id) + rolling_rule_id += 1 + for mission in layout.missions: + entry_rule = { + "rules": mission.option_entry_rules, + "amount": -1 + } + mission.entry_rule = dict_to_entry_rule(mission_order, entry_rule, mission, rolling_rule_id) + rolling_rule_id += 1 + # Manually make a rule for prev missions + if len(mission.prev) > 0: + mission.entry_rule.target_amount += 1 + mission.entry_rule.rules_to_check.append(CountMissionsEntryRule(mission.prev, 1, mission.prev)) + + +def dict_to_entry_rule(mission_order: SC2MOGenMissionOrder, data: Dict[str, Any], start_node: MissionOrderNode, rule_id: int = -1) -> EntryRule: + """Tries to create an entry rule object from an entry rule dict. The structure of these dicts is validated in .options.py.""" + if "items" in data: + items: Dict[str, int] = data["items"] + has_generic_key = False + for (item, amount) in items.items(): + if item.casefold() == GENERIC_KEY_NAME or item.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + has_generic_key = True + continue # Don't try to lock the generic key + if item in mission_order.items_to_lock: + # Lock the greatest required amount of each item + mission_order.items_to_lock[item] = max(mission_order.items_to_lock[item], amount) + else: + mission_order.items_to_lock[item] = amount + rule = ItemEntryRule(items) + if has_generic_key: + mission_order.keys_to_resolve.setdefault(start_node, []).append(rule) + return rule + if "rules" in data: + rules = [dict_to_entry_rule(mission_order, subrule, start_node) for subrule in data["rules"]] + return SubRuleEntryRule(rules, data["amount"], rule_id) + if "scope" in data: + objects: List[Tuple[MissionOrderNode, str]] = [] + for address in data["scope"]: + resolved = resolve_address(mission_order, address, start_node) + objects.extend((obj, address) for obj in resolved) + visual_reqs = [obj.get_visual_requirement(start_node) for (obj, _) in objects] + missions: List[SC2MOGenMission] + if "amount" in data: + missions = [mission for (obj, _) in objects for mission in obj.get_missions() if not mission.option_empty] + if len(missions) == 0: + raise ValueError(f"Count rule did not find any missions at scopes: {data['scope']}") + return CountMissionsEntryRule(missions, data["amount"], visual_reqs) + missions = [] + for (obj, address) in objects: + obj.important_beat_event = True + exits = obj.get_exits() + if len(exits) == 0: + raise ValueError( + f"Address \"{address}\" found an unbeatable object. " + "This should mean the address contains \"..\" too often." + ) + missions.extend(exits) + return BeatMissionsEntryRule(missions, visual_reqs) + raise ValueError(f"Invalid data for entry rule: {data}") + + +def resolve_address(mission_order: SC2MOGenMissionOrder, address: str, start_node: MissionOrderNode) -> List[MissionOrderNode]: + """Tries to find a node in the mission order by following the given address.""" + if address.startswith("../") or address == "..": + # Relative address, starts from searching object + cursor = start_node + else: + # Absolute address, starts from the top + cursor = mission_order + address_so_far = "" + for term in address.split("/"): + if len(address_so_far) > 0: + address_so_far += "/" + address_so_far += term + if term == "..": + cursor = cursor.get_parent(address_so_far, address) + else: + result = cursor.search(term) + if result is None: + raise ValueError(f"Address \"{address_so_far}\" (from \"{address}\") tried to find a child for a mission.") + if len(result) == 0: + raise ValueError(f"Address \"{address_so_far}\" (from \"{address}\") could not find a {cursor.child_type_name()}.") + if len(result) > 1: + # Layouts are allowed to end with multiple missions via an index function + if type(result[0]) == SC2MOGenMission and address_so_far == address: + return result + raise ValueError((f"Address \"{address_so_far}\" (from \"{address}\") found more than one {cursor.child_type_name()}.")) + cursor = result[0] + if cursor == start_node: + raise ValueError( + f"Address \"{address_so_far}\" (from \"{address}\") returned to original object. " + "This is not allowed to avoid circular requirements." + ) + return [cursor] + + +######################## + + +def fill_depths(mission_order: SC2MOGenMissionOrder) -> None: + """ + Flood-fills the mission order by following its entry rules to determine the depth of all nodes. + This also ensures theoretical total accessibility of all nodes, but this is allowed to be violated by item placement and the accessibility setting. + """ + accessible_campaigns: Set[SC2MOGenCampaign] = {campaign for campaign in mission_order.campaigns if campaign.is_always_unlocked(in_region_creation=True)} + next_campaigns: Set[SC2MOGenCampaign] = set(mission_order.campaigns).difference(accessible_campaigns) + + accessible_layouts: Set[SC2MOGenLayout] = { + layout + for campaign in accessible_campaigns for layout in campaign.layouts + if layout.is_always_unlocked(in_region_creation=True) + } + next_layouts: Set[SC2MOGenLayout] = {layout for campaign in accessible_campaigns for layout in campaign.layouts}.difference(accessible_layouts) + + next_missions: Set[SC2MOGenMission] = {mission for layout in accessible_layouts for mission in layout.entrances} + beaten_missions: Set[SC2MOGenMission] = set() + + # Sanity check: Can any missions be accessed? + if len(next_missions) == 0: + raise Exception("Mission order has no possibly accessible missions") + + iterations = 0 + while len(next_missions) > 0: + # Check for accessible missions + cur_missions: Set[SC2MOGenMission] = { + mission for mission in next_missions + if mission.is_unlocked(beaten_missions, in_region_creation=True) + } + if len(cur_missions) == 0: + raise Exception(f"Mission order ran out of accessible missions during iteration {iterations}") + next_missions.difference_update(cur_missions) + # Set the depth counters of all currently accessible missions + new_beaten_missions: Set[SC2MOGenMission] = set() + while len(cur_missions) > 0: + mission = cur_missions.pop() + new_beaten_missions.add(mission) + # If the beaten missions at depth X unlock a mission, said mission can be beaten at depth X+1 + mission.min_depth = mission.entry_rule.get_depth(beaten_missions) + 1 + new_next = [ + next_mission for next_mission in mission.next if not ( + next_mission in cur_missions + or next_mission in beaten_missions + or next_mission in new_beaten_missions + ) + ] + next_missions.update(new_next) + + # Any campaigns/layouts/missions added after this point will be seen in the next iteration at the earliest + iterations += 1 + beaten_missions.update(new_beaten_missions) + + # Check for newly accessible campaigns & layouts + new_campaigns: Set[SC2MOGenCampaign] = set() + for campaign in next_campaigns: + if campaign.is_unlocked(beaten_missions, in_region_creation=True): + new_campaigns.add(campaign) + for campaign in new_campaigns: + accessible_campaigns.add(campaign) + next_layouts.update(campaign.layouts) + next_campaigns.remove(campaign) + for layout in campaign.layouts: + layout.entry_rule.min_depth = campaign.entry_rule.get_depth(beaten_missions) + new_layouts: Set[SC2MOGenLayout] = set() + for layout in next_layouts: + if layout.is_unlocked(beaten_missions, in_region_creation=True): + new_layouts.add(layout) + for layout in new_layouts: + accessible_layouts.add(layout) + next_missions.update(layout.entrances) + next_layouts.remove(layout) + for mission in layout.entrances: + mission.entry_rule.min_depth = layout.entry_rule.get_depth(beaten_missions) + + # Make sure we didn't miss anything + assert len(accessible_campaigns) == len(mission_order.campaigns) + assert len(accessible_layouts) == sum(len(campaign.layouts) for campaign in mission_order.campaigns) + total_missions = sum( + len([mission for mission in layout.missions if not mission.option_empty]) + for campaign in mission_order.campaigns for layout in campaign.layouts + ) + assert len(beaten_missions) == total_missions, f'Can only access {len(beaten_missions)} missions out of {total_missions}' + + # Fill campaign/layout depth values as min/max of their children + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + depths = [mission.min_depth for mission in layout.missions if not mission.option_empty] + layout.min_depth = min(depths) + layout.max_depth = max(depths) + campaign.min_depth = min(layout.min_depth for layout in campaign.layouts) + campaign.max_depth = max(layout.max_depth for layout in campaign.layouts) + mission_order.max_depth = max(campaign.max_depth for campaign in mission_order.campaigns) + + +######################## + + +def resolve_difficulties(mission_order: SC2MOGenMissionOrder) -> None: + """Determines the concrete difficulty of all mission slots.""" + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + if layout.option_min_difficulty == Difficulty.RELATIVE: + min_diff = campaign.option_min_difficulty + if min_diff == Difficulty.RELATIVE: + min_depth = 0 + else: + min_depth = campaign.min_depth + else: + min_diff = layout.option_min_difficulty + min_depth = layout.min_depth + + if layout.option_max_difficulty == Difficulty.RELATIVE: + max_diff = campaign.option_max_difficulty + if max_diff == Difficulty.RELATIVE: + max_depth = mission_order.max_depth + else: + max_depth = campaign.max_depth + else: + max_diff = layout.option_max_difficulty + max_depth = layout.max_depth + + depth_range = max_depth - min_depth + if depth_range == 0: + # This can happen if layout size is 1 or layout is all entrances + # Use minimum difficulty in this case + depth_range = 1 + # If min/max aren't relative, assume the limits are meant to show up + layout_thresholds = modified_difficulty_thresholds(min_diff, max_diff) + thresholds = sorted(layout_thresholds.keys()) + + for mission in layout.missions: + if mission.option_empty: + continue + if len(mission.option_mission_pool) == 1: + mission_order.fixed_missions.append(mission) + continue + if mission.option_difficulty == Difficulty.RELATIVE: + mission_thresh = int((mission.min_depth - min_depth) * 100 / depth_range) + for i in range(len(thresholds)): + if thresholds[i] > mission_thresh: + mission.option_difficulty = layout_thresholds[thresholds[i - 1]] + break + mission.option_difficulty = layout_thresholds[thresholds[-1]] + mission_order.sorted_missions[mission.option_difficulty].append(mission) + + +######################## + + +def fill_missions( + mission_order: SC2MOGenMissionOrder, mission_pools: SC2MOGenMissionPools, + world: 'SC2World', locked_missions: List[str], locations: Tuple['LocationData', ...], location_cache: List[Location] +) -> None: + """Places missions in all non-empty mission slots. Also responsible for creating Archipelago regions & locations for placed missions.""" + locations_per_region = get_locations_per_region(locations) + regions: List[Region] = [create_region(world, locations_per_region, location_cache, "Menu")] + locked_ids = [lookup_name_to_mission[mission].id for mission in locked_missions] + prefer_close_difficulty = world.options.difficulty_curve.value == world.options.difficulty_curve.option_standard + + def set_mission_in_slot(slot: SC2MOGenMission, mission: SC2Mission): + slot.mission = mission + slot.region = create_region(world, locations_per_region, location_cache, + mission.mission_name, slot) + + # Resolve slots with set mission names + for mission_slot in mission_order.fixed_missions: + mission_id = mission_slot.option_mission_pool.pop() + # Remove set mission from locked missions + locked_ids = [locked for locked in locked_ids if locked != mission_id] + mission = lookup_id_to_mission[mission_id] + if mission in mission_pools.get_used_missions(): + raise ValueError(f"Mission slot at address \"{mission_slot.get_address_to_node()}\" tried to plando an already plando'd mission.") + mission_pools.pull_specific_mission(mission) + set_mission_in_slot(mission_slot, mission) + regions.append(mission_slot.region) + + # Shuffle & sort all slots to pick from smallest to biggest pool with tie-breaks by difficulty (lowest to highest), then randomly + # Additionally sort goals by difficulty (highest to lowest) with random tie-breaks + sorted_goals: List[SC2MOGenMission] = [] + for difficulty in sorted(mission_order.sorted_missions.keys()): + world.random.shuffle(mission_order.sorted_missions[difficulty]) + sorted_goals.extend(mission for mission in mission_order.sorted_missions[difficulty] if mission in mission_order.goal_missions) + # Sort slots by difficulty, with difficulties sorted by fill order + # standard curve/close difficulty fills difficulties out->in, uneven fills easy->hard + if prefer_close_difficulty: + all_slots = [slot for diff in STANDARD_DIFFICULTY_FILL_ORDER for slot in mission_order.sorted_missions[diff]] + else: + all_slots = [slot for diff in sorted(mission_order.sorted_missions.keys()) for slot in mission_order.sorted_missions[diff]] + # Pick slots with a constrained mission pool first + all_slots.sort(key = lambda slot: len(slot.option_mission_pool.intersection(mission_pools.master_list))) + sorted_goals.reverse() + + # Randomly assign locked missions to appropriate difficulties + slots_for_locked: Dict[int, List[SC2MOGenMission]] = {locked: [] for locked in locked_ids} + for mission_slot in all_slots: + allowed_locked = mission_slot.option_mission_pool.intersection(locked_ids) + for locked in allowed_locked: + slots_for_locked[locked].append(mission_slot) + for (locked, allowed_slots) in slots_for_locked.items(): + locked_mission = lookup_id_to_mission[locked] + allowed_slots = [slot for slot in allowed_slots if slot in all_slots] + if len(allowed_slots) == 0: + logging.warning(f"SC2: Locked mission \"{locked_mission.mission_name}\" is not allowed in any remaining spot and will not be placed.") + continue + # This inherits the earlier sorting, but is now sorted again by relative difficulty + # The result is a sorting in order of nearest difficulty (preferring lower), then by smallest pool, then randomly + allowed_slots.sort(key = lambda slot: abs(slot.option_difficulty - locked_mission.pool + 1)) + # The first slot should be most appropriate + mission_slot = allowed_slots[0] + mission_pools.pull_specific_mission(locked_mission) + set_mission_in_slot(mission_slot, locked_mission) + regions.append(mission_slot.region) + all_slots.remove(mission_slot) + if mission_slot in sorted_goals: + sorted_goals.remove(mission_slot) + + # Pick goal missions first with stricter difficulty matching, and starting with harder goals + for goal_slot in sorted_goals: + try: + mission = mission_pools.pull_random_mission(world, goal_slot, prefer_close_difficulty=True) + set_mission_in_slot(goal_slot, mission) + regions.append(goal_slot.region) + all_slots.remove(goal_slot) + except IndexError: + raise IndexError( + f"Slot at address \"{goal_slot.get_address_to_node()}\" ran out of possible missions to place " + f"with {len(all_slots)} empty slots remaining." + ) + + # Pick random missions + remaining_count = len(all_slots) + for mission_slot in all_slots: + try: + mission = mission_pools.pull_random_mission(world, mission_slot, prefer_close_difficulty=prefer_close_difficulty) + set_mission_in_slot(mission_slot, mission) + regions.append(mission_slot.region) + remaining_count -= 1 + except IndexError: + raise IndexError( + f"Slot at address \"{mission_slot.get_address_to_node()}\" ran out of possible missions to place " + f"with {remaining_count} empty slots remaining." + ) + + world.multiworld.regions += regions + + +def get_locations_per_region(locations: Tuple['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 + + +def create_location(player: int, location_data: 'LocationData', region: Region, + location_cache: List[Location]) -> Location: + location = Location(player, location_data.name, location_data.code, region) + location.access_rule = location_data.rule + + location_cache.append(location) + return location + + +def create_minimal_logic_location( + world: 'SC2World', location_data: 'LocationData', region: Region, location_cache: List[Location], unit_count: int = 0, +) -> Location: + location = Location(world.player, location_data.name, location_data.code, region) + mission = lookup_name_to_mission.get(region.name) + if mission is None: + pass + elif location_data.hard_rule: + assert world.logic + unit_rule = world.logic.has_race_units(unit_count, mission.race) + location.access_rule = lambda state: unit_rule(state) and location_data.hard_rule(state) + else: + assert world.logic + location.access_rule = world.logic.has_race_units(unit_count, mission.race) + location_cache.append(location) + return location + + +def create_region( + world: 'SC2World', + locations_per_region: Dict[str, List['LocationData']], + location_cache: List[Location], + name: str, + slot: Optional[SC2MOGenMission] = None, +) -> Region: + MAX_UNIT_REQUIREMENT = 5 + region = Region(name, world.player, world.multiworld) + + from ..locations import LocationType + if slot is None: + target_victory_cache_locations = 0 + else: + target_victory_cache_locations = slot.option_victory_cache + victory_cache_locations = 0 + + # If the first mission is a build mission, + # require a unit everywhere except one location in the easiest category + mission_needs_unit = False + unit_given = False + easiest_category = LocationType.MASTERY + if slot is not None and slot.min_depth == 0: + mission = lookup_name_to_mission.get(region.name) + if mission is not None and MissionFlag.NoBuild not in mission.flags: + mission_needs_unit = True + for location_data in locations_per_region.get(name, ()): + if location_data.type == LocationType.VICTORY: + pass + elif location_data.type < easiest_category: + easiest_category = location_data.type + if easiest_category >= LocationType.CHALLENGE: + easiest_category = LocationType.VICTORY + + for location_data in locations_per_region.get(name, ()): + assert slot is not None + if location_data.type == LocationType.VICTORY_CACHE: + if victory_cache_locations >= target_victory_cache_locations: + continue + victory_cache_locations += 1 + if world.options.required_tactics.value == world.options.required_tactics.option_any_units: + if mission_needs_unit and not unit_given and location_data.type == easiest_category: + # Ensure there is at least one no-logic location if the first mission is a build mission + location = create_minimal_logic_location(world, location_data, region, location_cache, 0) + unit_given = True + elif location_data.type == LocationType.MASTERY: + # Mastery locations always require max units regardless of position in the ramp + location = create_minimal_logic_location(world, location_data, region, location_cache, MAX_UNIT_REQUIREMENT) + else: + # Required number of units = mission depth; +1 if it's a starting build mission; +1 if it's a challenge location + location = create_minimal_logic_location(world, location_data, region, location_cache, min( + slot.min_depth + mission_needs_unit + (location_data.type == LocationType.CHALLENGE), + MAX_UNIT_REQUIREMENT + )) + else: + location = create_location(world.player, location_data, region, location_cache) + region.locations.append(location) + + return region + + +######################## + + +def make_connections(mission_order: SC2MOGenMissionOrder, world: 'SC2World'): + """Creates Archipelago entrances between missions and creates access rules for the generator from entry rule objects.""" + names: Dict[str, int] = {} + player = world.player + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + for mission in layout.missions: + if not mission.option_empty: + mission_rule = mission.entry_rule.to_lambda(player) + # Only layout entrances need to consider campaign & layout prerequisites + if mission.option_entrance: + campaign_rule = mission.parent().parent().entry_rule.to_lambda(player) + layout_rule = mission.parent().entry_rule.to_lambda(player) + unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule, mission_rule=mission_rule: \ + campaign_rule(state) and layout_rule(state) and mission_rule(state) + else: + unlock_rule = mission_rule + # Individually connect to previous missions + for prev_mission in mission.prev: + connect(world, names, prev_mission.mission.mission_name, mission.mission.mission_name, + lambda state, unlock_rule=unlock_rule: unlock_rule(state)) + # If there are no previous missions, connect to Menu instead + if len(mission.prev) == 0: + connect(world, names, "Menu", mission.mission.mission_name, + lambda state, unlock_rule=unlock_rule: unlock_rule(state)) + + +def connect(world: 'SC2World', used_names: Dict[str, int], source: str, target: str, + rule: Optional[Callable] = None): + source_region = world.get_region(source) + target_region = world.get_region(target) + + if target not in used_names: + used_names[target] = 1 + name = target + else: + used_names[target] += 1 + name = target + (' ' * used_names[target]) + + connection = Entrance(world.player, name, source_region) + + if rule: + connection.access_rule = rule + + source_region.exits.append(connection) + connection.connect(target_region) + + +######################## + + +def resolve_generic_keys(mission_order: SC2MOGenMissionOrder) -> None: + """ + Replaces placeholder keys in Item entry rules with their concrete counterparts. + Specifically this handles placing named keys into missions and vanilla campaigns/layouts, + and assigning correct progression tracks to progressive keys. + """ + layout_numbered_keys = 1 + campaign_numbered_keys = 1 + progression_tracks: Dict[int, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + for (node, item_rules) in mission_order.keys_to_resolve.items(): + key_name = node.get_key_name() + # Generic keys in mission slots should always resolve to an existing key + # Layouts and campaigns may need to be switched for numbered keys + if isinstance(node, SC2MOGenLayout) and key_name not in named_layout_key_item_table: + key_name = item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(layout_numbered_keys) + layout_numbered_keys += 1 + elif isinstance(node, SC2MOGenCampaign) and key_name not in named_campaign_key_item_table: + key_name = item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(campaign_numbered_keys) + campaign_numbered_keys += 1 + + for item_rule in item_rules: + # Swap regular generic key names for the node's proper key name + item_rule.items_to_check = { + key_name if item_name.casefold() == GENERIC_KEY_NAME else item_name: amount + for (item_name, amount) in item_rule.items_to_check.items() + } + # Only lock the key if it was actually placed in this rule + if key_name in item_rule.items_to_check: + mission_order.items_to_lock[key_name] = max(item_rule.items_to_check[key_name], mission_order.items_to_lock.get(key_name, 0)) + + # Sort progressive keys by their given track + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME: + progression_tracks.setdefault(amount, []).append((node, item_rule)) + elif item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + track_string = item_name.split()[-1] + try: + track = int(track_string) + progression_tracks.setdefault(track, []).append((node, item_rule)) + except ValueError: + raise ValueError( + f"Progression track \"{track_string}\" for progressive key \"{item_name}: {amount}\" is not a valid number. " + "Valid formats are:\n" + f"- {GENERIC_PROGRESSIVE_KEY_NAME.title()}: X\n" + f"- {GENERIC_PROGRESSIVE_KEY_NAME.title()} X: 1" + ) + + def find_progressive_keys(item_rule: ItemEntryRule, track_to_find: int) -> List[str]: + return [ + item_name for (item_name, amount) in item_rule.items_to_check.items() + if (item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME and amount == track_to_find) or ( + item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME) and + item_name.split()[-1] == str(track_to_find) + ) + ] + + def replace_progressive_keys(item_rule: ItemEntryRule, track_to_replace: int, new_key_name: str, new_key_amount: int): + keys_to_replace = find_progressive_keys(item_rule, track_to_replace) + new_items_to_check: Dict[str, int] = {} + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name in keys_to_replace: + new_items_to_check[new_key_name] = new_key_amount + else: + new_items_to_check[item_name] = amount + item_rule.items_to_check = new_items_to_check + + # Change progressive keys to be unique for missions and layouts that request it + want_unique: Dict[MissionOrderNode, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + empty_tracks: List[int] = [] + for track in progression_tracks: + # Sort keys to change by layout + new_unique_tracks: Dict[MissionOrderNode, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + for (node, item_rule) in progression_tracks[track]: + if isinstance(node, SC2MOGenMission): + # Unique tracks for layouts take priority over campaigns + if node.parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent(), []).append((node, item_rule)) + elif node.parent().parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent().parent(), []).append((node, item_rule)) + elif isinstance(node, SC2MOGenLayout) and node.parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent(), []).append((node, item_rule)) + # Remove found keys from their original progression track + for (container_node, rule_list) in new_unique_tracks.items(): + for node_and_rule in rule_list: + progression_tracks[track].remove(node_and_rule) + want_unique.setdefault(container_node, []).extend(rule_list) + if len(progression_tracks[track]) == 0: + empty_tracks.append(track) + for track in empty_tracks: + progression_tracks.pop(track) + + # Make sure all tracks that can't have keys have been taken care of + invalid_tracks: List[int] = [track for track in progression_tracks if track < 1 or track > len(SC2Mission)] + if len(invalid_tracks) > 0: + affected_key_list: Dict[MissionOrderNode, List[str]] = {} + for track in invalid_tracks: + for (node, item_rule) in progression_tracks[track]: + affected_key_list.setdefault(node, []).extend( + f"{key}: {item_rule.items_to_check[key]}" for key in find_progressive_keys(item_rule, track) + ) + affected_key_list_string = "\n- " + "\n- ".join( + f"{node.get_address_to_node()}: {affected_keys}" + for (node, affected_keys) in affected_key_list.items() + ) + raise ValueError( + "Some item rules contain progressive keys with invalid tracks:" + + affected_key_list_string + + f"\nPossible solutions are changing the tracks of affected keys to be in the range from 1 to {len(SC2Mission)}, " + "or changing the unique_progression_track of containing campaigns/layouts to match the invalid tracks." + ) + + # Assign new free progression tracks to nodes in definition order + next_free = 1 + nodes_to_assign = list(want_unique.keys()) + while len(want_unique) > 0: + while next_free in progression_tracks: + next_free += 1 + container_node = nodes_to_assign.pop(0) + progression_tracks[next_free] = want_unique.pop(container_node) + # Replace the affected keys in nodes with their correct counterparts + key_name = f"{GENERIC_PROGRESSIVE_KEY_NAME} {next_free}" + for (node, item_rule) in progression_tracks[next_free]: + # It's guaranteed by the sorting above that the container is either a layout or a campaign + replace_progressive_keys(item_rule, container_node.option_unique_progression_track, key_name, 1) + + # Give progressive keys a more fitting name if there's only one track and they all apply to the same type of node + progressive_flavor_name: Union[str, None] = None + if len(progression_tracks) == 1: + if all(isinstance(node, SC2MOGenLayout) for rule_list in progression_tracks.values() for (node, _) in rule_list): + progressive_flavor_name = item_names.PROGRESSIVE_QUESTLINE_KEY + elif all(isinstance(node, SC2MOGenMission) for rule_list in progression_tracks.values() for (node, _) in rule_list): + progressive_flavor_name = item_names.PROGRESSIVE_MISSION_KEY + + for (track, rule_list) in progression_tracks.items(): + key_name = item_names._TEMPLATE_PROGRESSIVE_KEY.format(track) if progressive_flavor_name is None else progressive_flavor_name + # Determine order in which the rules should unlock + ordered_item_rules: List[List[ItemEntryRule]] = [] + if not any(isinstance(node, SC2MOGenMission) for (node, _) in rule_list): + # No rule on this track belongs to a mission, so the rules can be kept in definition order + ordered_item_rules = [[item_rule] for (_, item_rule) in rule_list] + else: + # At least one rule belongs to a mission + # Sort rules by the depth of their nodes, ties get the same amount of keys + depth_to_rules: Dict[int, List[ItemEntryRule]] = {} + for (node, item_rule) in rule_list: + depth_to_rules.setdefault(node.get_min_depth(), []).append(item_rule) + ordered_item_rules = [depth_to_rules[depth] for depth in sorted(depth_to_rules.keys())] + + # Assign correct progressive keys to each rule + for (position, item_rules) in enumerate(ordered_item_rules): + for item_rule in item_rules: + keys_to_replace = [ + item_name for (item_name, amount) in item_rule.items_to_check.items() + if (item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME and amount == track) or ( + item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME) and + item_name.split()[-1] == str(track) + ) + ] + new_items_to_check: Dict[str, int] = {} + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name in keys_to_replace: + new_items_to_check[key_name] = position + 1 + else: + new_items_to_check[item_name] = amount + item_rule.items_to_check = new_items_to_check + mission_order.items_to_lock[key_name] = len(ordered_item_rules) diff --git a/worlds/sc2/mission_order/layout_types.py b/worlds/sc2/mission_order/layout_types.py new file mode 100644 index 00000000..7581ac64 --- /dev/null +++ b/worlds/sc2/mission_order/layout_types.py @@ -0,0 +1,620 @@ +from __future__ import annotations +from typing import List, Callable, Set, Tuple, Union, TYPE_CHECKING, Dict, Any +import math +from abc import ABC, abstractmethod + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + +class LayoutType(ABC): + size: int + index_functions: List[str] = [] + """Names of available functions for mission indices. For list member `"my_fn"`, function should be called `idx_my_fn`.""" + + def __init__(self, size: int): + self.size = size + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + """Get type-specific options from the provided dict. Should return unused values.""" + return options + + @abstractmethod + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + """Use the provided `Callable` to create a one-dimensional list of mission slots and set up initial settings and connections. + + This should include at least one entrance and exit.""" + return [] + + def final_setup(self, missions: List[SC2MOGenMission]): + """Called after user changes to the layout are applied to make any final checks and changes. + + Implementers should make changes with caution, since it runs after a user's explicit commands are implemented.""" + return + + def parse_index(self, term: str) -> Union[Set[int], None]: + """From the given term, determine a list of desired target indices. The term is guaranteed to not be "entrances", "exits", or "all". + + If the term cannot be parsed, either raise an exception or return `None`.""" + return self.parse_index_as_function(term) + + def parse_index_as_function(self, term: str) -> Union[Set[int], None]: + """Helper function to interpret the term as a function call on the layout type, if it is declared in `self.index_functions`. + + Returns the function's return value if `term` is a valid function call, `None` otherwise.""" + left = term.find('(') + right = term.find(')') + if left == -1 and right == -1: + # Assume no args are desired + fn_name = term.strip() + fn_args = [] + elif left == -1 or right == -1: + return None + else: + fn_name = term[:left].strip() + fn_args_str = term[left + 1:right] + fn_args = [arg.strip() for arg in fn_args_str.split(',')] + + if fn_name in self.index_functions: + try: + return getattr(self, "idx_" + fn_name)(*fn_args) + except: + return None + else: + return None + + @abstractmethod + def get_visual_layout(self) -> List[List[int]]: + """Organize the mission slots into a list of columns from left to right and top to bottom. + The list should contain indices into the list created by `make_slots`. Intentionally empty spots should contain -1. + + The resulting 2D list should be rectangular.""" + pass + +class Column(LayoutType): + """Linear layout. Default entrance is index 0 at the top, default exit is index `size - 1` at the bottom.""" + + # 0 + # 1 + # 2 + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.size)] + missions[0].option_entrance = True + missions[-1].option_exit = True + for i in range(self.size - 1): + missions[i].next.append(missions[i + 1]) + return missions + + def get_visual_layout(self) -> List[List[int]]: + return [list(range(self.size))] + +class Grid(LayoutType): + """Rectangular grid. Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + height: int + num_corners_to_remove: int + two_start_positions: bool + + index_functions = [ + "point", "rect" + ] + + # 0 1 2 + # 3 4 5 + # 6 7 8 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.two_start_positions = options.pop("two_start_positions", False) and self.size >= 2 + if self.two_start_positions: + self.size += 1 + width: int = options.pop("width", 0) + if width < 1: + self.width, self.height, self.num_corners_to_remove = Grid.get_grid_dimensions(self.size) + else: + self.width = width + self.height = math.ceil(self.size / self.width) + self.num_corners_to_remove = self.height * width - self.size + return options + + @staticmethod + def get_factors(number: int) -> Tuple[int, int]: + """ + Simple factorization into pairs of numbers (x, y) using a sieve method. + Returns the factorization that is most square, i.e. where x + y is minimized. + Factor order is such that x <= y. + """ + assert number > 0 + for divisor in range(math.floor(math.sqrt(number)), 1, -1): + quotient = number // divisor + if quotient * divisor == number: + return divisor, quotient + return 1, number + + @staticmethod + def get_grid_dimensions(size: int) -> Tuple[int, int, int]: + """ + Get the dimensions of a grid mission order from the number of missions, int the format (x, y, error). + * Error will always be 0, 1, or 2, so the missions can be removed from the corners that aren't the start or end. + * Dimensions are chosen such that x <= y, as buttons in the UI are wider than they are tall. + * Dimensions are chosen to be maximally square. That is, x + y + error is minimized. + * If multiple options of the same rating are possible, the one with the larger error is chosen, + as it will appear more square. Compare 3x11 to 5x7-2 for an example of this. + """ + dimension_candidates: List[Tuple[int, int, int]] = [(*Grid.get_factors(size + x), x) for x in (2, 1, 0)] + best_dimension = min(dimension_candidates, key=sum) + return best_dimension + + @staticmethod + def manhattan_distance(point1: Tuple[int, int], point2: Tuple[int, int]) -> int: + return abs(point1[0] - point2[0]) + abs(point1[1] - point2[1]) + + @staticmethod + def euclidean_distance_squared(point1: Tuple[int, int], point2: Tuple[int, int]) -> int: + return (point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2 + + @staticmethod + def euclidean_distance(point1: Tuple[int, int], point2: Tuple[int, int]) -> float: + return math.sqrt(Grid.euclidean_distance_squared(point1, point2)) + + def get_grid_coordinates(self, idx: int) -> Tuple[int, int]: + return (idx % self.width), (idx // self.width) + + def get_grid_index(self, x: int, y: int) -> int: + return y * self.width + x + + def is_valid_coordinates(self, x: int, y: int) -> bool: + return ( + 0 <= x < self.width and + 0 <= y < self.height + ) + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.width * self.height)] + if self.two_start_positions: + missions[0].option_empty = True + missions[1].option_entrance = True + missions[self.get_grid_index(0, 1)].option_entrance = True + else: + missions[0].option_entrance = True + missions[-1].option_exit = True + + for x in range(self.width): + left = x - 1 + right = x + 1 + for y in range(self.height): + up = y - 1 + down = y + 1 + idx = self.get_grid_index(x, y) + neighbours = [ + self.get_grid_index(nb_x, nb_y) + for (nb_x, nb_y) in [(left, y), (right, y), (x, up), (x, down)] + if self.is_valid_coordinates(nb_x, nb_y) + ] + missions[idx].next = [missions[nb] for nb in neighbours] + + # Empty corners + top_corners = math.floor(self.num_corners_to_remove / 2) + bottom_corners = math.ceil(self.num_corners_to_remove / 2) + + # Bottom left corners + y = self.height - 1 + x = 0 + leading_x = 0 + placed = 0 + while placed < bottom_corners: + if x == -1 or y == 0: + leading_x += 1 + x = leading_x + y = self.height - 1 + missions[self.get_grid_index(x, y)].option_empty = True + placed += 1 + x -= 1 + y -= 1 + + # Top right corners + y = 0 + x = self.width - 1 + leading_x = self.width - 1 + placed = 0 + while placed < top_corners: + if x == self.width or y == self.height - 1: + leading_x -= 1 + x = leading_x + y = 0 + missions[self.get_grid_index(x, y)].option_empty = True + placed += 1 + x += 1 + y += 1 + + return missions + + def get_visual_layout(self) -> List[List[int]]: + columns = [ + [self.get_grid_index(x, y) for y in range(self.height)] + for x in range(self.width) + ] + return columns + + def idx_point(self, x: str, y: str) -> Union[Set[int], None]: + try: + x = int(x) + y = int(y) + except: + return None + if self.is_valid_coordinates(x, y): + return {self.get_grid_index(x, y)} + return None + + def idx_rect(self, x: str, y: str, width: str, height: str) -> Union[Set[int], None]: + try: + x = int(x) + y = int(y) + width = int(width) + height = int(height) + except: + return None + indices = { + self.get_grid_index(pt_x, pt_y) + for pt_y in range(y, y + height) + for pt_x in range(x, x + width) + if self.is_valid_coordinates(pt_x, pt_y) + } + return indices + + +class Canvas(Grid): + """Rectangular grid that determines size and filled slots based on special canvas option.""" + canvas: List[str] + groups: Dict[str, List[int]] + jump_distance_orthogonal: int + jump_distance_diagonal: int + + jumps_orthogonal = [(-1, 0), (0, 1), (1, 0), (0, -1)] + jumps_diagonal = [(-1, -1), (-1, 1), (1, 1), (1, -1)] + + index_functions = Grid.index_functions + ["group"] + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.width = options.pop("width") # Should be guaranteed by the option parser + self.height = math.ceil(self.size / self.width) + self.num_corners_to_remove = 0 + self.two_start_positions = False + self.jump_distance_orthogonal = max(options.pop("jump_distance_orthogonal", 1), 1) + self.jump_distance_diagonal = max(options.pop("jump_distance_diagonal", 1), 0) + + if "canvas" not in options: + raise KeyError("Canvas layout is missing required canvas option. Either create it or change type to Grid.") + self.canvas = options.pop("canvas") + # Pad short lines with spaces + longest_line = max(len(line) for line in self.canvas) + for idx in range(len(self.canvas)): + padding = ' ' * (longest_line - len(self.canvas[idx])) + self.canvas[idx] += padding + + self.groups = {} + for (line_idx, line) in enumerate(self.canvas): + for (char_idx, char) in enumerate(line): + self.groups.setdefault(char, []).append(self.get_grid_index(char_idx, line_idx)) + + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = super().make_slots(mission_factory) + missions[0].option_entrance = False + missions[-1].option_exit = False + + # Canvas spaces become empty slots + for idx in self.groups.get(" ", []): + missions[idx].option_empty = True + + # Raycast into jump directions to find nearest empty space + def jump(point: Tuple[int, int], direction: Tuple[int, int], distance: int) -> Tuple[int, int]: + return ( + point[0] + direction[0] * distance, + point[1] + direction[1] * distance + ) + + def raycast(point: Tuple[int, int], direction: Tuple[int, int], max_distance: int) -> Union[Tuple[int, SC2MOGenMission], None]: + for distance in range(1, max_distance + 1): + target = jump(point, direction, distance) + if self.is_valid_coordinates(*target): + target_mission = missions[self.get_grid_index(*target)] + if not target_mission.option_empty: + return (distance, target_mission) + else: + # Out of bounds + return None + return None + + for (idx, mission) in enumerate(missions): + if mission.option_empty: + continue + point = self.get_grid_coordinates(idx) + if self.jump_distance_orthogonal > 1: + for direction in Canvas.jumps_orthogonal: + target = raycast(point, direction, self.jump_distance_orthogonal) + if target is not None: + (distance, target_mission) = target + if distance > 1: + # Distance 1 orthogonal jumps already come from the base grid + mission.next.append(target[1]) + if self.jump_distance_diagonal > 0: + for direction in Canvas.jumps_diagonal: + target = raycast(point, direction, self.jump_distance_diagonal) + if target is not None: + (distance, target_mission) = target + if distance == 1: + # Keep distance 1 diagonal slots only if the orthogonal neighbours are empty + x_neighbour = jump(point, (direction[0], 0), 1) + y_neighbour = jump(point, (0, direction[1]), 1) + if ( + missions[self.get_grid_index(*x_neighbour)].option_empty and + missions[self.get_grid_index(*y_neighbour)].option_empty + ): + mission.next.append(target_mission) + else: + mission.next.append(target_mission) + + return missions + + def final_setup(self, missions: List[SC2MOGenMission]): + # Pick missions near the original start and end to set as default entrance/exit + # if the user didn't set one themselves + def distance_lambda(point: Tuple[int, int]) -> Callable[[Tuple[int, SC2MOGenMission]], int]: + return lambda idx_mission: Grid.euclidean_distance_squared(self.get_grid_coordinates(idx_mission[0]), point) + + if not any(mission.option_entrance for mission in missions): + top_left = self.get_grid_coordinates(0) + closest_to_top_left = sorted( + ((idx, mission) for (idx, mission) in enumerate(missions) if not mission.option_empty), + key = distance_lambda(top_left) + ) + closest_to_top_left[0][1].option_entrance = True + + if not any(mission.option_exit for mission in missions): + bottom_right = self.get_grid_coordinates(len(missions) - 1) + closest_to_bottom_right = sorted( + ((idx, mission) for (idx, mission) in enumerate(missions) if not mission.option_empty), + key = distance_lambda(bottom_right) + ) + closest_to_bottom_right[0][1].option_exit = True + + def idx_group(self, group: str) -> Union[Set[int], None]: + if group not in self.groups: + return None + return set(self.groups[group]) + + +class Hopscotch(LayoutType): + """Alternating between one and two available missions. + Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + spacer: int + two_start_positions: bool + + index_functions = [ + "top", "bottom", "middle", "corner" + ] + + # 0 2 + # 1 3 5 + # 4 6 + # 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.two_start_positions = options.pop("two_start_positions", False) and self.size >= 2 + if self.two_start_positions: + self.size += 1 + width: int = options.pop("width", 7) + self.width = max(width, 4) + spacer: int = options.pop("spacer", 2) + self.spacer = max(spacer, 1) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + slots = [mission_factory() for _ in range(self.size)] + if self.two_start_positions: + slots[0].option_empty = True + slots[1].option_entrance = True + slots[2].option_entrance = True + else: + slots[0].option_entrance = True + slots[-1].option_exit = True + + cycle = 0 + for idx in range(self.size): + if cycle == 0: + indices = [idx + 1, idx + 2] + cycle = 2 + elif cycle == 1: + indices = [idx + 1] + cycle -= 1 + else: + indices = [idx + 2] + cycle -= 1 + for next_idx in indices: + if next_idx < self.size: + slots[idx].next.append(slots[next_idx]) + + return slots + + @staticmethod + def space_at_column(idx: int) -> List[int]: + # -1 0 1 2 3 4 5 + amount = idx - 1 + if amount > 0: + return [-1 for _ in range(amount)] + else: + return [] + + def get_visual_layout(self) -> List[List[int]]: + # size offset by 1 to account for first column of two slots + cols: List[List[int]] = [] + col: List[int] = [] + col_size = 1 + for idx in range(self.size): + if col_size == 3: + col_size = 1 + cols.append(col) + col = [idx] + else: + col_size += 1 + col.append(idx) + if len(col) > 0: + cols.append(col) + + final_cols: List[List[int]] = [Hopscotch.space_at_column(idx) for idx in range(min(len(cols), self.width))] + for (col_idx, col) in enumerate(cols): + if col_idx >= self.width: + final_cols[col_idx % self.width].extend([-1 for _ in range(self.spacer)]) + final_cols[col_idx % self.width].extend(col) + + fill_to_longest(final_cols) + + return final_cols + + def idx_bottom(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 + 1 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_top(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 + 2 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_middle(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_corner(self, number: str) -> Union[Set[int], None]: + try: + number = int(number) + except: + return None + corners = math.ceil(self.size / 3) + if number >= corners: + return None + indices = [number * 3 + n for n in range(3)] + return { + idx for idx in indices if idx < self.size + } + + +class Gauntlet(LayoutType): + """Long, linear layout. Goes horizontally and wraps around. + Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + + # 0 1 2 3 + # + # 4 5 6 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + width: int = options.pop("width", 7) + self.width = min(max(width, 4), self.size) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.size)] + missions[0].option_entrance = True + missions[-1].option_exit = True + for i in range(self.size - 1): + missions[i].next.append(missions[i + 1]) + return missions + + def get_visual_layout(self) -> List[List[int]]: + columns = [[] for _ in range(self.width)] + for idx in range(self.size): + if idx >= self.width: + columns[idx % self.width].append(-1) + columns[idx % self.width].append(idx) + + fill_to_longest(columns) + + return columns + +class Blitz(LayoutType): + """Rows of missions, one mission per row required. + Default entrances are every mission in the top row, default exit is a central mission in the bottom row.""" + width: int + + index_functions = [ + "row" + ] + + # 0 1 2 3 + # 4 5 6 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + width = options.pop("width", 0) + if width < 1: + min_width, max_width = 2, 5 + mission_divisor = 5 + self.width = min(max(self.size // mission_divisor, min_width), max_width) + else: + self.width = min(self.size, width) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + slots = [mission_factory() for _ in range(self.size)] + for idx in range(self.width): + slots[idx].option_entrance = True + + # TODO: this is copied from the original mission order and works, but I'm not sure on the intent + # middle_column = self.width // 2 + # if self.size % self.width > middle_column: + # final_row = self.width * (self.size // self.width) + # final_mission = final_row + middle_column + # else: + # final_mission = self.size - 1 + # slots[final_mission].option_exit = True + + rows = self.size // self.width + for row in range(rows): + for top in range(self.width): + idx = row * self.width + top + for bot in range(self.width): + other = (row + 1) * self.width + bot + if other < self.size: + slots[idx].next.append(slots[other]) + if row == rows-1: + slots[idx].option_exit = True + + return slots + + def get_visual_layout(self) -> List[List[int]]: + columns = [[] for _ in range(self.width)] + for idx in range(self.size): + columns[idx % self.width].append(idx) + + fill_to_longest(columns) + + return columns + + def idx_row(self, row: str) -> Union[Set[int], None]: + try: + row = int(row) + except: + return None + rows = math.ceil(self.size / self.width) + if row >= rows: + return None + indices = [row * self.width + col for col in range(self.width)] + return { + idx for idx in indices if idx < self.size + } + +def fill_to_longest(columns: List[List[int]]): + longest = max(len(col) for col in columns) + for idx in range(len(columns)): + length = len(columns[idx]) + if length < longest: + columns[idx].extend([-1 for _ in range(longest - length)]) \ No newline at end of file diff --git a/worlds/sc2/mission_order/mission_pools.py b/worlds/sc2/mission_order/mission_pools.py new file mode 100644 index 00000000..a3ab99f4 --- /dev/null +++ b/worlds/sc2/mission_order/mission_pools.py @@ -0,0 +1,251 @@ +from enum import IntEnum +from typing import TYPE_CHECKING, Dict, Set, List, Iterable + +from Options import OptionError +from ..mission_tables import SC2Mission, lookup_id_to_mission, MissionFlag, SC2Campaign +from worlds.AutoWorld import World + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + +class Difficulty(IntEnum): + RELATIVE = 0 + STARTER = 1 + EASY = 2 + MEDIUM = 3 + HARD = 4 + VERY_HARD = 5 + +# TODO figure out an organic way to get these +DEFAULT_DIFFICULTY_THRESHOLDS = { + Difficulty.STARTER: 0, + Difficulty.EASY: 10, + Difficulty.MEDIUM: 35, + Difficulty.HARD: 65, + Difficulty.VERY_HARD: 90, + Difficulty.VERY_HARD + 1: 100 +} + +STANDARD_DIFFICULTY_FILL_ORDER = ( + Difficulty.VERY_HARD, + Difficulty.STARTER, + Difficulty.HARD, + Difficulty.EASY, + Difficulty.MEDIUM, +) +"""Fill mission slots outer->inner difficulties, +so if multiple pools get exhausted, they will tend to overflow towards the middle.""" + +def modified_difficulty_thresholds(min_difficulty: Difficulty, max_difficulty: Difficulty) -> Dict[int, Difficulty]: + if min_difficulty == Difficulty.RELATIVE: + min_difficulty = Difficulty.STARTER + if max_difficulty == Difficulty.RELATIVE: + max_difficulty = Difficulty.VERY_HARD + thresholds: Dict[int, Difficulty] = {} + min_thresh = DEFAULT_DIFFICULTY_THRESHOLDS[min_difficulty] + total_thresh = DEFAULT_DIFFICULTY_THRESHOLDS[max_difficulty + 1] - min_thresh + for difficulty in range(min_difficulty, max_difficulty + 1): + threshold = DEFAULT_DIFFICULTY_THRESHOLDS[difficulty] - min_thresh + threshold *= 100 // total_thresh + thresholds[threshold] = Difficulty(difficulty) + return thresholds + +class SC2MOGenMissionPools: + """ + Manages available and used missions for a mission order. + """ + master_list: Set[int] + difficulty_pools: Dict[Difficulty, Set[int]] + _used_flags: Dict[MissionFlag, int] + _used_missions: List[SC2Mission] + _updated_difficulties: Dict[int, Difficulty] + _flag_ratios: Dict[MissionFlag, float] + _flag_weights: Dict[MissionFlag, int] + + def __init__(self) -> None: + self.master_list = {mission.id for mission in SC2Mission} + self.difficulty_pools = { + diff: {mission.id for mission in SC2Mission if mission.pool + 1 == diff} + for diff in Difficulty if diff != Difficulty.RELATIVE + } + self._used_flags = {} + self._used_missions = [] + self._updated_difficulties = {} + self._flag_ratios = {} + self._flag_weights = {} + + def set_exclusions(self, excluded: Iterable[SC2Mission], unexcluded: Iterable[SC2Mission]) -> None: + """Prevents all the missions that appear in the `excluded` list, but not in the `unexcluded` list, + from appearing in the mission order.""" + total_exclusions = [mission.id for mission in excluded if mission not in unexcluded] + self.master_list.difference_update(total_exclusions) + + def get_allowed_mission_count(self) -> int: + return len(self.master_list) + + def count_allowed_missions(self, campaign: SC2Campaign) -> int: + allowed_missions = [ + mission_id + for mission_id in self.master_list + if lookup_id_to_mission[mission_id].campaign == campaign + ] + return len(allowed_missions) + + def move_mission(self, mission: SC2Mission, old_diff: Difficulty, new_diff: Difficulty) -> None: + """Changes the difficulty of the given `mission`. Does nothing if the mission is not allowed to appear + or if it isn't set to the `old_diff` difficulty.""" + if mission.id in self.master_list and mission.id in self.difficulty_pools[old_diff]: + self.difficulty_pools[old_diff].remove(mission.id) + self.difficulty_pools[new_diff].add(mission.id) + self._updated_difficulties[mission.id] = new_diff + + def get_modified_mission_difficulty(self, mission: SC2Mission) -> Difficulty: + if mission.id in self._updated_difficulties: + return self._updated_difficulties[mission.id] + return Difficulty(mission.pool + 1) + + def get_pool_size(self, diff: Difficulty) -> int: + """Returns the amount of missions of the given difficulty that are allowed to appear.""" + return len(self.difficulty_pools[diff]) + + def get_used_flags(self) -> Dict[MissionFlag, int]: + """Returns a dictionary of all used flags and their appearance count within the mission order. + Flags that don't appear in the mission order also don't appear in this dictionary.""" + return self._used_flags + + def get_used_missions(self) -> List[SC2Mission]: + """Returns a set of all missions used in the mission order.""" + return self._used_missions + + def set_flag_balances(self, flag_ratios: Dict[MissionFlag, int], flag_weights: Dict[MissionFlag, int]): + # Ensure the ratios are percentages + ratio_sum = sum(ratio for ratio in flag_ratios.values()) + self._flag_ratios = {flag: ratio / ratio_sum for flag, ratio in flag_ratios.items()} + self._flag_weights = flag_weights + + def pick_balanced_mission(self, world: World, pool: List[int]) -> int: + """Applies ratio-based and weight-based balancing to pick a preferred mission from a given mission pool.""" + # Currently only used for race balancing + # Untested for flags that may overlap or not be present at all, but should at least generate + balanced_pool = pool + if len(self._flag_ratios) > 0: + relevant_used_flag_count = max(sum(self._used_flags.get(flag, 0) for flag in self._flag_ratios), 1) + current_ratios = { + flag: self._used_flags.get(flag, 0) / relevant_used_flag_count + for flag in self._flag_ratios + } + # Desirability of missions is the difference between target and current ratios for relevant flags + flag_scores = { + flag: self._flag_ratios[flag] - current_ratios[flag] + for flag in self._flag_ratios + } + mission_scores = [ + sum( + flag_scores[flag] for flag in self._flag_ratios + if flag in lookup_id_to_mission[mission].flags + ) + for mission in balanced_pool + ] + # Only keep the missions that create the best balance + best_score = max(mission_scores) + balanced_pool = [mission for idx, mission in enumerate(balanced_pool) if mission_scores[idx] == best_score] + + balanced_weights = [1.0 for _ in balanced_pool] + if len(self._flag_weights) > 0: + relevant_used_flag_count = max(sum(self._used_flags.get(flag, 0) for flag in self._flag_weights), 1) + # Higher usage rate of relevant flags means lower desirability + flag_scores = { + flag: (relevant_used_flag_count - self._used_flags.get(flag, 0)) * self._flag_weights[flag] + for flag in self._flag_weights + } + # Mission scores are averaged across the mission's flags, + # else flags that aren't always present will inflate weights + mission_scores = [ + sum( + flag_scores[flag] for flag in self._flag_weights + if flag in lookup_id_to_mission[mission].flags + ) / sum(flag in lookup_id_to_mission[mission].flags for flag in self._flag_weights) + for mission in balanced_pool + ] + balanced_weights = mission_scores + + if sum(balanced_weights) == 0.0: + balanced_weights = [1.0 for _ in balanced_weights] + return world.random.choices(balanced_pool, balanced_weights, k=1)[0] + + def pull_specific_mission(self, mission: SC2Mission) -> None: + """Marks the given mission as present in the mission order.""" + # Remove the mission from the master list and whichever difficulty pool it is in + if mission.id in self.master_list: + self.master_list.remove(mission.id) + for diff in self.difficulty_pools: + if mission.id in self.difficulty_pools[diff]: + self.difficulty_pools[diff].remove(mission.id) + break + self._add_mission_stats(mission) + + def _add_mission_stats(self, mission: SC2Mission) -> None: + # Update used flag counts & missions + # Done weirdly for Python <= 3.10 compatibility + flag: MissionFlag + for flag in iter(MissionFlag): # type: ignore + if flag & mission.flags == flag: + self._used_flags.setdefault(flag, 0) + self._used_flags[flag] += 1 + self._used_missions.append(mission) + + def pull_random_mission(self, world: World, slot: 'SC2MOGenMission', *, prefer_close_difficulty: bool = False) -> SC2Mission: + """Picks a random mission from the mission pool of the given slot and marks it as present in the mission order. + + With `prefer_close_difficulty = True` the mission is picked to be as close to the slot's desired difficulty as possible.""" + pool = slot.option_mission_pool.intersection(self.master_list) + + difficulty_pools: Dict[int, List[int]] = { + diff: sorted(pool.intersection(self.difficulty_pools[diff])) + for diff in Difficulty if diff != Difficulty.RELATIVE + } + + if len(pool) == 0: + raise OptionError(f"No available mission to be picked for slot {slot.get_address_to_node()}.") + + desired_difficulty = slot.option_difficulty + if prefer_close_difficulty: + # Iteratively look up and down around the slot's desired difficulty + # Either a difficulty with valid missions is found, or an error is raised + difficulty_offset = 0 + final_pool = difficulty_pools[desired_difficulty] + while len(final_pool) == 0: + higher_diff = min(desired_difficulty + difficulty_offset + 1, Difficulty.VERY_HARD) + final_pool = difficulty_pools[higher_diff] + if len(final_pool) > 0: + break + lower_diff = max(desired_difficulty - difficulty_offset, Difficulty.STARTER) + final_pool = difficulty_pools[lower_diff] + if len(final_pool) > 0: + break + if lower_diff == Difficulty.STARTER and higher_diff == Difficulty.VERY_HARD: + raise IndexError() + difficulty_offset += 1 + + else: + # Consider missions from all lower difficulties as well the desired difficulty + # Only take from higher difficulties if no lower difficulty is possible + final_pool = [ + mission + for difficulty in range(Difficulty.STARTER, desired_difficulty + 1) + for mission in difficulty_pools[difficulty] + ] + difficulty_offset = 1 + while len(final_pool) == 0: + higher_difficulty = desired_difficulty + difficulty_offset + if higher_difficulty > Difficulty.VERY_HARD: + raise IndexError() + final_pool = difficulty_pools[higher_difficulty] + difficulty_offset += 1 + + # Remove the mission from the master list + mission = lookup_id_to_mission[self.pick_balanced_mission(world, final_pool)] + self.master_list.remove(mission.id) + self.difficulty_pools[self.get_modified_mission_difficulty(mission)].remove(mission.id) + self._add_mission_stats(mission) + return mission diff --git a/worlds/sc2/mission_order/nodes.py b/worlds/sc2/mission_order/nodes.py new file mode 100644 index 00000000..a18a433c --- /dev/null +++ b/worlds/sc2/mission_order/nodes.py @@ -0,0 +1,606 @@ +""" +Contains the data structures that make up a mission order. +Data in these structures is validated in .options.py and manipulated by .generation.py. +""" + +from __future__ import annotations +from typing import Dict, Set, Callable, List, Any, Type, Optional, Union, TYPE_CHECKING +from weakref import ref, ReferenceType +from dataclasses import asdict +from abc import ABC, abstractmethod +import logging + +from BaseClasses import Region, CollectionState +from ..mission_tables import SC2Mission +from ..item import item_names +from .layout_types import LayoutType +from .entry_rules import SubRuleEntryRule, ItemEntryRule +from .mission_pools import Difficulty +from .slot_data import CampaignSlotData, LayoutSlotData, MissionSlotData + +if TYPE_CHECKING: + from .. import SC2World + +class MissionOrderNode(ABC): + parent: Optional[ReferenceType[MissionOrderNode]] + important_beat_event: bool + + def get_parent(self, address_so_far: str, full_address: str) -> MissionOrderNode: + if self.parent is None: + raise ValueError( + f"Address \"{address_so_far}\" (from \"{full_address}\") could not find a parent object. " + "This should mean the address contains \"..\" too often." + ) + return self.parent() + + @abstractmethod + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + raise NotImplementedError + + @abstractmethod + def child_type_name(self) -> str: + raise NotImplementedError + + @abstractmethod + def get_missions(self) -> List[SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_exits(self) -> List[SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_key_name(self) -> str: + raise NotImplementedError + + @abstractmethod + def get_min_depth(self) -> int: + raise NotImplementedError + + @abstractmethod + def get_address_to_node(self) -> str: + raise NotImplementedError + + +class SC2MOGenMissionOrder(MissionOrderNode): + """ + The top-level data structure for mission orders. + """ + campaigns: List[SC2MOGenCampaign] + sorted_missions: Dict[Difficulty, List[SC2MOGenMission]] + """All mission slots in the mission order sorted by their difficulty, but not their depth.""" + fixed_missions: List[SC2MOGenMission] + """All mission slots that have a plando'd mission.""" + items_to_lock: Dict[str, int] + keys_to_resolve: Dict[MissionOrderNode, List[ItemEntryRule]] + goal_missions: List[SC2MOGenMission] + max_depth: int + + def __init__(self, world: 'SC2World', data: Dict[str, Any]): + self.campaigns = [] + self.sorted_missions = {diff: [] for diff in Difficulty if diff != Difficulty.RELATIVE} + self.fixed_missions = [] + self.items_to_lock = {} + self.keys_to_resolve = {} + self.goal_missions = [] + self.parent = None + + for (campaign_name, campaign_data) in data.items(): + campaign = SC2MOGenCampaign(world, ref(self), campaign_name, campaign_data) + self.campaigns.append(campaign) + + # Check that the mission order actually has a goal + for campaign in self.campaigns: + if campaign.option_goal: + self.goal_missions.extend(mission for mission in campaign.exits) + for layout in campaign.layouts: + if layout.option_goal: + self.goal_missions.extend(layout.exits) + for mission in layout.missions: + if mission.option_goal and not mission.option_empty: + self.goal_missions.append(mission) + # Remove duplicates + for goal in self.goal_missions: + while self.goal_missions.count(goal) > 1: + self.goal_missions.remove(goal) + + # If not, set the last defined campaign as goal + if len(self.goal_missions) == 0: + self.campaigns[-1].option_goal = True + self.goal_missions.extend(mission for mission in self.campaigns[-1].exits) + + # Apply victory cache option wherever the value has not yet been defined; must happen after goal missions are decided + for mission in self.get_missions(): + if mission.option_victory_cache != -1: + # Already set + continue + if mission in self.goal_missions: + mission.option_victory_cache = 0 + else: + mission.option_victory_cache = world.options.victory_cache.value + + # Resolve names + used_names: Set[str] = set() + for campaign in self.campaigns: + names = [campaign.option_name] if len(campaign.option_display_name) == 0 else campaign.option_display_name + if campaign.option_unique_name: + names = [name for name in names if name not in used_names] + campaign.display_name = world.random.choice(names) + used_names.add(campaign.display_name) + for layout in campaign.layouts: + names = [layout.option_name] if len(layout.option_display_name) == 0 else layout.option_display_name + if layout.option_unique_name: + names = [name for name in names if name not in used_names] + layout.display_name = world.random.choice(names) + used_names.add(layout.display_name) + + def get_slot_data(self) -> List[Dict[str, Any]]: + # [(campaign data, [(layout data, [[(mission data)]] )] )] + return [asdict(campaign.get_slot_data()) for campaign in self.campaigns] + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return [ + campaign.layouts[0] if campaign.option_single_layout_campaign else campaign + for campaign in self.campaigns + if campaign.option_name.casefold() == term.casefold() + ] + + def child_type_name(self) -> str: + return "Campaign" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for campaign in self.campaigns for layout in campaign.layouts for mission in layout.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return [] + + def get_visual_requirement(self, _start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + return "All Missions" + + def get_key_name(self) -> str: + return super().get_key_name() # type: ignore + + def get_min_depth(self) -> int: + return super().get_min_depth() # type: ignore + + def get_address_to_node(self): + return self.campaigns[0].get_address_to_node() + "/.." + + +class SC2MOGenCampaign(MissionOrderNode): + option_name: str # name of this campaign + option_display_name: List[str] + option_unique_name: bool + option_entry_rules: List[Dict[str, Any]] + option_unique_progression_track: int # progressive keys under this campaign and on this track will be changed to a unique track + option_goal: bool # whether this campaign is required to beat the game + # minimum difficulty of this campaign + # 'relative': based on the median distance of the first mission + option_min_difficulty: Difficulty + # maximum difficulty of this campaign + # 'relative': based on the median distance of the last mission + option_max_difficulty: Difficulty + option_single_layout_campaign: bool + + # layouts of this campaign in correct order + layouts: List[SC2MOGenLayout] + exits: List[SC2MOGenMission] # missions required to beat this campaign (missions marked "exit" in layouts marked "exit") + entry_rule: SubRuleEntryRule + display_name: str + + min_depth: int + max_depth: int + + def __init__(self, world: 'SC2World', parent: ReferenceType[SC2MOGenMissionOrder], name: str, data: Dict[str, Any]): + self.parent = parent + self.important_beat_event = False + self.option_name = name + self.option_display_name = data["display_name"] + self.option_unique_name = data["unique_name"] + self.option_goal = data["goal"] + self.option_entry_rules = data["entry_rules"] + self.option_unique_progression_track = data["unique_progression_track"] + self.option_min_difficulty = Difficulty(data["min_difficulty"]) + self.option_max_difficulty = Difficulty(data["max_difficulty"]) + self.option_single_layout_campaign = data["single_layout_campaign"] + self.layouts = [] + self.exits = [] + + for (layout_name, layout_data) in data.items(): + if type(layout_data) == dict: + layout = SC2MOGenLayout(world, ref(self), layout_name, layout_data) + self.layouts.append(layout) + + # Collect required missions (marked layouts' exits) + if layout.option_exit: + self.exits.extend(layout.exits) + + # If no exits are set, use the last defined layout + if len(self.exits) == 0: + self.layouts[-1].option_exit = True + self.exits.extend(self.layouts[-1].exits) + + def is_beaten(self, beaten_missions: Set[SC2MOGenMission]) -> bool: + return beaten_missions.issuperset(self.exits) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return [ + layout + for layout in self.layouts + if layout.option_name.casefold() == term.casefold() + ] + + def child_type_name(self) -> str: + return "Layout" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for layout in self.layouts for mission in layout.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return self.exits + + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + visual_name = self.get_visual_name() + # Needs special handling for double-parent, which is valid for missions but errors for campaigns + first_parent = start_node.get_parent("", "") + if ( + first_parent is self or ( + first_parent.parent is not None and first_parent.get_parent("", "") is self + ) + ) and visual_name == "": + return "this campaign" + return visual_name + + def get_visual_name(self) -> str: + return self.display_name + + def get_key_name(self) -> str: + return item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(self.get_visual_name()) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + return f"{self.option_name}" + + def get_slot_data(self) -> CampaignSlotData: + if self.important_beat_event: + exits = [slot.mission.id for slot in self.exits] + else: + exits = [] + + return CampaignSlotData( + self.get_visual_name(), + asdict(self.entry_rule.to_slot_data()), + exits, + [asdict(layout.get_slot_data()) for layout in self.layouts] + ) + + +class SC2MOGenLayout(MissionOrderNode): + option_name: str # name of this layout + option_display_name: List[str] # visual name of this layout + option_unique_name: bool + option_type: Type[LayoutType] # type of this layout + option_size: int # amount of missions in this layout + option_goal: bool # whether this layout is required to beat the game + option_exit: bool # whether this layout is required to beat its parent campaign + option_mission_pool: List[int] # IDs of valid missions for this layout + option_missions: List[Dict[str, Any]] + + option_entry_rules: List[Dict[str, Any]] + option_unique_progression_track: int # progressive keys under this layout and on this track will be changed to a unique track + + # minimum difficulty of this layout + # 'relative': based on the median distance of the first mission + option_min_difficulty: Difficulty + # maximum difficulty of this layout + # 'relative': based on the median distance of the last mission + option_max_difficulty: Difficulty + + missions: List[SC2MOGenMission] + layout_type: LayoutType + entrances: List[SC2MOGenMission] + exits: List[SC2MOGenMission] + entry_rule: SubRuleEntryRule + display_name: str + + min_depth: int + max_depth: int + + def __init__(self, world: 'SC2World', parent: ReferenceType[SC2MOGenCampaign], name: str, data: Dict): + self.parent: ReferenceType[SC2MOGenCampaign] = parent + self.important_beat_event = False + self.option_name = name + self.option_display_name = data.pop("display_name") + self.option_unique_name = data.pop("unique_name") + self.option_type = data.pop("type") + self.option_size = data.pop("size") + self.option_goal = data.pop("goal") + self.option_exit = data.pop("exit") + self.option_mission_pool = data.pop("mission_pool") + self.option_missions = data.pop("missions") + self.option_entry_rules = data.pop("entry_rules") + self.option_unique_progression_track = data.pop("unique_progression_track") + self.option_min_difficulty = Difficulty(data.pop("min_difficulty")) + self.option_max_difficulty = Difficulty(data.pop("max_difficulty")) + self.missions = [] + self.entrances = [] + self.exits = [] + + # Check for positive size now instead of during YAML validation to actively error with default size + if self.option_size == 0: + raise ValueError(f"Layout \"{self.option_name}\" has a size of 0.") + + # Build base layout + from . import layout_types + self.layout_type: LayoutType = getattr(layout_types, self.option_type)(self.option_size) + unused = self.layout_type.set_options(data) + if len(unused) > 0: + logging.warning(f"SC2 ({world.player_name}): Layout \"{self.option_name}\" has unknown options: {list(unused.keys())}") + mission_factory = lambda: SC2MOGenMission(ref(self), set(self.option_mission_pool)) + self.missions = self.layout_type.make_slots(mission_factory) + + # Update missions with user data + for mission_data in self.option_missions: + indices: Set[int] = set() + index_terms: List[Union[int, str]] = mission_data["index"] + for term in index_terms: + result = self.resolve_index_term(term) + indices.update(result) + for idx in indices: + self.missions[idx].update_with_data(mission_data) + + # Let layout respond to user changes + self.layout_type.final_setup(self.missions) + + for mission in self.missions: + if mission.option_entrance: + self.entrances.append(mission) + if mission.option_exit: + self.exits.append(mission) + if mission.option_next is not None: + mission.next = [self.missions[idx] for term in mission.option_next for idx in sorted(self.resolve_index_term(term))] + + # Set up missions' prev data + for mission in self.missions: + for next_mission in mission.next: + next_mission.prev.append(mission) + + # Remove empty missions from access data + for mission in self.missions: + if mission.option_empty: + for next_mission in mission.next: + next_mission.prev.remove(mission) + mission.next.clear() + for prev_mission in mission.prev: + prev_mission.next.remove(mission) + mission.prev.clear() + + # Clean up data and options + all_empty = True + for mission in self.missions: + if mission.option_empty: + # Empty missions cannot be entrances, exits, or required + # This is done now instead of earlier to make "set all default entrances to empty" not fail + if mission in self.entrances: + self.entrances.remove(mission) + mission.option_entrance = False + if mission in self.exits: + self.exits.remove(mission) + mission.option_exit = False + mission.option_goal = False + # Empty missions are also not allowed to cause secondary effects via entry rules (eg. create key items) + mission.option_entry_rules = [] + else: + all_empty = False + # Establish the following invariant: + # A non-empty mission has no prev missions <=> A non-empty mission is an entrance + # This is mandatory to guarantee the entire layout is accessible via consecutive .nexts + # Note that the opposite is not enforced for exits to allow fully optional layouts + if len(mission.prev) == 0: + mission.option_entrance = True + self.entrances.append(mission) + elif mission.option_entrance: + for prev_mission in mission.prev: + prev_mission.next.remove(mission) + mission.prev.clear() + if all_empty: + raise Exception(f"Layout \"{self.option_name}\" only contains empty mission slots.") + + def is_beaten(self, beaten_missions: Set[SC2MOGenMission]) -> bool: + return beaten_missions.issuperset(self.exits) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def resolve_index_term(self, term: Union[str, int], *, ignore_out_of_bounds: bool = True, reject_none: bool = True) -> Union[Set[int], None]: + try: + result = {int(term)} + except ValueError: + if term == "entrances": + result = {idx for idx in range(len(self.missions)) if self.missions[idx].option_entrance} + elif term == "exits": + result = {idx for idx in range(len(self.missions)) if self.missions[idx].option_exit} + elif term == "all": + result = {idx for idx in range(len(self.missions))} + else: + result = self.layout_type.parse_index(term) + if result is None and reject_none: + raise ValueError(f"Layout \"{self.option_name}\" could not resolve mission index term \"{term}\".") + if ignore_out_of_bounds: + result = [index for index in result if index >= 0 and index < len(self.missions)] + return result + + def get_parent(self, _address_so_far: str, _full_address: str) -> MissionOrderNode: + if self.parent().option_single_layout_campaign: + parent = self.parent().parent + else: + parent = self.parent + return parent() + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + indices = self.resolve_index_term(term, reject_none=False) + if indices is None: + # Let the address parser handle the fail case + return [] + missions = [self.missions[index] for index in sorted(indices)] + return missions + + def child_type_name(self) -> str: + return "Mission" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for mission in self.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return self.exits + + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + visual_name = self.get_visual_name() + if start_node.get_parent("", "") is self and visual_name == "": + return "this questline" + return visual_name + + def get_visual_name(self) -> str: + return self.display_name + + def get_key_name(self) -> str: + return item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(self.get_visual_name(), self.parent().get_visual_name()) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + campaign = self.parent() + if campaign.option_single_layout_campaign: + return f"{self.option_name}" + return self.parent().get_address_to_node() + f"/{self.option_name}" + + def get_slot_data(self) -> LayoutSlotData: + mission_slots = [ + [ + asdict(self.missions[idx].get_slot_data() if (idx >= 0 and not self.missions[idx].option_empty) else MissionSlotData.empty()) + for idx in column + ] + for column in self.layout_type.get_visual_layout() + ] + if self.important_beat_event: + exits = [slot.mission.id for slot in self.exits] + else: + exits = [] + + return LayoutSlotData( + self.get_visual_name(), + asdict(self.entry_rule.to_slot_data()), + exits, + mission_slots + ) + + +class SC2MOGenMission(MissionOrderNode): + option_goal: bool # whether this mission is required to beat the game + option_entrance: bool # whether this mission is unlocked when the layout is unlocked + option_exit: bool # whether this mission is required to beat its parent layout + option_empty: bool # whether this slot contains a mission at all + option_next: Union[None, List[Union[int, str]]] # indices of internally connected missions + option_entry_rules: List[Dict[str, Any]] + option_difficulty: Difficulty # difficulty pool this mission pulls from + option_mission_pool: Set[int] # Allowed mission IDs for this slot + option_victory_cache: int # Number of victory cache locations tied to the mission name + + entry_rule: SubRuleEntryRule + min_depth: int # Smallest amount of missions to beat before this slot is accessible + + mission: SC2Mission + region: Region + + next: List[SC2MOGenMission] + prev: List[SC2MOGenMission] + + def __init__(self, parent: ReferenceType[SC2MOGenLayout], parent_mission_pool: Set[int]): + self.parent: ReferenceType[SC2MOGenLayout] = parent + self.important_beat_event = False + self.option_mission_pool = parent_mission_pool + self.option_goal = False + self.option_entrance = False + self.option_exit = False + self.option_empty = False + self.option_next = None + self.option_entry_rules = [] + self.option_difficulty = Difficulty.RELATIVE + self.next = [] + self.prev = [] + self.min_depth = -1 + self.option_victory_cache = -1 + + def update_with_data(self, data: Dict): + self.option_goal = data.get("goal", self.option_goal) + self.option_entrance = data.get("entrance", self.option_entrance) + self.option_exit = data.get("exit", self.option_exit) + self.option_empty = data.get("empty", self.option_empty) + self.option_next = data.get("next", self.option_next) + self.option_entry_rules = data.get("entry_rules", self.option_entry_rules) + self.option_difficulty = data.get("difficulty", self.option_difficulty) + self.option_mission_pool = data.get("mission_pool", self.option_mission_pool) + self.option_victory_cache = data.get("victory_cache", -1) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def beat_item(self) -> str: + return f"Beat {self.mission.mission_name}" + + def beat_rule(self, player) -> Callable[[CollectionState], bool]: + return lambda state: state.has(self.beat_item(), player) + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return None + + def child_type_name(self) -> str: + return "" + + def get_missions(self) -> List[SC2MOGenMission]: + return [self] + + def get_exits(self) -> List[SC2MOGenMission]: + return [self] + + def get_visual_requirement(self, _start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + return self + + def get_key_name(self) -> str: + return item_names._TEMPLATE_MISSION_KEY.format(self.mission.mission_name) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + layout = self.parent() + assert layout is not None + index = layout.missions.index(self) + return layout.get_address_to_node() + f"/{index}" + + def get_slot_data(self) -> MissionSlotData: + return MissionSlotData( + self.mission.id, + [mission.mission.id for mission in self.prev], + self.entry_rule.to_slot_data(), + self.option_victory_cache, + ) diff --git a/worlds/sc2/mission_order/options.py b/worlds/sc2/mission_order/options.py new file mode 100644 index 00000000..84630ba1 --- /dev/null +++ b/worlds/sc2/mission_order/options.py @@ -0,0 +1,472 @@ +""" +Contains the Custom Mission Order option. Also validates the option value, so generation can assume the data matches the specification. +""" + +from __future__ import annotations +import random + +from Options import OptionDict, Visibility +from schema import Schema, Optional, And, Or +import typing +from typing import Any, Union, Dict, Set, List +import copy + +from ..mission_tables import lookup_name_to_mission +from ..mission_groups import mission_groups +from ..item.item_tables import item_table +from ..item.item_groups import item_name_groups +from . import layout_types +from .layout_types import LayoutType, Column, Grid, Hopscotch, Gauntlet, Blitz, Canvas +from .mission_pools import Difficulty +from .presets_static import ( + static_preset, preset_mini_wol_with_prophecy, preset_mini_wol, preset_mini_hots, preset_mini_prophecy, + preset_mini_lotv_prologue, preset_mini_lotv, preset_mini_lotv_epilogue, preset_mini_nco, + preset_wol_with_prophecy, preset_wol, preset_prophecy, preset_hots, preset_lotv_prologue, + preset_lotv_epilogue, preset_lotv, preset_nco +) +from .presets_scripted import make_golden_path + +GENERIC_KEY_NAME = "Key".casefold() +GENERIC_PROGRESSIVE_KEY_NAME = "Progressive Key".casefold() + +STR_OPTION_VALUES: Dict[str, Dict[str, Any]] = { + "type": { + "column": Column.__name__, "grid": Grid.__name__, "hopscotch": Hopscotch.__name__, "gauntlet": Gauntlet.__name__, "blitz": Blitz.__name__, + "canvas": Canvas.__name__, + }, + "difficulty": { + "relative": Difficulty.RELATIVE.value, "starter": Difficulty.STARTER.value, "easy": Difficulty.EASY.value, + "medium": Difficulty.MEDIUM.value, "hard": Difficulty.HARD.value, "very hard": Difficulty.VERY_HARD.value + }, + "preset": { + "none": lambda _: {}, + "wol + prophecy": static_preset(preset_wol_with_prophecy), + "wol": static_preset(preset_wol), + "prophecy": static_preset(preset_prophecy), + "hots": static_preset(preset_hots), + "prologue": static_preset(preset_lotv_prologue), + "lotv prologue": static_preset(preset_lotv_prologue), + "lotv": static_preset(preset_lotv), + "epilogue": static_preset(preset_lotv_epilogue), + "lotv epilogue": static_preset(preset_lotv_epilogue), + "nco": static_preset(preset_nco), + "mini wol + prophecy": static_preset(preset_mini_wol_with_prophecy), + "mini wol": static_preset(preset_mini_wol), + "mini prophecy": static_preset(preset_mini_prophecy), + "mini hots": static_preset(preset_mini_hots), + "mini prologue": static_preset(preset_mini_lotv_prologue), + "mini lotv prologue": static_preset(preset_mini_lotv_prologue), + "mini lotv": static_preset(preset_mini_lotv), + "mini epilogue": static_preset(preset_mini_lotv_epilogue), + "mini lotv epilogue": static_preset(preset_mini_lotv_epilogue), + "mini nco": static_preset(preset_mini_nco), + "golden path": make_golden_path + }, +} +STR_OPTION_VALUES["min_difficulty"] = STR_OPTION_VALUES["difficulty"] +STR_OPTION_VALUES["max_difficulty"] = STR_OPTION_VALUES["difficulty"] +GLOBAL_ENTRY = "global" + +StrOption = lambda cat: And(str, lambda val: val.lower() in STR_OPTION_VALUES[cat]) +IntNegOne = And(int, lambda val: val >= -1) +IntZero = And(int, lambda val: val >= 0) +IntOne = And(int, lambda val: val >= 1) +IntPercent = And(int, lambda val: 0 <= val <= 100) +IntZeroToTen = And(int, lambda val: 0 <= val <= 10) + +SubRuleEntryRule = { + "rules": [{str: object}], # recursive schema checking is too hard + "amount": IntNegOne, +} +MissionCountEntryRule = { + "scope": [str], + "amount": IntNegOne, +} +BeatMissionsEntryRule = { + "scope": [str], +} +ItemEntryRule = { + "items": {str: int} +} +EntryRule = Or(SubRuleEntryRule, MissionCountEntryRule, BeatMissionsEntryRule, ItemEntryRule) +SchemaDifficulty = Or(*[value.value for value in Difficulty]) + +class CustomMissionOrder(OptionDict): + """ + Used to generate a custom mission order. Please see documentation to understand usage. + Will do nothing unless `mission_order` is set to `custom`. + """ + display_name = "Custom Mission Order" + visibility = Visibility.template + value: Dict[str, Dict[str, Any]] + default = { + "Default Campaign": { + "display_name": "null", + "unique_name": False, + "entry_rules": [], + "unique_progression_track": 0, + "goal": True, + "min_difficulty": "relative", + "max_difficulty": "relative", + GLOBAL_ENTRY: { + "display_name": "null", + "unique_name": False, + "entry_rules": [], + "unique_progression_track": 0, + "goal": False, + "exit": False, + "mission_pool": ["all missions"], + "min_difficulty": "relative", + "max_difficulty": "relative", + "missions": [], + }, + "Default Layout": { + "type": "grid", + "size": 9, + }, + }, + } + schema = Schema({ + # Campaigns + str: { + "display_name": [str], + "unique_name": bool, + "entry_rules": [EntryRule], + "unique_progression_track": int, + "goal": bool, + "min_difficulty": SchemaDifficulty, + "max_difficulty": SchemaDifficulty, + "single_layout_campaign": bool, + # Layouts + str: { + "display_name": [str], + "unique_name": bool, + # Type options + "type": lambda val: issubclass(getattr(layout_types, val), LayoutType), + "size": IntOne, + # Link options + "exit": bool, + "goal": bool, + "entry_rules": [EntryRule], + "unique_progression_track": int, + # Mission pool options + "mission_pool": {int}, + "min_difficulty": SchemaDifficulty, + "max_difficulty": SchemaDifficulty, + # Allow arbitrary options for layout types + Optional(str): Or(int, str, bool, [Or(int, str, bool)]), + # Mission slots + "missions": [{ + "index": [Or(int, str)], + Optional("entrance"): bool, + Optional("exit"): bool, + Optional("goal"): bool, + Optional("empty"): bool, + Optional("next"): [Or(int, str)], + Optional("entry_rules"): [EntryRule], + Optional("mission_pool"): {int}, + Optional("difficulty"): SchemaDifficulty, + Optional("victory_cache"): IntZeroToTen, + }], + }, + } + }) + + def __init__(self, yaml_value: Dict[str, Dict[str, Any]]) -> None: + # This function constructs self.value by parts, + # so the parent constructor isn't called + self.value: Dict[str, Dict[str, Any]] = {} + if yaml_value == self.default: # If this option is default, it shouldn't mess with its own values + yaml_value = copy.deepcopy(self.default) + + for campaign in yaml_value: + self.value[campaign] = {} + + # Check if this campaign has a layout type, making it a campaign-level layout + single_layout_campaign = "type" in yaml_value[campaign] + if single_layout_campaign: + # Single-layout campaigns are not allowed to declare more layouts + single_layout = {key: val for (key, val) in yaml_value[campaign].items() if type(val) != dict} + yaml_value[campaign] = {campaign: single_layout} + # Campaign should inherit certain values from the layout + if "goal" not in single_layout or not single_layout["goal"]: + yaml_value[campaign]["goal"] = False + if "unique_progression_track" in single_layout: + yaml_value[campaign]["unique_progression_track"] = single_layout["unique_progression_track"] + # Hide campaign name for single-layout campaigns + yaml_value[campaign]["display_name"] = "" + yaml_value[campaign]["single_layout_campaign"] = single_layout_campaign + + # Check if this campaign has a global layout + global_dict = {} + for name in yaml_value[campaign]: + if name.lower() == GLOBAL_ENTRY: + global_dict = yaml_value[campaign].pop(name) + break + + # Strip layouts and unknown options from the campaign + # The latter are assumed to be preset options + preset_key: str = yaml_value[campaign].pop("preset", "none") + layout_keys = [key for (key, val) in yaml_value[campaign].items() if type(val) == dict] + layouts = {key: yaml_value[campaign].pop(key) for key in layout_keys} + preset_option_keys = [key for key in yaml_value[campaign] if key not in self.default["Default Campaign"]] + preset_option_keys.remove("single_layout_campaign") + preset_options = {key: yaml_value[campaign].pop(key) for key in preset_option_keys} + + # Resolve preset + preset: Dict[str, Any] = _resolve_string_option_single("preset", preset_key)(preset_options) + # Preset global is resolved internally to avoid conflict with user global + preset_global_dict = {} + for name in preset: + if name.lower() == GLOBAL_ENTRY: + preset_global_dict = preset.pop(name) + break + preset_layout_keys = [key for (key, val) in preset.items() if type(val) == dict] + preset_layouts = {key: preset.pop(key) for key in preset_layout_keys} + ordered_layouts = {key: copy.deepcopy(preset_global_dict) for key in preset_layout_keys} + for key in preset_layout_keys: + ordered_layouts[key].update(preset_layouts[key]) + # Final layouts are preset layouts (updated by same-name user layouts) followed by custom user layouts + for key in layouts: + if key in ordered_layouts: + # Mission slots for presets should go before user mission slots + if "missions" in layouts[key] and "missions" in ordered_layouts[key]: + layouts[key]["missions"] = ordered_layouts[key]["missions"] + layouts[key]["missions"] + ordered_layouts[key].update(layouts[key]) + else: + ordered_layouts[key] = layouts[key] + + # Campaign values = default options (except for default layouts) + preset options (except for layouts) + campaign options + self.value[campaign] = {key: value for (key, value) in self.default["Default Campaign"].items() if type(value) != dict} + self.value[campaign].update(preset) + self.value[campaign].update(yaml_value[campaign]) + _resolve_special_options(self.value[campaign]) + + for layout in ordered_layouts: + # Layout values = default options + campaign's global options + layout options + self.value[campaign][layout] = copy.deepcopy(self.default["Default Campaign"][GLOBAL_ENTRY]) + self.value[campaign][layout].update(global_dict) + self.value[campaign][layout].update(ordered_layouts[layout]) + _resolve_special_options(self.value[campaign][layout]) + + for mission_slot_index in range(len(self.value[campaign][layout]["missions"])): + # Defaults for mission slots are handled by the mission slot struct + _resolve_special_options(self.value[campaign][layout]["missions"][mission_slot_index]) + + # Overloaded to remove pre-init schema validation + # Schema is still validated after __init__ + @classmethod + def from_any(cls, data: Dict[str, Any]) -> CustomMissionOrder: + if type(data) == dict: + return cls(data) + else: + raise NotImplementedError(f"Cannot Convert from non-dictionary, got {type(data)}") + + +def _resolve_special_options(data: Dict[str, Any]): + # Handle range values & string-to-value conversions + for option in data: + option_value = data[option] + new_value = _resolve_special_option(option, option_value) + data[option] = new_value + + # Special case for canvas layouts determining their own size + if "type" in data and data["type"] == Canvas.__name__: + canvas: List[str] = data["canvas"] + longest_line = max(len(line) for line in canvas) + data["size"] = len(canvas) * longest_line + data["width"] = longest_line + + +def _resolve_special_option(option: str, option_value: Any) -> Any: + # Option values can be string representations of values + if option in STR_OPTION_VALUES: + return _resolve_string_option(option, option_value) + + if option == "mission_pool": + return _resolve_mission_pool(option_value) + + if option == "entry_rules": + rules = [_resolve_entry_rule(subrule) for subrule in option_value] + return rules + + if option == "display_name": + # Make sure all the values are strings + if type(option_value) == list: + names = [str(value) for value in option_value] + return names + elif option_value == "null": + # "null" means no custom display name + return [] + else: + return [str(option_value)] + + if option in ["index", "next"]: + # All index values could be ranges + if type(option_value) == list: + # Flatten any nested lists + indices = [idx for val in [idx if type(idx) == list else [idx] for idx in option_value] for idx in val] + indices = [_resolve_potential_range(index) for index in indices] + indices = [idx if type(idx) == int else str(idx) for idx in indices] + return indices + else: + idx = _resolve_potential_range(option_value) + return [idx if type(idx) == int else str(idx)] + + # Option values can be ranges + return _resolve_potential_range(option_value) + + +def _resolve_string_option_single(option: str, option_value: str) -> Any: + formatted_value = option_value.lower().replace("_", " ") + if formatted_value not in STR_OPTION_VALUES[option]: + raise ValueError( + f"Option \"{option}\" received unknown value \"{option_value}\".\n" + f"Allowed values are: {list(STR_OPTION_VALUES[option].keys())}" + ) + return STR_OPTION_VALUES[option][formatted_value] + + +def _resolve_string_option(option: str, option_value: Union[List[str], str]) -> Any: + if type(option_value) == list: + return [_resolve_string_option_single(option, val) for val in option_value] + else: + return _resolve_string_option_single(option, option_value) + + +def _resolve_entry_rule(option_value: Dict[str, Any]) -> Dict[str, Any]: + resolved: Dict[str, Any] = {} + mutually_exclusive: List[str] = [] + if "amount" in option_value: + resolved["amount"] = _resolve_potential_range(option_value["amount"]) + if "scope" in option_value: + mutually_exclusive.append("scope") + # A scope may be a list or a single address + if type(option_value["scope"]) == list: + resolved["scope"] = [str(subscope) for subscope in option_value["scope"]] + else: + resolved["scope"] = [str(option_value["scope"])] + if "rules" in option_value: + mutually_exclusive.append("rules") + resolved["rules"] = [_resolve_entry_rule(subrule) for subrule in option_value["rules"]] + # Make sure sub-rule rules have a specified amount + if "amount" not in option_value: + resolved["amount"] = -1 + if "items" in option_value: + mutually_exclusive.append("items") + option_items: Dict[str, Any] = option_value["items"] + resolved_items = {item: int(_resolve_potential_range(str(amount))) for (item, amount) in option_items.items()} + resolved_items = _resolve_item_names(resolved_items) + resolved["items"] = {} + for item in resolved_items: + if item not in item_table: + if item.casefold() == GENERIC_KEY_NAME or item.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + resolved["items"][item] = max(0, resolved_items[item]) + continue + raise ValueError(f"Item rule contains \"{item}\", which is not a valid item name.") + amount = max(0, resolved_items[item]) + quantity = item_table[item].quantity + if amount == 0: + final_amount = quantity + elif quantity == 0: + final_amount = amount + else: + final_amount = amount + resolved["items"][item] = final_amount + if len(mutually_exclusive) > 1: + raise ValueError( + "Entry rule contains too many identifiers.\n" + f"Rule: {option_value}\n" + f"Remove all but one of these entries: {mutually_exclusive}" + ) + return resolved + + +def _resolve_potential_range(option_value: Union[Any, str]) -> Union[Any, int]: + # An option value may be a range + if type(option_value) == str and option_value.startswith("random-range-"): + resolved = _custom_range(option_value) + return resolved + else: + # As this is a catch-all function, + # assume non-range option values are handled elsewhere + # or intended to fall through + return option_value + + +def _resolve_mission_pool(option_value: Union[str, List[str]]) -> Set[int]: + if type(option_value) == str: + pool = _get_target_missions(option_value) + else: + pool: Set[int] = set() + for line in option_value: + if line.startswith("~"): + if len(pool) == 0: + raise ValueError(f"Mission Pool term {line} tried to remove missions from an empty pool.") + term = line[1:].strip() + missions = _get_target_missions(term) + pool.difference_update(missions) + elif line.startswith("^"): + if len(pool) == 0: + raise ValueError(f"Mission Pool term {line} tried to remove missions from an empty pool.") + term = line[1:].strip() + missions = _get_target_missions(term) + pool.intersection_update(missions) + else: + if line.startswith("+"): + term = line[1:].strip() + else: + term = line.strip() + missions = _get_target_missions(term) + pool.update(missions) + if len(pool) == 0: + raise ValueError(f"Mission pool evaluated to zero missions: {option_value}") + return pool + + +def _get_target_missions(term: str) -> Set[int]: + if term in lookup_name_to_mission: + return {lookup_name_to_mission[term].id} + else: + groups = [mission_groups[group] for group in mission_groups if group.casefold() == term.casefold()] + if len(groups) > 0: + return {lookup_name_to_mission[mission].id for mission in groups[0]} + else: + raise ValueError(f"Mission pool term \"{term}\" did not resolve to any specific mission or mission group.") + + +# Class-agnostic version of AP Options.Range.custom_range +def _custom_range(text: str) -> int: + textsplit = text.split("-") + try: + random_range = [int(textsplit[len(textsplit) - 2]), int(textsplit[len(textsplit) - 1])] + except ValueError: + raise ValueError(f"Invalid random range {text} for option {CustomMissionOrder.__name__}") + random_range.sort() + if text.startswith("random-range-low"): + return _triangular(random_range[0], random_range[1], random_range[0]) + elif text.startswith("random-range-middle"): + return _triangular(random_range[0], random_range[1]) + elif text.startswith("random-range-high"): + return _triangular(random_range[0], random_range[1], random_range[1]) + else: + return random.randint(random_range[0], random_range[1]) + + +def _triangular(lower: int, end: int, tri: typing.Optional[int] = None) -> int: + return int(round(random.triangular(lower, end, tri), 0)) + + +# Version of options.Sc2ItemDict.verify without World +def _resolve_item_names(value: Dict[str, int]) -> Dict[str, int]: + new_value: dict[str, int] = {} + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in item_name_groups.items() + } + case_insensitive_group_mapping.update({item.casefold(): {item} for item in item_table}) + for group_name in value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + for item_name in item_names: + new_value[item_name] = new_value.get(item_name, 0) + value[group_name] + return new_value + \ No newline at end of file diff --git a/worlds/sc2/mission_order/presets_scripted.py b/worlds/sc2/mission_order/presets_scripted.py new file mode 100644 index 00000000..010c7785 --- /dev/null +++ b/worlds/sc2/mission_order/presets_scripted.py @@ -0,0 +1,164 @@ +from typing import Dict, Any, List +import copy + +def _required_option(option: str, options: Dict[str, Any]) -> Any: + """Returns the option value, or raises an error if the option is not present.""" + if option not in options: + raise KeyError(f"Campaign preset is missing required option \"{option}\".") + return options.pop(option) + +def _validate_option(option: str, options: Dict[str, str], default: str, valid_values: List[str]) -> str: + """Returns the option value if it is present and valid, the default if it is not present, or raises an error if it is present but not valid.""" + result = options.pop(option, default) + if result not in valid_values: + raise ValueError(f"Preset option \"{option}\" received unknown value \"{result}\".") + return result + +def make_golden_path(options: Dict[str, Any]) -> Dict[str, Any]: + chain_name_options = ['Mar Sara', 'Agria', 'Redstone', 'Meinhoff', 'Haven', 'Tarsonis', 'Valhalla', 'Char', + 'Umoja', 'Kaldir', 'Zerus', 'Skygeirr Station', 'Dominion Space', 'Korhal', + 'Aiur', 'Glacius', 'Shakuras', 'Ulnar', 'Slayn', + 'Antiga', 'Braxis', 'Chau Sara', 'Moria', 'Tyrador', 'Xil', 'Zhakul', + 'Azeroth', 'Crouton', 'Draenor', 'Sanctuary'] + + size = max(_required_option("size", options), 4) + keys_option_values = ["none", "layouts", "missions", "progressive_layouts", "progressive_missions", "progressive_per_layout"] + keys_option = _validate_option("keys", options, "none", keys_option_values) + min_chains = 2 + max_chains = 6 + two_start_positions = options.pop("two_start_positions", False) + # Compensating for empty mission at start + if two_start_positions: + size += 1 + + class Campaign: + def __init__(self, missions_remaining: int): + self.chain_lengths = [1] + self.chain_padding = [0] + self.required_missions = [0] + self.padding = 0 + self.missions_remaining = missions_remaining + self.mission_counter = 1 + + def add_mission(self, chain: int, required_missions: int = 0, *, is_final: bool = False): + if self.missions_remaining == 0 and not is_final: + return + + self.mission_counter += 1 + self.chain_lengths[chain] += 1 + self.missions_remaining -= 1 + + if chain == 0: + self.padding += 1 + self.required_missions.append(required_missions) + + def add_chain(self): + self.chain_lengths.append(0) + self.chain_padding.append(self.padding) + + campaign = Campaign(size - 2) + current_required_missions = 0 + main_chain_length = 0 + while campaign.missions_remaining > 0: + main_chain_length += 1 + if main_chain_length % 2 == 1: # Adding branches + chains_to_make = 0 if len(campaign.chain_lengths) >= max_chains else min_chains if main_chain_length == 1 else 1 + for _ in range(chains_to_make): + campaign.add_chain() + # Updating branches + for side_chain in range(len(campaign.chain_lengths) - 1, 0, -1): + campaign.add_mission(side_chain) + # Adding main path mission + current_required_missions = (campaign.mission_counter * 3) // 4 + if two_start_positions: + # Compensating for skipped mission at start + current_required_missions -= 1 + campaign.add_mission(0, current_required_missions) + campaign.add_mission(0, current_required_missions, is_final = True) + + # Create mission order preset out of campaign + layout_base = { + "type": "column", + "display_name": chain_name_options, + "unique_name": True, + "missions": [], + } + # Optionally add key requirement to layouts + if keys_option == "layouts": + layout_base["entry_rules"] = [{ "items": { "Key": 1 }}] + elif keys_option == "progressive_layouts": + layout_base["entry_rules"] = [{ "items": { "Progressive Key": 0 }}] + preset = { + str(chain): copy.deepcopy(layout_base) for chain in range(len(campaign.chain_lengths)) + } + preset["0"]["exit"] = True + if not two_start_positions: + preset["0"].pop("entry_rules", []) + for chain in range(len(campaign.chain_lengths)): + length = campaign.chain_lengths[chain] + padding = campaign.chain_padding[chain] + preset[str(chain)]["size"] = padding + length + # Add padding to chain + if padding > 0: + preset[str(chain)]["missions"].append({ + "index": [pad for pad in range(padding)], + "empty": True + }) + + if chain == 0: + if two_start_positions: + preset["0"]["missions"].append({ + "index": 0, + "empty": True + }) + # Main path gets number requirements + for mission in range(1, len(campaign.required_missions)): + preset["0"]["missions"].append({ + "index": mission, + "entry_rules": [{ + "scope": "../..", + "amount": campaign.required_missions[mission] + }] + }) + # Optionally add key requirements except to the starter mission + if keys_option == "missions": + for slot in preset["0"]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Key": 1 }}) + elif keys_option == "progressive_missions": + for slot in preset["0"]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 1 }}) + # No main chain keys for progressive_per_layout keys + else: + # Other paths get main path requirements + if two_start_positions and chain < 3: + preset[str(chain)].pop("entry_rules", []) + for mission in range(length): + target = padding + mission + if two_start_positions and mission == 0 and chain < 3: + preset[str(chain)]["missions"].append({ + "index": target, + "entrance": True + }) + else: + preset[str(chain)]["missions"].append({ + "index": target, + "entry_rules": [{ + "scope": f"../../0/{target}" + }] + }) + # Optionally add key requirements + if keys_option == "missions": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Key": 1 }}) + elif keys_option == "progressive_missions": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 1 }}) + elif keys_option == "progressive_per_layout": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 0 }}) + return preset diff --git a/worlds/sc2/mission_order/presets_static.py b/worlds/sc2/mission_order/presets_static.py new file mode 100644 index 00000000..b52e5f13 --- /dev/null +++ b/worlds/sc2/mission_order/presets_static.py @@ -0,0 +1,916 @@ +from typing import Dict, Any, Callable, List, Tuple +import copy + +from ..mission_groups import MissionGroupNames +from ..mission_tables import SC2Mission, SC2Campaign + +preset_mini_wol_with_prophecy = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.WOL_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mar Sara": { + "size": 1 + }, + "Colonist": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Artifact": { + "size": 3, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../..", "amount": 4 }, { "items": { "Key": 1 }}] }, + { "index": 2, "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] } + ] + }, + "Prophecy": { + "size": 2, + "entry_rules": [ + { "scope": "../Artifact/1" }, + { "items": { "Key": 1 }} + ], + "mission_pool": [ + MissionGroupNames.PROPHECY_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Covert": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 2 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Rebellion": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 3 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Char": { + "size": 3, + "entry_rules": [ + { "scope": "../Artifact" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "next": [2] }, + { "index": 1, "entrance": True } + ] + } +} + +preset_mini_wol = copy.deepcopy(preset_mini_wol_with_prophecy) +preset_mini_prophecy = { "Prophecy": preset_mini_wol.pop("Prophecy") } +preset_mini_prophecy["Prophecy"].pop("entry_rules") +preset_mini_prophecy["Prophecy"]["type"] = "gauntlet" +preset_mini_prophecy["Prophecy"]["display_name"] = "" +preset_mini_prophecy["Prophecy"]["missions"].append({ "index": "entrances", "entry_rules": [] }) + +preset_mini_hots = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.HOTS_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Umoja": { + "size": 1, + }, + "Kaldir": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Char": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Zerus": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "scope": "..", "amount": 3 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Skygeirr Station": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 5 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Dominion Space": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 5 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Korhal": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 8 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv_prologue = { + "min_difficulty": "easy", + "Prologue": { + "display_name": "", + "type": "gauntlet", + "size": 2, + "mission_pool": [ + MissionGroupNames.PROLOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.LOTV_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Aiur": { + "size": 2, + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Korhal": { + "size": 1, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Shakuras": { + "size": 1, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Purifier": { + "size": 2, + "entry_rules": [ + { "scope": "../Korhal" }, + { "scope": "../Shakuras" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../../Ulnar" }, { "items": { "Key": 1 }}] } + ] + }, + "Ulnar": { + "size": 1, + "entry_rules": [ + { "scope": "../Purifier/0" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Tal'darim": { + "size": 1, + "entry_rules": [ + { "scope": "../Ulnar" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Return to Aiur": { + "size": 2, + "entry_rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv_epilogue = { + "min_difficulty": "very hard", + "Epilogue": { + "display_name": "", + "type": "gauntlet", + "size": 2, + "mission_pool": [ + MissionGroupNames.EPILOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_nco = { + "min_difficulty": "easy", + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.NCO_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mission Pack 1": { + "size": 2, + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Mission Pack 2": { + "size": 1, + "entry_rules": [ + { "scope": "../Mission Pack 1" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Mission Pack 3": { + "size": 2, + "entry_rules": [ + { "scope": "../Mission Pack 2" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, +} + +preset_wol_with_prophecy = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.WOL_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mar Sara": { + "size": 3, + "missions": [ + { "index": 0, "mission_pool": SC2Mission.LIBERATION_DAY.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_OUTLAWS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ZERO_HOUR.mission_name }, + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Colonist": { + "size": 4, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 1, "next": [2, 3] }, + { "index": 2, "next": [] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": [2, 3], "entry_rules": [{ "scope": "../..", "amount": 7 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.EVACUATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.OUTBREAK.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SAFE_HAVEN.mission_name }, + { "index": 3, "mission_pool": SC2Mission.HAVENS_FALL.mission_name }, + ] + }, + "Artifact": { + "size": 5, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] }, + { "index": 2, "entry_rules": [{ "scope": "../..", "amount": 11 }, { "items": { "Key": 1 }}] }, + { "index": 3, "entry_rules": [{ "scope": "../..", "amount": 14 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.SMASH_AND_GRAB.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_DIG.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_MOEBIUS_FACTOR.mission_name }, + { "index": 3, "mission_pool": SC2Mission.SUPERNOVA.mission_name }, + { "index": 4, "mission_pool": SC2Mission.MAW_OF_THE_VOID.mission_name }, + ] + }, + "Prophecy": { + "size": 4, + "entry_rules": [ + { "scope": "../Artifact/1" }, + { "items": { "Key": 1 }} + ], + "mission_pool": [ + MissionGroupNames.PROPHECY_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WHISPERS_OF_DOOM.mission_name }, + { "index": 1, "mission_pool": SC2Mission.A_SINISTER_TURN.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ECHOES_OF_THE_FUTURE.mission_name }, + { "index": 3, "mission_pool": SC2Mission.IN_UTTER_DARKNESS.mission_name }, + ] + }, + "Covert": { + "size": 4, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 4 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 1, "next": [2, 3] }, + { "index": 2, "next": [] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": [2, 3], "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DEVILS_PLAYGROUND.mission_name }, + { "index": 1, "mission_pool": SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.BREAKOUT.mission_name }, + { "index": 3, "mission_pool": SC2Mission.GHOST_OF_A_CHANCE.mission_name }, + ] + }, + "Rebellion": { + "size": 5, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 6 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name }, + { "index": 1, "mission_pool": SC2Mission.CUTTHROAT.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENGINE_OF_DESTRUCTION.mission_name }, + { "index": 3, "mission_pool": SC2Mission.MEDIA_BLITZ.mission_name }, + { "index": 4, "mission_pool": SC2Mission.PIERCING_OF_THE_SHROUD.mission_name }, + ] + }, + "Char": { + "size": 4, + "entry_rules": [ + { "scope": "../Artifact" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 0, "next": [1, 2] }, + { "index": [1, 2], "next": [3] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.GATES_OF_HELL.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BELLY_OF_THE_BEAST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SHATTER_THE_SKY.mission_name }, + { "index": 3, "mission_pool": SC2Mission.ALL_IN.mission_name }, + ] + } +} + +preset_wol = copy.deepcopy(preset_wol_with_prophecy) +preset_prophecy = { "Prophecy": preset_wol.pop("Prophecy") } +preset_prophecy["Prophecy"].pop("entry_rules") +preset_prophecy["Prophecy"]["type"] = "gauntlet" +preset_prophecy["Prophecy"]["display_name"] = "" +preset_prophecy["Prophecy"]["missions"].append({ "index": "entrances", "entry_rules": [] }) + +preset_hots = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.HOTS_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Umoja": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.LAB_RAT.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BACK_IN_THE_SADDLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.RENDEZVOUS.mission_name }, + ] + }, + "Kaldir": { + "size": 3, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.HARVEST_OF_SCREAMS.mission_name }, + { "index": 1, "mission_pool": SC2Mission.SHOOT_THE_MESSENGER.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENEMY_WITHIN.mission_name }, + ] + }, + "Char": { + "size": 3, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DOMINATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.FIRE_IN_THE_SKY.mission_name }, + { "index": 2, "mission_pool": SC2Mission.OLD_SOLDIERS.mission_name }, + ] + }, + "Zerus": { + "size": 3, + "entry_rules": [ + { + "rules": [ + { "scope": "../Kaldir" }, + { "scope": "../Char" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WAKING_THE_ANCIENT.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_CRUCIBLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SUPREME.mission_name }, + ] + }, + "Skygeirr Station": { + "size": 3, + "entry_rules": [ + { "scope": ["../Kaldir", "../Char", "../Zerus"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.INFESTED.mission_name }, + { "index": 1, "mission_pool": SC2Mission.HAND_OF_DARKNESS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.PHANTOMS_OF_THE_VOID.mission_name }, + ] + }, + "Dominion Space": { + "size": 2, + "entry_rules": [ + { "scope": ["../Kaldir", "../Char", "../Zerus"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.CONVICTION.mission_name }, + ] + }, + "Korhal": { + "size": 3, + "entry_rules": [ + { "scope": ["../Skygeirr Station", "../Dominion Space"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.PLANETFALL.mission_name }, + { "index": 1, "mission_pool": SC2Mission.DEATH_FROM_ABOVE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_RECKONING.mission_name }, + ] + } +} + +preset_lotv_prologue = { + "min_difficulty": "easy", + "Prologue": { + "display_name": "", + "type": "gauntlet", + "size": 3, + "mission_pool": [ + MissionGroupNames.PROLOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DARK_WHISPERS.mission_name }, + { "index": 1, "mission_pool": SC2Mission.GHOSTS_IN_THE_FOG.mission_name }, + { "index": 2, "mission_pool": SC2Mission.EVIL_AWOKEN.mission_name }, + ] + } +} + +preset_lotv = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.LOTV_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Aiur": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.FOR_AIUR.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_GROWING_SHADOW.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_SPEAR_OF_ADUN.mission_name }, + ] + }, + "Korhal": { + "size": 2, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.SKY_SHIELD.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BROTHERS_IN_ARMS.mission_name }, + ] + }, + "Shakuras": { + "size": 2, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.AMON_S_REACH.mission_name }, + { "index": 1, "mission_pool": SC2Mission.LAST_STAND.mission_name }, + ] + }, + "Purifier": { + "size": 3, + "entry_rules": [ + { + "rules": [ + { "scope": "../Korhal" }, + { "scope": "../Shakuras" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../../Ulnar" }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.FORBIDDEN_WEAPON.mission_name }, + { "index": 1, "mission_pool": SC2Mission.UNSEALING_THE_PAST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.PURIFICATION.mission_name }, + ] + }, + "Ulnar": { + "size": 3, + "entry_rules": [ + { + "scope": [ + "../Korhal", + "../Shakuras", + "../Purifier/0" + ] + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLE_OF_UNIFICATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_INFINITE_CYCLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.HARBINGER_OF_OBLIVION.mission_name }, + ] + }, + "Tal'darim": { + "size": 2, + "entry_rules": [ + { "scope": "../Ulnar" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.STEPS_OF_THE_RITE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.RAK_SHIR.mission_name }, + ] + }, + "Moebius": { + "size": 1, + "entry_rules": [ + { + "rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLAR_S_CHARGE.mission_name }, + ] + }, + "Return to Aiur": { + "size": 3, + "entry_rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" }, + { "scope": "../Moebius" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLAR_S_RETURN.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_HOST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SALVATION.mission_name }, + ] + } +} + +preset_lotv_epilogue = { + "min_difficulty": "very hard", + "Epilogue": { + "display_name": "", + "type": "gauntlet", + "size": 3, + "mission_pool": [ + MissionGroupNames.EPILOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.INTO_THE_VOID.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name }, + { "index": 2, "mission_pool": SC2Mission.AMON_S_FALL.mission_name }, + ] + } +} + +preset_nco = { + "min_difficulty": "easy", + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.NCO_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mission Pack 1": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.THE_ESCAPE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.SUDDEN_STRIKE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENEMY_INTELLIGENCE.mission_name }, + ] + }, + "Mission Pack 2": { + "size": 3, + "entry_rules": [ + { "scope": "../Mission Pack 1" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TROUBLE_IN_PARADISE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.NIGHT_TERRORS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.FLASHPOINT.mission_name }, + ] + }, + "Mission Pack 3": { + "size": 3, + "entry_rules": [ + { "scope": "../Mission Pack 2" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name }, + { "index": 1, "mission_pool": SC2Mission.DARK_SKIES.mission_name }, + { "index": 2, "mission_pool": SC2Mission.END_GAME.mission_name }, + ] + }, +} + +def _build_static_preset(preset: Dict[str, Any], options: Dict[str, Any]) -> Dict[str, Any]: + # Raceswap shuffling + raceswaps = options.pop("shuffle_raceswaps", False) + if not isinstance(raceswaps, bool): + raise ValueError( + f"Preset option \"shuffle_raceswaps\" received unknown value \"{raceswaps}\".\n" + "Valid values are: true, false" + ) + elif raceswaps == True: + # Remove "~ Raceswap Missions" operation from mission pool options + # Also add raceswap variants to plando'd vanilla missions + for layout in preset.values(): + if type(layout) == dict: + # Currently mission pools in layouts are always ["X campaign missions", "~ raceswap missions"] + layout_mission_pool: List[str] = layout.get("mission_pool", None) + if layout_mission_pool is not None: + layout_mission_pool.pop() + layout["mission_pool"] = layout_mission_pool + if "missions" in layout: + for slot in layout["missions"]: + # Currently mission pools in slots are always strings + slot_mission_pool: str = slot.get("mission_pool", None) + # Identify raceswappable missions by their race in brackets + if slot_mission_pool is not None and slot_mission_pool[-1] == ")": + mission_name = slot_mission_pool[:slot_mission_pool.rfind("(")] + new_mission_pool = [f"{mission_name}({race})" for race in ["Terran", "Zerg", "Protoss"]] + slot["mission_pool"] = new_mission_pool + # The presets are set up for no raceswaps, so raceswaps == False doesn't need to be covered + + # Mission pool selection + missions = options.pop("missions", "random") + if missions == "vanilla": + pass # use preset as it is + elif missions == "vanilla_shuffled": + # remove pre-set missions + for layout in preset.values(): + if type(layout) == dict and "missions" in layout: + for slot in layout["missions"]: + slot.pop("mission_pool", ()) + elif missions == "random": + # remove pre-set missions and mission pools + for layout in preset.values(): + if type(layout) == dict: + layout.pop("mission_pool", ()) + if "missions" in layout: + for slot in layout["missions"]: + slot.pop("mission_pool", ()) + else: + raise ValueError( + f"Preset option \"missions\" received unknown value \"{missions}\".\n" + "Valid values are: random, vanilla, vanilla_shuffled" + ) + + # Key rule selection + keys = options.pop("keys", "none") + if keys == "layouts": + # remove keys from mission entry rules + for layout in preset.values(): + if type(layout) == dict and "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + elif keys == "missions": + # remove keys from layout entry rules + for layout in preset.values(): + if type(layout) == dict and "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + elif keys == "progressive_layouts": + # remove keys from mission entry rules, replace keys in layout entry rules with unique-track keys + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _make_key_rules_progressive(layout["entry_rules"], 0) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + elif keys == "progressive_missions": + # remove keys from layout entry rules, replace keys in mission entry rules + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _make_key_rules_progressive(slot["entry_rules"], 1) + elif keys == "progressive_per_layout": + # remove keys from layout entry rules, replace keys in mission entry rules with unique-track keys + # specifically ignore layouts that have no entry rules (and are thus the first of their campaign) + for layout in preset.values(): + if type(layout) == dict and "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _make_key_rules_progressive(slot["entry_rules"], 0) + elif keys == "none": + # remove keys from both layout and mission entry rules + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + else: + raise ValueError( + f"Preset option \"keys\" received unknown value \"{keys}\".\n" + "Valid values are: none, missions, layouts, progressive_missions, progressive_layouts, progressive_per_layout" + ) + + return preset + +def _remove_key_rules(entry_rules: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + return [rule for rule in entry_rules if not ("items" in rule and "Key" in rule["items"])] + +def _make_key_rules_progressive(entry_rules: List[Dict[str, Any]], track: int) -> List[Dict[str, Any]]: + for rule in entry_rules: + if "items" in rule and "Key" in rule["items"]: + new_items: Dict[str, Any] = {} + for (item, amount) in rule["items"].items(): + if item == "Key": + new_items["Progressive Key"] = track + else: + new_items[item] = amount + rule["items"] = new_items + return entry_rules + +def static_preset(preset: Dict[str, Any]) -> Callable[[Dict[str, Any]], Dict[str, Any]]: + return lambda options: _build_static_preset(copy.deepcopy(preset), options) + +def get_used_layout_names() -> Dict[SC2Campaign, Tuple[int, List[str]]]: + campaign_to_preset: Dict[SC2Campaign, Dict[str, Any]] = { + SC2Campaign.WOL: preset_wol_with_prophecy, + SC2Campaign.PROPHECY: preset_prophecy, + SC2Campaign.HOTS: preset_hots, + SC2Campaign.PROLOGUE: preset_lotv_prologue, + SC2Campaign.LOTV: preset_lotv, + SC2Campaign.EPILOGUE: preset_lotv_epilogue, + SC2Campaign.NCO: preset_nco + } + campaign_to_layout_names: Dict[SC2Campaign, Tuple[int, List[str]]] = { SC2Campaign.GLOBAL: (0, []) } + for campaign in SC2Campaign: + if campaign == SC2Campaign.GLOBAL: + continue + previous_campaign = [prev for prev in SC2Campaign if prev.id == campaign.id - 1][0] + previous_size = campaign_to_layout_names[previous_campaign][0] + preset = campaign_to_preset[campaign] + new_layouts = [value for value in preset.keys() if isinstance(preset[value], dict) and value != "global"] + campaign_to_layout_names[campaign] = (previous_size + len(campaign_to_layout_names[previous_campaign][1]), new_layouts) + campaign_to_layout_names.pop(SC2Campaign.GLOBAL) + return campaign_to_layout_names diff --git a/worlds/sc2/mission_order/slot_data.py b/worlds/sc2/mission_order/slot_data.py new file mode 100644 index 00000000..44d4f405 --- /dev/null +++ b/worlds/sc2/mission_order/slot_data.py @@ -0,0 +1,53 @@ +""" +Houses the data structures representing a mission order in slot data. +Creating these is handled by the nodes they represent in .nodes.py. +""" + +from __future__ import annotations +from typing import List, Protocol +from dataclasses import dataclass + +from .entry_rules import SubRuleRuleData + +class MissionOrderObjectSlotData(Protocol): + entry_rule: SubRuleRuleData + + +@dataclass +class CampaignSlotData: + name: str + entry_rule: SubRuleRuleData + exits: List[int] + layouts: List[LayoutSlotData] + + @staticmethod + def legacy(name: str, layouts: List[LayoutSlotData]) -> CampaignSlotData: + return CampaignSlotData(name, SubRuleRuleData.empty(), [], layouts) + + +@dataclass +class LayoutSlotData: + name: str + entry_rule: SubRuleRuleData + exits: List[int] + missions: List[List[MissionSlotData]] + + @staticmethod + def legacy(name: str, missions: List[List[MissionSlotData]]) -> LayoutSlotData: + return LayoutSlotData(name, SubRuleRuleData.empty(), [], missions) + + +@dataclass +class MissionSlotData: + mission_id: int + prev_mission_ids: List[int] + entry_rule: SubRuleRuleData + victory_cache_size: int = 0 + + @staticmethod + def empty() -> MissionSlotData: + return MissionSlotData(-1, [], SubRuleRuleData.empty()) + + @staticmethod + def legacy(mission_id: int, prev_mission_ids: List[int], entry_rule: SubRuleRuleData) -> MissionSlotData: + return MissionSlotData(mission_id, prev_mission_ids, entry_rule) diff --git a/worlds/sc2/mission_tables.py b/worlds/sc2/mission_tables.py new file mode 100644 index 00000000..3dfe50ff --- /dev/null +++ b/worlds/sc2/mission_tables.py @@ -0,0 +1,577 @@ +from typing import NamedTuple, Dict, List, Set, Union, Literal, Iterable, Optional +from enum import IntEnum, Enum, IntFlag, auto + + +class SC2Race(IntEnum): + ANY = 0 + TERRAN = 1 + ZERG = 2 + PROTOSS = 3 + + def get_title(self): + return self.name.lower().capitalize() + + def get_mission_flag(self): + return MissionFlag.__getitem__(self.get_title()) + +class MissionPools(IntEnum): + STARTER = 0 + EASY = 1 + MEDIUM = 2 + HARD = 3 + VERY_HARD = 4 + FINAL = 5 + + +class MissionFlag(IntFlag): + none = 0 + Terran = auto() + Zerg = auto() + Protoss = auto() + NoBuild = auto() + Defense = auto() + AutoScroller = auto() # The mission is won by waiting out a timer or victory is gated behind a timer + Countdown = auto() # Overall, the mission must be beaten before a loss timer counts down + Kerrigan = auto() # The player controls Kerrigan in the mission + VanillaSoa = auto() # The player controls the Spear of Adun in the vanilla version of the mission + Nova = auto() # The player controls NCO Nova in the mission + AiTerranAlly = auto() # The mission has a Terran AI ally that can be taken over + AiZergAlly = auto() # The mission has a Zerg AI ally that can be taken over + AiProtossAlly = auto() # The mission has a Protoss AI ally that can be taken over + VsTerran = auto() + VsZerg = auto() + VsProtoss = auto() + HasRaceSwap = auto() # The mission has variants that use different factions from the vanilla experience. + RaceSwap = auto() # The mission uses different factions from the vanilla experience. + WoLNova = auto() # The player controls WoL Nova in the mission + + AiAlly = AiTerranAlly|AiZergAlly|AiProtossAlly + TimedDefense = AutoScroller|Defense + VsTZ = VsTerran|VsZerg + VsTP = VsTerran|VsProtoss + VsPZ = VsProtoss|VsZerg + VsAll = VsTerran|VsProtoss|VsZerg + + +class SC2CampaignGoalPriority(IntEnum): + """ + Campaign's priority to goal election + """ + NONE = 0 + MINI_CAMPAIGN = 1 # A goal shouldn't be in a mini-campaign if there's at least one 'big' campaign + HARD = 2 # A campaign ending with a hard mission + VERY_HARD = 3 # A campaign ending with a very hard mission + EPILOGUE = 4 # Epilogue shall be always preferred as the goal if present + + +class SC2Campaign(Enum): + + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, campaign_id: int, name: str, goal_priority: SC2CampaignGoalPriority, race: SC2Race): + self.id = campaign_id + self.campaign_name = name + self.goal_priority = goal_priority + self.race = race + + def __lt__(self, other: "SC2Campaign"): + return self.id < other.id + + GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY + WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN + PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS + HOTS = 3, "Heart of the Swarm", SC2CampaignGoalPriority.VERY_HARD, SC2Race.ZERG + PROLOGUE = 4, "Whispers of Oblivion (Legacy of the Void: Prologue)", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS + LOTV = 5, "Legacy of the Void", SC2CampaignGoalPriority.VERY_HARD, SC2Race.PROTOSS + EPILOGUE = 6, "Into the Void (Legacy of the Void: Epilogue)", SC2CampaignGoalPriority.EPILOGUE, SC2Race.ANY + NCO = 7, "Nova Covert Ops", SC2CampaignGoalPriority.HARD, SC2Race.TERRAN + + +class SC2Mission(Enum): + + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, mission_id: int, name: str, campaign: SC2Campaign, area: str, race: SC2Race, pool: MissionPools, map_file: str, flags: MissionFlag): + self.id = mission_id + self.mission_name = name + self.campaign = campaign + self.area = area + self.race = race + self.pool = pool + self.map_file = map_file + self.flags = flags + + def get_short_name(self): + if self.mission_name.find(' (') == -1: + return self.mission_name + else: + return self.mission_name[:self.mission_name.find(' (')] + + # Wings of Liberty + LIBERATION_DAY = 1, "Liberation Day", SC2Campaign.WOL, "Mar Sara", SC2Race.ANY, MissionPools.STARTER, "ap_liberation_day", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + THE_OUTLAWS = 2, "The Outlaws (Terran)", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + ZERO_HOUR = 3, "Zero Hour (Terran)", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_zero_hour", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + EVACUATION = 4, "Evacuation (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_evacuation", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + OUTBREAK = 5, "Outbreak (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_outbreak", MissionFlag.Terran|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SAFE_HAVEN = 6, "Safe Haven (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + HAVENS_FALL = 7, "Haven's Fall (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SMASH_AND_GRAB = 8, "Smash and Grab (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + THE_DIG = 9, "The Dig (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + THE_MOEBIUS_FACTOR = 10, "The Moebius Factor (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SUPERNOVA = 11, "Supernova (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_supernova", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + MAW_OF_THE_VOID = 12, "Maw of the Void (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_maw_of_the_void", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + DEVILS_PLAYGROUND = 13, "Devil's Playground (Terran)", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.EASY, "ap_devils_playground", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + WELCOME_TO_THE_JUNGLE = 14, "Welcome to the Jungle (Terran)", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_welcome_to_the_jungle", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + BREAKOUT = 15, "Breakout", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_breakout", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + GHOST_OF_A_CHANCE = 16, "Ghost of a Chance", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_ghost_of_a_chance", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran|MissionFlag.WoLNova + THE_GREAT_TRAIN_ROBBERY = 17, "The Great Train Robbery (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + CUTTHROAT = 18, "Cutthroat (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + ENGINE_OF_DESTRUCTION = 19, "Engine of Destruction (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + MEDIA_BLITZ = 20, "Media Blitz (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_media_blitz", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + PIERCING_OF_THE_SHROUD = 21, "Piercing the Shroud", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.STARTER, "ap_piercing_the_shroud", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsAll + GATES_OF_HELL = 26, "Gates of Hell (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + BELLY_OF_THE_BEAST = 27, "Belly of the Beast", SC2Campaign.WOL, "Char", SC2Race.ANY, MissionPools.STARTER, "ap_belly_of_the_beast", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsZerg + SHATTER_THE_SKY = 28, "Shatter the Sky (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_shatter_the_sky", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + ALL_IN = 29, "All-In (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + + # Prophecy + WHISPERS_OF_DOOM = 22, "Whispers of Doom", SC2Campaign.PROPHECY, "_1", SC2Race.ANY, MissionPools.STARTER, "ap_whispers_of_doom", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsZerg + A_SINISTER_TURN = 23, "A Sinister Turn (Protoss)", SC2Campaign.PROPHECY, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + ECHOES_OF_THE_FUTURE = 24, "Echoes of the Future (Protoss)", SC2Campaign.PROPHECY, "_3", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + IN_UTTER_DARKNESS = 25, "In Utter Darkness (Protoss)", SC2Campaign.PROPHECY, "_4", SC2Race.PROTOSS, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + + # Heart of the Swarm + LAB_RAT = 30, "Lab Rat (Zerg)", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + BACK_IN_THE_SADDLE = 31, "Back in the Saddle", SC2Campaign.HOTS, "Umoja", SC2Race.ANY, MissionPools.STARTER, "ap_back_in_the_saddle", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTZ + RENDEZVOUS = 32, "Rendezvous (Zerg)", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.EASY, "ap_rendezvous", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + HARVEST_OF_SCREAMS = 33, "Harvest of Screams (Zerg)", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + SHOOT_THE_MESSENGER = 34, "Shoot the Messenger (Zerg)", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_shoot_the_messenger", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + ENEMY_WITHIN = 35, "Enemy Within", SC2Campaign.HOTS, "Kaldir", SC2Race.ANY, MissionPools.EASY, "ap_enemy_within", MissionFlag.Zerg|MissionFlag.NoBuild|MissionFlag.VsProtoss + DOMINATION = 36, "Domination (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.EASY, "ap_domination", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + FIRE_IN_THE_SKY = 37, "Fire in the Sky (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + OLD_SOLDIERS = 38, "Old Soldiers (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + WAKING_THE_ANCIENT = 39, "Waking the Ancient (Zerg)", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + THE_CRUCIBLE = 40, "The Crucible (Zerg)", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SUPREME = 41, "Supreme", SC2Campaign.HOTS, "Zerus", SC2Race.ANY, MissionPools.MEDIUM, "ap_supreme", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsZerg + INFESTED = 42, "Infested (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_infested", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + HAND_OF_DARKNESS = 43, "Hand of Darkness (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + PHANTOMS_OF_THE_VOID = 44, "Phantoms of the Void (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + WITH_FRIENDS_LIKE_THESE = 45, "With Friends Like These", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.STARTER, "ap_with_friends_like_these", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + CONVICTION = 46, "Conviction", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.MEDIUM, "ap_conviction", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTerran + PLANETFALL = 47, "Planetfall (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_planetfall", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + DEATH_FROM_ABOVE = 48, "Death From Above (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_death_from_above", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + THE_RECKONING = 49, "The Reckoning (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + + # Prologue + DARK_WHISPERS = 50, "Dark Whispers (Protoss)", SC2Campaign.PROLOGUE, "_1", SC2Race.PROTOSS, MissionPools.EASY, "ap_dark_whispers", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.HasRaceSwap + GHOSTS_IN_THE_FOG = 51, "Ghosts in the Fog (Protoss)", SC2Campaign.PROLOGUE, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_ghosts_in_the_fog", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + EVIL_AWOKEN = 52, "Evil Awoken", SC2Campaign.PROLOGUE, "_3", SC2Race.PROTOSS, MissionPools.STARTER, "ap_evil_awoken", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsProtoss + + # LotV + FOR_AIUR = 53, "For Aiur!", SC2Campaign.LOTV, "Aiur", SC2Race.ANY, MissionPools.STARTER, "ap_for_aiur", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsZerg + THE_GROWING_SHADOW = 54, "The Growing Shadow (Protoss)", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Protoss|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + THE_SPEAR_OF_ADUN = 55, "The Spear of Adun (Protoss)", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_spear_of_adun", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + SKY_SHIELD = 56, "Sky Shield (Protoss)", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + BROTHERS_IN_ARMS = 57, "Brothers in Arms (Protoss)", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + AMON_S_REACH = 58, "Amon's Reach (Protoss)", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + LAST_STAND = 59, "Last Stand (Protoss)", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.HARD, "ap_last_stand", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + FORBIDDEN_WEAPON = 60, "Forbidden Weapon (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_forbidden_weapon", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + TEMPLE_OF_UNIFICATION = 61, "Temple of Unification (Protoss)", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_temple_of_unification", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTP|MissionFlag.HasRaceSwap + THE_INFINITE_CYCLE = 62, "The Infinite Cycle", SC2Campaign.LOTV, "Ulnar", SC2Race.ANY, MissionPools.HARD, "ap_the_infinite_cycle", MissionFlag.Protoss|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTP + HARBINGER_OF_OBLIVION = 63, "Harbinger of Oblivion (Protoss)", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_harbinger_of_oblivion", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.HasRaceSwap + UNSEALING_THE_PAST = 64, "Unsealing the Past (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + PURIFICATION = 65, "Purification (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_purification", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + STEPS_OF_THE_RITE = 66, "Steps of the Rite (Protoss)", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + RAK_SHIR = 67, "Rak'Shir (Protoss)", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_rak_shir", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + TEMPLAR_S_CHARGE = 68, "Templar's Charge (Protoss)", SC2Campaign.LOTV, "Moebius", SC2Race.PROTOSS, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + TEMPLAR_S_RETURN = 69, "Templar's Return", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_templar_s_return", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsPZ + THE_HOST = 70, "The Host (Protoss)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsAll|MissionFlag.HasRaceSwap + SALVATION = 71, "Salvation (Protoss)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.HasRaceSwap + + # Epilogue + INTO_THE_VOID = 72, "Into the Void", SC2Campaign.EPILOGUE, "_1", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_into_the_void", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsAll|MissionFlag.AiTerranAlly|MissionFlag.AiZergAlly + THE_ESSENCE_OF_ETERNITY = 73, "The Essence of Eternity", SC2Campaign.EPILOGUE, "_2", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_essence_of_eternity", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsAll|MissionFlag.AiZergAlly|MissionFlag.AiProtossAlly + AMON_S_FALL = 74, "Amon's Fall", SC2Campaign.EPILOGUE, "_3", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_amon_s_fall", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsAll|MissionFlag.AiTerranAlly|MissionFlag.AiProtossAlly + + # Nova Covert Ops + THE_ESCAPE = 75, "The Escape", SC2Campaign.NCO, "_1", SC2Race.ANY, MissionPools.MEDIUM, "ap_the_escape", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.NoBuild|MissionFlag.VsTerran + SUDDEN_STRIKE = 76, "Sudden Strike", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_sudden_strike", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.TimedDefense|MissionFlag.VsZerg + ENEMY_INTELLIGENCE = 77, "Enemy Intelligence", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_enemy_intelligence", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Defense|MissionFlag.VsZerg + TROUBLE_IN_PARADISE = 78, "Trouble In Paradise", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_trouble_in_paradise", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Countdown|MissionFlag.VsPZ + NIGHT_TERRORS = 79, "Night Terrors", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_night_terrors", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.VsPZ + FLASHPOINT = 80, "Flashpoint", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_flashpoint", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.VsZerg + IN_THE_ENEMY_S_SHADOW = 81, "In the Enemy's Shadow", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_in_the_enemy_s_shadow", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.NoBuild|MissionFlag.VsTerran + DARK_SKIES = 82, "Dark Skies", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.HARD, "ap_dark_skies", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.TimedDefense|MissionFlag.VsProtoss + END_GAME = 83, "End Game", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_end_game", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Defense|MissionFlag.VsTerran + + # Race-Swapped Variants + # 84/85 - Liberation Day + THE_OUTLAWS_Z = 86, "The Outlaws (Zerg)", SC2Campaign.WOL, "Mar Sara", SC2Race.ZERG, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_OUTLAWS_P = 87, "The Outlaws (Protoss)", SC2Campaign.WOL, "Mar Sara", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + ZERO_HOUR_Z = 88, "Zero Hour (Zerg)", SC2Campaign.WOL, "Mar Sara", SC2Race.ZERG, MissionPools.MEDIUM, "ap_zero_hour", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + ZERO_HOUR_P = 89, "Zero Hour (Protoss)", SC2Campaign.WOL, "Mar Sara", SC2Race.PROTOSS, MissionPools.EASY, "ap_zero_hour", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + EVACUATION_Z = 90, "Evacuation (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.EASY, "ap_evacuation", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + EVACUATION_P = 91, "Evacuation (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.EASY, "ap_evacuation", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + OUTBREAK_Z = 92, "Outbreak (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_outbreak", MissionFlag.Zerg|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.RaceSwap + OUTBREAK_P = 93, "Outbreak (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_outbreak", MissionFlag.Protoss|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.RaceSwap + SAFE_HAVEN_Z = 94, "Safe Haven (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SAFE_HAVEN_P = 95, "Safe Haven (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + HAVENS_FALL_Z = 96, "Haven's Fall (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + HAVENS_FALL_P = 97, "Haven's Fall (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + SMASH_AND_GRAB_Z = 98, "Smash and Grab (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.RaceSwap + SMASH_AND_GRAB_P = 99, "Smash and Grab (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_DIG_Z = 100, "The Dig (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.RaceSwap + THE_DIG_P = 101, "The Dig (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.RaceSwap + THE_MOEBIUS_FACTOR_Z = 102, "The Moebius Factor (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_MOEBIUS_FACTOR_P = 103, "The Moebius Factor (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + SUPERNOVA_Z = 104, "Supernova (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.HARD, "ap_supernova", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SUPERNOVA_P = 105, "Supernova (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.HARD, "ap_supernova", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + MAW_OF_THE_VOID_Z = 106, "Maw of the Void (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.HARD, "ap_maw_of_the_void", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + MAW_OF_THE_VOID_P = 107, "Maw of the Void (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_maw_of_the_void", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + DEVILS_PLAYGROUND_Z = 108, "Devil's Playground (Zerg)", SC2Campaign.WOL, "Covert", SC2Race.ZERG, MissionPools.EASY, "ap_devils_playground", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + DEVILS_PLAYGROUND_P = 109, "Devil's Playground (Protoss)", SC2Campaign.WOL, "Covert", SC2Race.PROTOSS, MissionPools.EASY, "ap_devils_playground", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + WELCOME_TO_THE_JUNGLE_Z = 110, "Welcome to the Jungle (Zerg)", SC2Campaign.WOL, "Covert", SC2Race.ZERG, MissionPools.HARD, "ap_welcome_to_the_jungle", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + WELCOME_TO_THE_JUNGLE_P = 111, "Welcome to the Jungle (Protoss)", SC2Campaign.WOL, "Covert", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_welcome_to_the_jungle", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 112/113 - Breakout + # 114/115 - Ghost of a Chance + THE_GREAT_TRAIN_ROBBERY_Z = 116, "The Great Train Robbery (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_GREAT_TRAIN_ROBBERY_P = 117, "The Great Train Robbery (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + CUTTHROAT_Z = 118, "Cutthroat (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + CUTTHROAT_P = 119, "Cutthroat (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + ENGINE_OF_DESTRUCTION_Z = 120, "Engine of Destruction (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + ENGINE_OF_DESTRUCTION_P = 121, "Engine of Destruction (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + MEDIA_BLITZ_Z = 122, "Media Blitz (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.HARD, "ap_media_blitz", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + MEDIA_BLITZ_P = 123, "Media Blitz (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_media_blitz", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 124/125 - Piercing the Shroud + # 126/127 - Whispers of Doom + A_SINISTER_TURN_T = 128, "A Sinister Turn (Terran)", SC2Campaign.PROPHECY, "_2", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + A_SINISTER_TURN_Z = 129, "A Sinister Turn (Zerg)", SC2Campaign.PROPHECY, "_2", SC2Race.ZERG, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + ECHOES_OF_THE_FUTURE_T = 130, "Echoes of the Future (Terran)", SC2Campaign.PROPHECY, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + ECHOES_OF_THE_FUTURE_Z = 131, "Echoes of the Future (Zerg)", SC2Campaign.PROPHECY, "_3", SC2Race.ZERG, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + IN_UTTER_DARKNESS_T = 132, "In Utter Darkness (Terran)", SC2Campaign.PROPHECY, "_4", SC2Race.TERRAN, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + IN_UTTER_DARKNESS_Z = 133, "In Utter Darkness (Zerg)", SC2Campaign.PROPHECY, "_4", SC2Race.ZERG, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + GATES_OF_HELL_Z = 134, "Gates of Hell (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + GATES_OF_HELL_P = 135, "Gates of Hell (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + # 136/137 - Belly of the Beast + SHATTER_THE_SKY_Z = 138, "Shatter the Sky (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.HARD, "ap_shatter_the_sky", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + SHATTER_THE_SKY_P = 139, "Shatter the Sky (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_shatter_the_sky", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + ALL_IN_Z = 140, "All-In (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + ALL_IN_P = 141, "All-In (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAB_RAT_T = 142, "Lab Rat (Terran)", SC2Campaign.HOTS, "Umoja", SC2Race.TERRAN, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + LAB_RAT_P = 143, "Lab Rat (Protoss)", SC2Campaign.HOTS, "Umoja", SC2Race.PROTOSS, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 144/145 - Back in the Saddle + RENDEZVOUS_T = 146, "Rendezvous (Terran)", SC2Campaign.HOTS, "Umoja", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_rendezvous", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + RENDEZVOUS_P = 147, "Rendezvous (Protoss)", SC2Campaign.HOTS, "Umoja", SC2Race.PROTOSS, MissionPools.EASY, "ap_rendezvous", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + HARVEST_OF_SCREAMS_T = 148, "Harvest of Screams (Terran)", SC2Campaign.HOTS, "Kaldir", SC2Race.TERRAN, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + HARVEST_OF_SCREAMS_P = 149, "Harvest of Screams (Protoss)", SC2Campaign.HOTS, "Kaldir", SC2Race.PROTOSS, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SHOOT_THE_MESSENGER_T = 150, "Shoot the Messenger (Terran)", SC2Campaign.HOTS, "Kaldir", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_shoot_the_messenger", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SHOOT_THE_MESSENGER_P = 151, "Shoot the Messenger (Protoss)", SC2Campaign.HOTS, "Kaldir", SC2Race.PROTOSS, MissionPools.EASY, "ap_shoot_the_messenger", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 152/153 - Enemy Within + DOMINATION_T = 154, "Domination (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.EASY, "ap_domination", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + DOMINATION_P = 155, "Domination (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.EASY, "ap_domination", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + FIRE_IN_THE_SKY_T = 156, "Fire in the Sky (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + FIRE_IN_THE_SKY_P = 157, "Fire in the Sky (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + OLD_SOLDIERS_T = 158, "Old Soldiers (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + OLD_SOLDIERS_P = 159, "Old Soldiers (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + WAKING_THE_ANCIENT_T = 160, "Waking the Ancient (Terran)", SC2Campaign.HOTS, "Zerus", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + WAKING_THE_ANCIENT_P = 161, "Waking the Ancient (Protoss)", SC2Campaign.HOTS, "Zerus", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_CRUCIBLE_T = 162, "The Crucible (Terran)", SC2Campaign.HOTS, "Zerus", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_CRUCIBLE_P = 163, "The Crucible (Protoss)", SC2Campaign.HOTS, "Zerus", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + # 164/165 - Supreme + INFESTED_T = 166, "Infested (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_infested", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + INFESTED_P = 167, "Infested (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_infested", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + HAND_OF_DARKNESS_T = 168, "Hand of Darkness (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + HAND_OF_DARKNESS_P = 169, "Hand of Darkness (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + PHANTOMS_OF_THE_VOID_T = 170, "Phantoms of the Void (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + PHANTOMS_OF_THE_VOID_P = 171, "Phantoms of the Void (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 172/173 - With Friends Like These + # 174/175 - Conviction + PLANETFALL_T = 176, "Planetfall (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.HARD, "ap_planetfall", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + PLANETFALL_P = 177, "Planetfall (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.HARD, "ap_planetfall", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + DEATH_FROM_ABOVE_T = 178, "Death From Above (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.HARD, "ap_death_from_above", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + DEATH_FROM_ABOVE_P = 179, "Death From Above (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.HARD, "ap_death_from_above", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_RECKONING_T = 180, "The Reckoning (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + THE_RECKONING_P = 181, "The Reckoning (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + DARK_WHISPERS_T = 182, "Dark Whispers (Terran)", SC2Campaign.PROLOGUE, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_dark_whispers", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.RaceSwap + DARK_WHISPERS_Z = 183, "Dark Whispers (Zerg)", SC2Campaign.PROLOGUE, "_1", SC2Race.ZERG, MissionPools.MEDIUM, "ap_dark_whispers", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.RaceSwap + GHOSTS_IN_THE_FOG_T = 184, "Ghosts in the Fog (Terran)", SC2Campaign.PROLOGUE, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_ghosts_in_the_fog", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + GHOSTS_IN_THE_FOG_Z = 185, "Ghosts in the Fog (Zerg)", SC2Campaign.PROLOGUE, "_2", SC2Race.ZERG, MissionPools.HARD, "ap_ghosts_in_the_fog", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 186/187 - Evil Awoken + # 188/189 - For Aiur! + THE_GROWING_SHADOW_T = 190, "The Growing Shadow (Terran)", SC2Campaign.LOTV, "Aiur", SC2Race.TERRAN, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Terran|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_GROWING_SHADOW_Z = 191, "The Growing Shadow (Zerg)", SC2Campaign.LOTV, "Aiur", SC2Race.ZERG, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Zerg|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_SPEAR_OF_ADUN_T = 192, "The Spear of Adun (Terran)", SC2Campaign.LOTV, "Aiur", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_spear_of_adun", MissionFlag.Terran|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_SPEAR_OF_ADUN_Z = 193, "The Spear of Adun (Zerg)", SC2Campaign.LOTV, "Aiur", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_spear_of_adun", MissionFlag.Zerg|MissionFlag.VsPZ|MissionFlag.RaceSwap + SKY_SHIELD_T = 194, "Sky Shield (Terran)", SC2Campaign.LOTV, "Korhal", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + SKY_SHIELD_Z = 195, "Sky Shield (Zerg)", SC2Campaign.LOTV, "Korhal", SC2Race.ZERG, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + BROTHERS_IN_ARMS_T = 196, "Brothers in Arms (Terran)", SC2Campaign.LOTV, "Korhal", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + BROTHERS_IN_ARMS_Z = 197, "Brothers in Arms (Zerg)", SC2Campaign.LOTV, "Korhal", SC2Race.ZERG, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + AMON_S_REACH_T = 198, "Amon's Reach (Terran)", SC2Campaign.LOTV, "Shakuras", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + AMON_S_REACH_Z = 199, "Amon's Reach (Zerg)", SC2Campaign.LOTV, "Shakuras", SC2Race.ZERG, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAST_STAND_T = 200, "Last Stand (Terran)", SC2Campaign.LOTV, "Shakuras", SC2Race.TERRAN, MissionPools.HARD, "ap_last_stand", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAST_STAND_Z = 201, "Last Stand (Zerg)", SC2Campaign.LOTV, "Shakuras", SC2Race.ZERG, MissionPools.HARD, "ap_last_stand", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + FORBIDDEN_WEAPON_T = 202, "Forbidden Weapon (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_forbidden_weapon", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + FORBIDDEN_WEAPON_Z = 203, "Forbidden Weapon (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_forbidden_weapon", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + TEMPLE_OF_UNIFICATION_T = 204, "Temple of Unification (Terran)", SC2Campaign.LOTV, "Ulnar", SC2Race.TERRAN, MissionPools.HARD, "ap_temple_of_unification", MissionFlag.Terran|MissionFlag.VsTP|MissionFlag.RaceSwap + TEMPLE_OF_UNIFICATION_Z = 205, "Temple of Unification (Zerg)", SC2Campaign.LOTV, "Ulnar", SC2Race.ZERG, MissionPools.HARD, "ap_temple_of_unification", MissionFlag.Zerg|MissionFlag.VsTP|MissionFlag.RaceSwap + # 206/207 - The Infinite Cycle + HARBINGER_OF_OBLIVION_T = 208, "Harbinger of Oblivion (Terran)", SC2Campaign.LOTV, "Ulnar", SC2Race.TERRAN, MissionPools.HARD, "ap_harbinger_of_oblivion", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.RaceSwap + HARBINGER_OF_OBLIVION_Z = 209, "Harbinger of Oblivion (Zerg)", SC2Campaign.LOTV, "Ulnar", SC2Race.ZERG, MissionPools.HARD, "ap_harbinger_of_oblivion", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.RaceSwap + UNSEALING_THE_PAST_T = 210, "Unsealing the Past (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + UNSEALING_THE_PAST_Z = 211, "Unsealing the Past (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + PURIFICATION_T = 212, "Purification (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_purification", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + PURIFICATION_Z = 213, "Purification (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_purification", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + STEPS_OF_THE_RITE_T = 214, "Steps of the Rite (Terran)", SC2Campaign.LOTV, "Tal'darim", SC2Race.TERRAN, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + STEPS_OF_THE_RITE_Z = 215, "Steps of the Rite (Zerg)", SC2Campaign.LOTV, "Tal'darim", SC2Race.ZERG, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + RAK_SHIR_T = 216, "Rak'Shir (Terran)", SC2Campaign.LOTV, "Tal'darim", SC2Race.TERRAN, MissionPools.HARD, "ap_rak_shir", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + RAK_SHIR_Z = 217, "Rak'Shir (Zerg)", SC2Campaign.LOTV, "Tal'darim", SC2Race.ZERG, MissionPools.HARD, "ap_rak_shir", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + TEMPLAR_S_CHARGE_T = 218, "Templar's Charge (Terran)", SC2Campaign.LOTV, "Moebius", SC2Race.TERRAN, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + TEMPLAR_S_CHARGE_Z = 219, "Templar's Charge (Zerg)", SC2Campaign.LOTV, "Moebius", SC2Race.ZERG, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 220/221 - Templar's Return + THE_HOST_T = 222, "The Host (Terran)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Terran|MissionFlag.VsAll|MissionFlag.RaceSwap + THE_HOST_Z = 223, "The Host (Zerg)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Zerg|MissionFlag.VsAll|MissionFlag.RaceSwap + SALVATION_T = 224, "Salvation (Terran)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.RaceSwap + SALVATION_Z = 225, "Salvation (Zerg)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.RaceSwap + # 226/227 - Into the Void + # 228/229 - The Essence of Eternity + # 230/231 - Amon's Fall + # 232/233 - The Escape + # 234/235 - Sudden Strike + # 236/237 - Enemy Intelligence + # 238/239 - Trouble In Paradise + # 240/241 - Night Terrors + # 242/243 - Flashpoint + # 244/245 - In the Enemy's Shadow + # 246/247 - Dark Skies + # 248/249 - End Game + + +class MissionConnection: + campaign: SC2Campaign + connect_to: int # -1 connects to Menu + + def __init__(self, connect_to, campaign = SC2Campaign.GLOBAL): + self.campaign = campaign + self.connect_to = connect_to + + def _asdict(self): + return { + "campaign": self.campaign.id, + "connect_to": self.connect_to + } + + +class MissionInfo(NamedTuple): + mission: SC2Mission + required_world: List[Union[MissionConnection, Dict[Literal["campaign", "connect_to"], int]]] + category: str + number: int = 0 # number of worlds need beaten + completion_critical: bool = False # missions needed to beat game + or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed + ui_vertical_padding: int = 0 # How many blank padding tiles go above this mission in the launcher + + + +lookup_id_to_mission: Dict[int, SC2Mission] = { + mission.id: mission for mission in SC2Mission +} + +lookup_name_to_mission: Dict[str, SC2Mission] = { + mission.mission_name: mission for mission in SC2Mission +} +for mission in SC2Mission: + if MissionFlag.HasRaceSwap in mission.flags and ' (' in mission.mission_name: + # Short names for non-race-swapped missions for client compatibility + short_name = mission.get_short_name() + lookup_name_to_mission[short_name] = mission + +lookup_id_to_campaign: Dict[int, SC2Campaign] = { + campaign.id: campaign for campaign in SC2Campaign +} + + +campaign_mission_table: Dict[SC2Campaign, Set[SC2Mission]] = { + campaign: set() for campaign in SC2Campaign +} +for mission in SC2Mission: + campaign_mission_table[mission.campaign].add(mission) + + +def get_campaign_difficulty(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> MissionPools: + """ + + :param campaign: + :param excluded_missions: + :return: Campaign's the most difficult non-excluded mission + """ + excluded_mission_set = set(excluded_missions) + included_missions = campaign_mission_table[campaign].difference(excluded_mission_set) + return max([mission.pool for mission in included_missions]) + + +def get_campaign_goal_priority(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> SC2CampaignGoalPriority: + """ + Gets a modified campaign goal priority. + If all the campaign's goal missions are excluded, it's ineligible to have the goal + If the campaign's very hard missions are excluded, the priority is lowered to hard + :param campaign: + :param excluded_missions: + :return: + """ + if excluded_missions is None: + return campaign.goal_priority + else: + goal_missions = set(get_campaign_potential_goal_missions(campaign)) + excluded_mission_set = set(excluded_missions) + remaining_goals = goal_missions.difference(excluded_mission_set) + if remaining_goals == set(): + # All potential goals are excluded, the campaign can't be a goal + return SC2CampaignGoalPriority.NONE + elif campaign.goal_priority == SC2CampaignGoalPriority.VERY_HARD: + # Check if a very hard campaign doesn't get rid of it's last very hard mission + difficulty = get_campaign_difficulty(campaign, excluded_missions) + if difficulty == MissionPools.VERY_HARD: + return SC2CampaignGoalPriority.VERY_HARD + else: + return SC2CampaignGoalPriority.HARD + else: + return campaign.goal_priority + + +class SC2CampaignGoal(NamedTuple): + mission: SC2Mission + location: str + + +campaign_final_mission_locations: Dict[SC2Campaign, Optional[SC2CampaignGoal]] = { + SC2Campaign.WOL: SC2CampaignGoal(SC2Mission.ALL_IN, f'{SC2Mission.ALL_IN.mission_name}: Victory'), + SC2Campaign.PROPHECY: SC2CampaignGoal(SC2Mission.IN_UTTER_DARKNESS, f'{SC2Mission.IN_UTTER_DARKNESS.mission_name}: Defeat'), + SC2Campaign.HOTS: SC2CampaignGoal(SC2Mission.THE_RECKONING, f'{SC2Mission.THE_RECKONING.mission_name}: Victory'), + SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, f'{SC2Mission.EVIL_AWOKEN.mission_name}: Victory'), + SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, f'{SC2Mission.SALVATION.mission_name}: Victory'), + SC2Campaign.EPILOGUE: None, + SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, f'{SC2Mission.END_GAME.mission_name}: Victory'), +} + +campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = { + SC2Campaign.WOL: { + SC2Mission.MAW_OF_THE_VOID: f'{SC2Mission.MAW_OF_THE_VOID.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION: f'{SC2Mission.ENGINE_OF_DESTRUCTION.mission_name}: Victory', + SC2Mission.SUPERNOVA: f'{SC2Mission.SUPERNOVA.mission_name}: Victory', + SC2Mission.GATES_OF_HELL: f'{SC2Mission.GATES_OF_HELL.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY: f'{SC2Mission.SHATTER_THE_SKY.mission_name}: Victory', + + SC2Mission.MAW_OF_THE_VOID_Z: f'{SC2Mission.MAW_OF_THE_VOID_Z.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION_Z: f'{SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name}: Victory', + SC2Mission.SUPERNOVA_Z: f'{SC2Mission.SUPERNOVA_Z.mission_name}: Victory', + SC2Mission.GATES_OF_HELL_Z: f'{SC2Mission.GATES_OF_HELL_Z.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY_Z: f'{SC2Mission.SHATTER_THE_SKY_Z.mission_name}: Victory', + + SC2Mission.MAW_OF_THE_VOID_P: f'{SC2Mission.MAW_OF_THE_VOID_P.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION_P: f'{SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name}: Victory', + SC2Mission.SUPERNOVA_P: f'{SC2Mission.SUPERNOVA_P.mission_name}: Victory', + SC2Mission.GATES_OF_HELL_P: f'{SC2Mission.GATES_OF_HELL_P.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY_P: f'{SC2Mission.SHATTER_THE_SKY_P.mission_name}: Victory' + }, + SC2Campaign.PROPHECY: {}, + SC2Campaign.HOTS: { + SC2Mission.THE_CRUCIBLE: f'{SC2Mission.THE_CRUCIBLE.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS: f'{SC2Mission.HAND_OF_DARKNESS.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID: f'{SC2Mission.PHANTOMS_OF_THE_VOID.mission_name}: Victory', + SC2Mission.PLANETFALL: f'{SC2Mission.PLANETFALL.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE: f'{SC2Mission.DEATH_FROM_ABOVE.mission_name}: Victory', + + SC2Mission.THE_CRUCIBLE_T: f'{SC2Mission.THE_CRUCIBLE_T.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS_T: f'{SC2Mission.HAND_OF_DARKNESS_T.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID_T: f'{SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name}: Victory', + SC2Mission.PLANETFALL_T: f'{SC2Mission.PLANETFALL_T.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE_T: f'{SC2Mission.DEATH_FROM_ABOVE_T.mission_name}: Victory', + + SC2Mission.THE_CRUCIBLE_P: f'{SC2Mission.THE_CRUCIBLE_P.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS_P: f'{SC2Mission.HAND_OF_DARKNESS_P.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID_P: f'{SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name}: Victory', + SC2Mission.PLANETFALL_P: f'{SC2Mission.PLANETFALL_P.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE_P: f'{SC2Mission.DEATH_FROM_ABOVE_P.mission_name}: Victory' + }, + SC2Campaign.PROLOGUE: { + SC2Mission.GHOSTS_IN_THE_FOG: f'{SC2Mission.GHOSTS_IN_THE_FOG.mission_name}: Victory', + SC2Mission.GHOSTS_IN_THE_FOG_T: f'{SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name}: Victory', + SC2Mission.GHOSTS_IN_THE_FOG_Z: f'{SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name}: Victory' + }, + SC2Campaign.LOTV: { + SC2Mission.THE_HOST: f'{SC2Mission.THE_HOST.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE: f'{SC2Mission.TEMPLAR_S_CHARGE.mission_name}: Victory', + + SC2Mission.THE_HOST_T: f'{SC2Mission.THE_HOST_T.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE_T: f'{SC2Mission.TEMPLAR_S_CHARGE_T.mission_name}: Victory', + + SC2Mission.THE_HOST_Z: f'{SC2Mission.THE_HOST_Z.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE_Z: f'{SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name}: Victory' + }, + SC2Campaign.EPILOGUE: { + SC2Mission.AMON_S_FALL: f'{SC2Mission.AMON_S_FALL.mission_name}: Victory', + SC2Mission.INTO_THE_VOID: f'{SC2Mission.INTO_THE_VOID.mission_name}: Victory', + SC2Mission.THE_ESSENCE_OF_ETERNITY: f'{SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name}: Victory', + }, + SC2Campaign.NCO: { + SC2Mission.FLASHPOINT: f'{SC2Mission.FLASHPOINT.mission_name}: Victory', + SC2Mission.DARK_SKIES: f'{SC2Mission.DARK_SKIES.mission_name}: Victory', + SC2Mission.NIGHT_TERRORS: f'{SC2Mission.NIGHT_TERRORS.mission_name}: Victory', + SC2Mission.TROUBLE_IN_PARADISE: f'{SC2Mission.TROUBLE_IN_PARADISE.mission_name}: Victory' + } +} + +campaign_race_exceptions: Dict[SC2Mission, SC2Race] = { + SC2Mission.WITH_FRIENDS_LIKE_THESE: SC2Race.TERRAN +} + + +def get_goal_location(mission: SC2Mission) -> Union[str, None]: + """ + + :param mission: + :return: Goal location assigned to the goal mission + """ + campaign = mission.campaign + primary_campaign_goal = campaign_final_mission_locations[campaign] + if primary_campaign_goal is not None: + if primary_campaign_goal.mission == mission: + return primary_campaign_goal.location + + campaign_alt_goals = campaign_alt_final_mission_locations[campaign] + if mission in campaign_alt_goals: + return campaign_alt_goals.get(mission) + + return (mission.mission_name + ": Defeat") \ + if mission in [SC2Mission.IN_UTTER_DARKNESS, SC2Mission.IN_UTTER_DARKNESS_T, SC2Mission.IN_UTTER_DARKNESS_Z] \ + else mission.mission_name + ": Victory" + + +def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]: + """ + + :param campaign: + :return: All missions that can be the campaign's goal + """ + missions: List[SC2Mission] = list() + primary_goal_mission = campaign_final_mission_locations[campaign] + if primary_goal_mission is not None: + missions.append(primary_goal_mission.mission) + alt_goal_locations = campaign_alt_final_mission_locations[campaign] + if alt_goal_locations: + for mission in alt_goal_locations.keys(): + missions.append(mission) + + return missions + + +def get_missions_with_any_flags_in_list(flags: MissionFlag) -> List[SC2Mission]: + return [mission for mission in SC2Mission if flags & mission.flags] diff --git a/worlds/sc2/options.py b/worlds/sc2/options.py new file mode 100644 index 00000000..08be7e18 --- /dev/null +++ b/worlds/sc2/options.py @@ -0,0 +1,1746 @@ +import functools +from dataclasses import fields, Field, dataclass +from typing import * +from datetime import timedelta + +from Options import ( + Choice, Toggle, DefaultOnToggle, OptionSet, Range, + PerGameCommonOptions, Option, VerifyKeys, StartInventory, + is_iterable_except_str, OptionGroup, Visibility, ItemDict +) +from Utils import get_fuzzy_results +from BaseClasses import PlandoOptions +from .item import item_names, item_tables +from .item.item_groups import kerrigan_active_abilities, kerrigan_passives, nova_weapons, nova_gadgets +from .mission_tables import ( + SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_missions_with_any_flags_in_list, + campaign_mission_table, SC2Race, MissionFlag +) +from .mission_groups import mission_groups, MissionGroupNames +from .mission_order.options import CustomMissionOrder + +if TYPE_CHECKING: + from worlds.AutoWorld import World + from . import SC2World + + +class Sc2MissionSet(OptionSet): + """Option set made for handling missions and expanding mission groups""" + valid_keys: Iterable[str] = [x.mission_name for x in SC2Mission] + + @classmethod + def from_any(cls, data: Any): + if is_iterable_except_str(data): + return cls(data) + return cls.from_text(str(data)) + + def verify(self, world: Type['World'], player_name: str, plando_options: PlandoOptions) -> None: + """Overridden version of function from Options.VerifyKeys for a better error message""" + new_value: set[str] = set() + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in mission_groups.items() + } + case_insensitive_group_mapping.update({mission.mission_name.casefold(): [mission.mission_name] for mission in SC2Mission}) + for group_name in self.value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + new_value.update(item_names) + self.value = new_value + for item_name in self.value: + if item_name not in self.valid_keys: + picks = get_fuzzy_results( + item_name, + list(self.valid_keys) + list(MissionGroupNames.get_all_group_names()), + limit=1, + ) + raise Exception(f"Mission {item_name} from option {self} " + f"is not a valid mission name from {world.game}. " + f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)") + + def __iter__(self) -> Iterator[str]: + return self.value.__iter__() + + def __len__(self) -> int: + return self.value.__len__() + + +class SelectRaces(OptionSet): + """ + Pick which factions' missions and items can be shuffled into the world. + """ + display_name = "Select Playable Races" + valid_keys = {race.get_title() for race in SC2Race if race != SC2Race.ANY} + default = valid_keys + + +class GameDifficulty(Choice): + """ + The difficulty of the campaign, affects enemy AI, starting units, and game speed. + + For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level + lower than the vanilla game + """ + display_name = "Game Difficulty" + option_casual = 0 + option_normal = 1 + option_hard = 2 + option_brutal = 3 + default = 1 + + +class DifficultyDamageModifier(DefaultOnToggle): + """ + Enables or disables vanilla difficulty-based damage received modifier + Handles the 1.25 Brutal damage modifier in HotS and Prologue and 0.5 Casual damage modifier outside WoL and Prophecy + """ + display_name = "Difficulty Damage Modifier" + + +class GameSpeed(Choice): + """Optional setting to override difficulty-based game speed.""" + display_name = "Game Speed" + option_default = 0 + option_slower = 1 + option_slow = 2 + option_normal = 3 + option_fast = 4 + option_faster = 5 + default = option_default + + +class DisableForcedCamera(DefaultOnToggle): + """ + Prevents the game from moving or locking the camera without the player's consent. + """ + display_name = "Disable Forced Camera Movement" + + +class SkipCutscenes(Toggle): + """ + Skips all cutscenes and prevents dialog from blocking progress. + """ + display_name = "Skip Cutscenes" + + +class AllInMap(Choice): + """Determines what version of All-In (WoL final map) that will be generated for the campaign.""" + display_name = "All In Map" + option_ground = 0 + option_air = 1 + default = 'random' + + +class MissionOrder(Choice): + """ + Determines the order the missions are played in. The first three mission orders ignore the Maximum Campaign Size option. + Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns. + Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within. + Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches. + Blitz: Missions are divided into sets. Complete one mission from a set to advance to the next set. + Gauntlet: A linear path of missions to complete the campaign. + Grid: Missions are arranged into a grid. Completing a mission unlocks the adjacent missions. Corners may be omitted to make the grid more square. Complete the bottom-right mission to win. + Golden Path: A required line of missions with several optional branches, similar to the Wings of Liberty campaign. + Hopscotch: Missions alternate between mandatory missions and pairs of optional missions. + Custom: Uses the YAML's custom mission order option. See documentation for usage. + """ + display_name = "Mission Order" + option_vanilla = 0 + option_vanilla_shuffled = 1 + option_mini_campaign = 2 + option_blitz = 5 + option_gauntlet = 6 + option_grid = 9 + option_golden_path = 10 + option_hopscotch = 11 + option_custom = 99 + + +class MaximumCampaignSize(Range): + """ + Sets an upper bound on how many missions to include when a variable-size mission order is selected. + If a set-size mission order is selected, does nothing. + """ + display_name = "Maximum Campaign Size" + range_start = 1 + range_end = len(SC2Mission) + default = 83 + + +class TwoStartPositions(Toggle): + """ + If turned on and 'grid', 'hopscotch', or 'golden_path' mission orders are selected, + removes the first mission and allows both of the next two missions to be played from the start. + """ + display_name = "Start with two unlocked missions on grid" + default = Toggle.option_false + + +class KeyMode(Choice): + """ + Optionally creates Key items that must be found in the multiworld to unlock parts of the mission order, + in addition to any regular requirements a mission may have. + + "Questline" options will only work for Vanilla, Vanilla Shuffled, Mini Campaign, and Golden Path mission orders. + + Disabled: Don't create any keys. + Questlines: Create keys for questlines besides the starter ones, eg. "Colonist (Wings of Liberty) Questline Key". + Missions: Create keys for missions besides the starter ones, eg. "Zero Hour Mission Key". + Progressive Questlines: Create one type of progressive key for questlines within each campaign, eg. "Progressive Key #1". + Progressive Missions: Create one type of progressive key for all missions, "Progressive Mission Key". + Progressive Per Questline: All questlines besides the starter ones get a unique progressive key for their missions, eg. "Progressive Key #1". + """ + display_name = "Key Mode" + option_disabled = 0 + option_questlines = 1 + option_missions = 2 + option_progressive_questlines = 3 + option_progressive_missions = 4 + option_progressive_per_questline = 5 + default = option_disabled + + +class ColorChoice(Choice): + option_white = 0 + option_red = 1 + option_blue = 2 + option_teal = 3 + option_purple = 4 + option_yellow = 5 + option_orange = 6 + option_green = 7 + option_light_pink = 8 + option_violet = 9 + option_light_grey = 10 + option_dark_green = 11 + option_brown = 12 + option_light_green = 13 + option_dark_grey = 14 + option_pink = 15 + option_rainbow = 16 + option_mengsk = 17 + option_bright_lime = 18 + option_arcane = 19 + option_ember = 20 + option_hot_pink = 21 + option_default = 22 + default = option_default + + +class PlayerColorTerranRaynor(ColorChoice): + """Determines in-game player team color in Wings of Liberty missions.""" + display_name = "Terran Player Color (Raynor)" + + +class PlayerColorProtoss(ColorChoice): + """Determines in-game player team color in Legacy of the Void missions.""" + display_name = "Protoss Player Color" + + +class PlayerColorZerg(ColorChoice): + """Determines in-game player team color in Heart of the Swarm missions before unlocking Primal Kerrigan.""" + display_name = "Zerg Player Color" + + +class PlayerColorZergPrimal(ColorChoice): + """Determines in-game player team color in Heart of the Swarm after unlocking Primal Kerrigan.""" + display_name = "Zerg Player Color (Primal)" + + +class PlayerColorNova(ColorChoice): + """Determines in-game player team color in Nova Covert Ops missions.""" + display_name = "Terran Player Color (Nova)" + + +class EnabledCampaigns(OptionSet): + """Determines which campaign's missions will be used""" + display_name = "Enabled Campaigns" + valid_keys = {campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL} + default = valid_keys + + +class EnableRaceSwapVariants(Choice): + """ + Allow mission variants where you play a faction other than the one the map was initially + designed for. NOTE: Cutscenes are always skipped on race-swapped mission variants. + + Disabled: Don't shuffle any non-vanilla map variants into the pool. + Pick One: Shuffle up to 1 valid version of each map into the pool, depending on other settings. + Pick One Non-Vanilla: Shuffle up to 1 valid version other than the original one of each map into the pool, depending on other settings. + Shuffle All: Each version of a map can appear in the same pool (so a map can appear up to 3 times as different races) + Shuffle All Non-Vanilla: Each version of a map besides the original can appear in the same pool (so a map can appear up to 2 times as different races) + """ + display_name = "Enable Race-Swapped Mission Variants" + option_disabled = 0 + option_pick_one = 1 + option_pick_one_non_vanilla = 2 + option_shuffle_all = 3 + option_shuffle_all_non_vanilla = 4 + default = option_disabled + + +class EnableMissionRaceBalancing(Choice): + """ + If enabled, picks missions in such a way that the appearance rate of races is roughly equal. + The final rates may deviate if there are not enough missions enabled to accommodate each race. + + Disabled: Pick missions at random. + Semi Balanced: Use a weighting system to pick missions in a random, but roughly equal ratio. + Fully Balanced: Pick missions to preserve equal race counts whenever possible. + """ + display_name = "Enable Mission Race Balancing" + option_disabled = 0 + option_semi_balanced = 1 + option_fully_balanced = 2 + default = option_semi_balanced + + +class ShuffleCampaigns(DefaultOnToggle): + """ + Shuffles the missions between campaigns if enabled. + Only available for Vanilla Shuffled and Mini Campaign mission order + """ + display_name = "Shuffle Campaigns" + + +class ShuffleNoBuild(DefaultOnToggle): + """ + Determines if the no-build missions are included in the shuffle. + If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order. + """ + display_name = "Shuffle No-Build Missions" + + +class StarterUnit(Choice): + """ + Unlocks a random unit at the start of the game. + + Off: No units are provided, the first unit must be obtained from the randomizer + Balanced: A unit that doesn't give the player too much power early on is given + Any Starter Unit: Any starter unit can be given + """ + display_name = "Starter Unit" + option_off = 0 + option_balanced = 1 + option_any_starter_unit = 2 + + +class RequiredTactics(Choice): + """ + Determines the maximum tactical difficulty of the world (separate from mission difficulty). + Higher settings increase randomness. + + Standard: All missions can be completed with good micro and macro. + Advanced: Completing missions may require relying on starting units and micro-heavy units. + Any Units: Logic guarantees faction-appropriate units appear early without regard to what those units are. + i.e. if the third mission is a protoss build mission, + logic guarantees at least 2 protoss units are reachable before starting it. + May render the run impossible on harder difficulties. + No Logic: Units and upgrades may be placed anywhere. LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES! + Locks Grant Story Tech option to true. + """ + display_name = "Required Tactics" + option_standard = 0 + option_advanced = 1 + option_any_units = 2 + option_no_logic = 3 + + +class EnableVoidTrade(Toggle): + """ + Enables the Void Trade Wormhole to be built from the Advanced Construction tab of SCVs, Drones and Probes. + This structure allows sending units to the Archipelago server, as well as buying random units from the server. + + Note: Always disabled if there is no other Starcraft II world with Void Trade enabled in the multiworld. You cannot receive units that you send. + """ + display_name = "Enable Void Trade" + + +class VoidTradeAgeLimit(Choice): + """ + Determines the maximum allowed age for units you can receive from Void Trade. + Units that are older than your choice will still be available to other players, but not to you. + + This does not put a time limit on units you send to other players. Your own units are only affected by other players' choices for this option. + """ + display_name = "Void Trade Age Limit" + option_disabled = 0 + option_1_week = 1 + option_1_day = 2 + option_4_hours = 3 + option_2_hours = 4 + option_1_hour = 5 + option_30_minutes = 6 + option_5_minutes = 7 + default = option_30_minutes + + +class VoidTradeWorkers(Toggle): + """ + If enabled, you are able to send and receive workers via Void Trade. + + Sending workers is a cheap way to get a lot of units from other players, + at the cost of reducing the strength of received units for other players. + + Receiving workers allows you to build units of other races, but potentially skips large parts of your multiworld progression. + """ + display_name = "Allow Workers in Void Trade" + + +class MaxUpgradeLevel(Range): + """Controls the maximum number of weapon/armor upgrades that can be found or unlocked.""" + display_name = "Maximum Upgrade Level" + range_start = 3 + range_end = 5 + default = 3 + + +class GenericUpgradeMissions(Range): + """ + Determines the percentage of missions in the mission order that must be completed before + level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions, + and level 3 requires triple the amount. The required amounts are always rounded down. + If set to 0, upgrades are instead added to the item pool and must be found to be used. + + If the mission order is unable to be beaten by this value (if above 0), the generator will place additional + weapon / armor upgrades into start inventory + """ + display_name = "Generic Upgrade Missions" + range_start = 0 + range_end = 100 # Higher values lead to fails often + default = 0 + + +class GenericUpgradeResearch(Choice): + """Determines how weapon and armor upgrades affect missions once unlocked. + + Vanilla: Upgrades must be researched as normal. + Auto In No-Build: In No-Build missions, upgrades are automatically researched. + In all other missions, upgrades must be researched as normal. + Auto In Build: In No-Build missions, upgrades are unavailable as normal. + In all other missions, upgrades are automatically researched. + Always Auto: Upgrades are automatically researched in all missions.""" + display_name = "Generic Upgrade Research" + option_vanilla = 0 + option_auto_in_no_build = 1 + option_auto_in_build = 2 + option_always_auto = 3 + + +class GenericUpgradeResearchSpeedup(Toggle): + """ + If turned on, the weapon and armor upgrades are researched more quickly if level 4 or higher is unlocked. + The research times of upgrades are cut proportionally, so you're able to hit the maximum available level + at the same time, as you'd hit level 3 normally. + + Turning this on will help you to be able to research level 4 or 5 upgrade levels in timed missions. + + Has no effect if Maximum Upgrade Level is set to 3 + or Generic Upgrade Research doesn't require you to research upgrades in build missions. + """ + display_name = "Generic Upgrade Research Speedup" + + +class GenericUpgradeItems(Choice): + """Determines how weapon and armor upgrades are split into items. + + All options produce a number of levels of each item equal to the Maximum Upgrade Level. + The examples below consider a Maximum Upgrade Level of 3. + + Does nothing if upgrades are unlocked by completed mission counts. + + Individual Items: All weapon and armor upgrades are each an item, + resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each. + Bundle Weapon And Armor: All types of weapon upgrades are one item per race, + and all types of armor upgrades are one item per race, + resulting in 18 total items. + Bundle Unit Class: Weapon and armor upgrades are merged, + but upgrades are bundled separately for each race: + Infantry, Vehicle, and Starship upgrades for Terran (9 items), + Ground and Flyer upgrades for Zerg (6 items), + Ground and Air upgrades for Protoss (6 items), + resulting in 21 total items. + Bundle All: All weapon and armor upgrades are one item per race, + resulting in 9 total items.""" + display_name = "Generic Upgrade Items" + option_individual_items = 0 + option_bundle_weapon_and_armor = 1 + option_bundle_unit_class = 2 + option_bundle_all = 3 + + +class VanillaItemsOnly(Toggle): + """If turned on, the item pool is limited only to items that appear in the main 3 vanilla campaigns. + Weapon/Armor upgrades are unaffected; use max_upgrade_level to control maximum level. + Locked Items may override these exclusions.""" + display_name = "Vanilla Items Only" + + +class ExcludeOverpoweredItems(Toggle): + """ + If turned on, a curated list of very strong items are excluded. + These items were selected for promoting repetitive strategies, or for providing a lot of power in a boring way. + Recommended off for players looking for a challenge or for repeat playthroughs. + Excluding an OP item overrides the exclusion from this item rather than add to it. + OP items may be unexcluded or locked with Unexcluded Items or Locked Items options. + Enabling this can force a unit nerf even if Allow Unit Nerfs is set to false for some units. + """ + display_name = "Exclude Overpowered Items" + + +# Current maximum number of upgrades for a unit +MAX_UPGRADES_OPTION = 13 + + +class EnsureGenericItems(Range): + """ + Specifies a minimum percentage of the generic item pool that will be present for the slot. + The generic item pool is the pool of all generically useful items after all exclusions. + Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades, + Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities + Increasing this percentage will make units less common. + """ + display_name = "Ensure Generic Items" + range_start = 0 + range_end = 100 + default = 25 + + +class MinNumberOfUpgrades(Range): + """ + Set a minimum to the number of upgrade items a unit/structure can have. + Note that most units have 4 to 6 upgrades. + If a unit has fewer upgrades than the minimum, it will have all of its upgrades. + + Doesn't affect shared unit upgrades. + """ + display_name = "Minimum number of upgrades per unit/structure" + range_start = 0 + range_end = MAX_UPGRADES_OPTION + default = 2 + + +class MaxNumberOfUpgrades(Range): + """ + Set a maximum to the number of upgrade items a unit/structure can have. + -1 is used to define unlimited. + Note that most units have 4 to 6 upgrades. + + Doesn't affect shared unit upgrades. + """ + display_name = "Maximum number of upgrades per unit/structure" + range_start = -1 + range_end = MAX_UPGRADES_OPTION + default = -1 + + +class MercenaryHighlanders(DefaultOnToggle): + """ + If enabled, it limits the controllable amount of certain mercenaries to 1, even if you have unlimited mercenaries upgrade. + With this upgrade you can still call the mercenary again if it dies. + + Affected mercenaries: Jackson's Revenge (Battlecruiser), Wise Old Torrasque (Ultralisk) + """ + display_name = "Mercenary Highlanders" + + +class KerriganPresence(Choice): + """ + Determines whether Kerrigan is playable outside of missions that require her. + + Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game. + Not Present: Kerrigan is not playable, unless the mission requires her to be present. Other hero units stay playable, + and locations normally requiring Kerrigan can be checked by any unit. + Kerrigan level items, active abilities and passive abilities affecting her will not appear. + In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true + + Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled. + """ + display_name = "Kerrigan Presence" + option_vanilla = 0 + option_not_present = 1 + + +class KerriganLevelsPerMissionCompleted(Range): + """ + Determines how many levels Kerrigan gains when a mission is beaten. + """ + display_name = "Levels Per Mission Beaten" + range_start = 0 + range_end = 20 + default = 0 + + +class KerriganLevelsPerMissionCompletedCap(Range): + """ + Limits how many total levels Kerrigan can gain from beating missions. This does not affect levels gained from items. + Set to -1 to disable this limit. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Levels Per Mission Beaten Cap" + range_start = -1 + range_end = 140 + default = -1 + + +class KerriganLevelItemSum(Range): + """ + Determines the sum of the level items in the world. This does not affect levels gained from beating missions. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Kerrigan Level Item Sum" + range_start = 0 + range_end = 140 + default = 70 + + +class KerriganLevelItemDistribution(Choice): + """Determines the amount and size of Kerrigan level items. + + Vanilla: Uses the distribution in the vanilla campaign. + This entails 32 individual levels and 6 packs of varying sizes. + This distribution always adds up to 70, ignoring the Level Item Sum setting. + Smooth: Uses a custom, condensed distribution of 10 items between sizes 4 and 10, + intended to fit more levels into settings with little room for filler while keeping some variance in level gains. + This distribution always adds up to 70, ignoring the Level Item Sum setting. + Size 70: Uses items worth 70 levels each. + Size 35: Uses items worth 35 levels each. + Size 14: Uses items worth 14 levels each. + Size 10: Uses items worth 10 levels each. + Size 7: Uses items worth 7 levels each. + Size 5: Uses items worth 5 levels each. + Size 2: Uses items worth 2 level eachs. + Size 1: Uses individual levels. As there are not enough locations in the game for this distribution, + this will result in a greatly reduced total level, and is likely to remove many other items.""" + display_name = "Kerrigan Level Item Distribution" + option_vanilla = 0 + option_smooth = 1 + option_size_70 = 2 + option_size_35 = 3 + option_size_14 = 4 + option_size_10 = 5 + option_size_7 = 6 + option_size_5 = 7 + option_size_2 = 8 + option_size_1 = 9 + default = option_smooth + + +class KerriganTotalLevelCap(Range): + """ + Limits how many total levels Kerrigan can gain from any source. + Depending on your other settings, there may be more levels available in the world, + but they will not affect Kerrigan. + Set to -1 to disable this limit. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Total Level Cap" + range_start = -1 + range_end = 140 + default = -1 + + +class StartPrimaryAbilities(Range): + """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with. + If set to 4, a Tier 7 ability is also included.""" + display_name = "Starting Primary Abilities" + range_start = 0 + range_end = 4 + default = 0 + + +class KerriganPrimalStatus(Choice): + """Determines when Kerrigan appears in her Primal Zerg form. + This greatly increases her energy regeneration. + + Vanilla: Kerrigan is human in missions that canonically appear before The Crucible, + and zerg thereafter. + Always Zerg: Kerrigan is always zerg. + Always Human: Kerrigan is always human. + Level 35: Kerrigan is human until reaching level 35, and zerg thereafter. + Half Completion: Kerrigan is human until half of the missions in the world are completed, + and zerg thereafter. + Item: Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter.""" + display_name = "Kerrigan Primal Status" + option_vanilla = 0 + option_always_zerg = 1 + option_always_human = 2 + option_level_35 = 3 + option_half_completion = 4 + option_item = 5 + + +class KerriganMaxActiveAbilities(Range): + """ + Determines the maximum number of Kerrigan active abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + """ + display_name = "Kerrigan Maximum Active Abilities" + range_start = 0 + range_end = len(kerrigan_active_abilities) + default = range_end + + +class KerriganMaxPassiveAbilities(Range): + """ + Determines the maximum number of Kerrigan passive abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + """ + display_name = "Kerrigan Maximum Passive Abilities" + range_start = 0 + range_end = len(kerrigan_passives) + default = range_end + + +class EnableMorphling(Toggle): + """ + Determines whether the player can build Morphlings, which allow for inefficient morphing of advanced units + like Ravagers and Lurkers without requiring the base unit to be unlocked first. + """ + display_name = "Enable Morphling" + + +class WarCouncilNerfs(Toggle): + """ + Controls whether most Protoss units can initially be found in a nerfed state, with upgrades restoring their stronger power level. + For example, nerfed Zealots will lack the whirlwind upgrade until it is found as an item. + """ + display_name = "Allow Unit Nerfs" + + +class SpearOfAdunPresence(Choice): + """ + Determines in which missions Spear of Adun calldowns will be available. + Affects only abilities used from Spear of Adun top menu. + + Not Present: Spear of Adun calldowns are unavailable. + Vanilla: Spear of Adun calldowns are only available where they appear in the basegame (Protoss missions after The Growing Shadow) + Protoss: Spear of Adun calldowns are available in any Protoss mission + Everywhere: Spear of Adun calldowns are available in any mission of any race + Any Race LotV: Spear of Adun calldowns are available in any race-swapped variant of a LotV mission + """ + display_name = "Spear of Adun Presence" + option_not_present = 0 + option_vanilla = 4 + option_protoss = 2 + option_everywhere = 3 + option_any_race_lotv = 1 + default = option_vanilla + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == SpearOfAdunPresence.option_any_race_lotv: + return "Any Race LotV" + else: + return super().get_option_name(value) + + +class SpearOfAdunPresentInNoBuild(Toggle): + """ + Determines if Spear of Adun calldowns are available in no-build missions. + + If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence". + If turned off, Spear of Adun calldown powers are unavailable in all no-build missions + """ + display_name = "Spear of Adun Present in No-Build" + + +class SpearOfAdunPassiveAbilityPresence(Choice): + """ + Determines availability of Spear of Adun passive powers. + Affects abilities like Reconstruction Beam or Overwatch. + Does not affect building abilities like Orbital Assimilators or Warp Harmonization. + + Not Present: Autocasts are not available. + Vanilla: Spear of Adun calldowns are only available where it appears in the basegame (Protoss missions after The Growing Shadow) + Protoss: Spear of Adun autocasts are available in any Protoss mission + Everywhere: Spear of Adun autocasts are available in any mission of any race + Any Race LotV: Spear of Adun autocasts are available in any race-swapped variant of a LotV mission + """ + display_name = "Spear of Adun Passive Ability Presence" + option_not_present = 0 + option_any_race_lotv = 1 + option_protoss = 2 + option_everywhere = 3 + option_vanilla = 4 + default = option_vanilla + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == SpearOfAdunPresence.option_any_race_lotv: + return "Any Race LotV" + else: + return super().get_option_name(value) + + +class SpearOfAdunPassivesPresentInNoBuild(Toggle): + """ + Determines if Spear of Adun autocasts are available in no-build missions. + + If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Passive Ability Presence". + If turned off, Spear of Adun autocasts are unavailable in all no-build missions + """ + display_name = "Spear of Adun Passive Abilities Present in No-Build" + + +class SpearOfAdunMaxActiveAbilities(Range): + """ + Determines the maximum number of Spear of Adun active abilities (top bar) that can be present in the game + Additional abilities may spawn if those are required to beat the game. + + Note: Warp in Reinforcements is treated as a second level of Warp in Pylon + """ + display_name = "Spear of Adun Maximum Active Abilities" + range_start = 0 + range_end = sum([item.quantity for item_name, item in item_tables.get_full_item_list().items() if item_name in item_tables.spear_of_adun_calldowns]) + default = range_end + + +class SpearOfAdunMaxAutocastAbilities(Range): + """ + Determines the maximum number of Spear of Adun passive abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + Does not affect building abilities like Orbital Assimilators or Warp Harmonization. + """ + display_name = "Spear of Adun Maximum Passive Abilities" + range_start = 0 + range_end = sum(item.quantity for item_name, item in item_tables.get_full_item_list().items() if item_name in item_tables.spear_of_adun_castable_passives) + default = range_end + + +class GrantStoryTech(Choice): + """ + Controls handling of no-build missions that may require very specific items, such as Kerrigan or Nova abilities. + + no_grant: don't grant anything special; the player must find items to play the missions + grant: grant a minimal inventory that will allow the player to beat the mission, in addition to other items found + allow_substitutes: Reworks the most constrained mission - Supreme - to allow other items to substitute for Leaping Strike and Mend + + Locked to "grant" if Required Tactics is set to no logic. + """ + display_name = "Grant Story Tech" + option_no_grant = 0 + option_grant = 1 + option_allow_substitutes = 2 + + +class GrantStoryLevels(Choice): + """ + If enabled, grants Kerrigan the required minimum levels for the following missions: + Supreme: 35 + The Infinite Cycle: 70 + The bonus levels only apply during the listed missions, and can exceed the Total Level Cap. + + If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail. + To prevent this, either increase the amount of levels in the world, or enable this option. + + If disabled and Required Tactics is set to no logic, this option is forced to Minimum. + + Disabled: Kerrigan does not get bonus levels for these missions, + instead the levels must be gained from items or beating missions. + Additive: Kerrigan gains bonus levels equal to the mission's required level. + Minimum: Kerrigan is either at her real level, or at the mission's required level, + depending on which is higher. + """ + display_name = "Grant Story Levels" + option_disabled = 0 + option_additive = 1 + option_minimum = 2 + default = option_minimum + + +class NovaMaxWeapons(Range): + """ + Determines maximum number of Nova weapons that can be present in the game + Additional weapons may spawn if those are required to beat the game. + + Note: Nova can swap between unlocked weapons anytime during the gameplay. + """ + display_name = "Nova Maximum Weapons" + range_start = 0 + range_end = len(nova_weapons) + default = range_end + + +class NovaMaxGadgets(Range): + """ + Determines maximum number of Nova gadgets that can be present in the game. + Gadgets are a vanilla category including 2 grenade abilities, Stim, Holo Decoy, and Ionic Force Field. + Additional gadgets may spawn if those are required to beat the game. + + Note: Nova can use any unlocked ability anytime during gameplay. + """ + display_name = "Nova Maximum Gadgets" + range_start = 0 + range_end = len(nova_gadgets) + default = range_end + + +class NovaGhostOfAChanceVariant(Choice): + """ + Determines which variant of Nova should be used in Ghost of a Chance mission. + + WoL: Uses Nova from Wings of Liberty campaign (vanilla) + NCO: Uses Nova from Nova Covert Ops campaign + Auto: Uses NCO if a mission from Nova Covert Ops is actually shuffled, if not uses WoL + """ + display_name = "Nova Ghost of Chance Variant" + option_wol = 0 + option_nco = 1 + option_auto = 2 + default = option_wol + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == NovaGhostOfAChanceVariant.option_wol: + return "WoL" + elif value == NovaGhostOfAChanceVariant.option_nco: + return "NCO" + return super().get_option_name(value) + + +class TakeOverAIAllies(Toggle): + """ + On maps supporting this feature allows you to take control over an AI Ally. + """ + display_name = "Take Over AI Allies" + + +class Sc2ItemDict(Option[Dict[str, int]], VerifyKeys, Mapping[str, int]): + """A branch of ItemDict that supports item counts of 0""" + default = {} + supports_weighting = False + verify_item_name = True + # convert_name_groups = True + display_name = 'Unnamed dictionary' + minimum_value: int = 0 + + def __init__(self, value: Dict[str, int]): + self.value = {key: val for key, val in value.items()} + + @classmethod + def from_any(cls, data: Union[List[str], Dict[str, int]]) -> 'Sc2ItemDict': + if isinstance(data, list): + # This is a little default that gets us backwards compatibility with lists. + # It doesn't play nice with trigger merging dicts and lists together, though, so best not to advertise it overmuch. + data = {item: 0 for item in data} + if isinstance(data, dict): + for key, value in data.items(): + if not isinstance(value, int): + raise ValueError(f"Invalid type in '{cls.display_name}': element '{key}' maps to '{value}', expected an integer") + if value < cls.minimum_value: + raise ValueError(f"Invalid value for '{cls.display_name}': element '{key}' maps to {value}, which is less than the minimum ({cls.minimum_value})") + return cls(data) + else: + raise NotImplementedError(f"Cannot Convert from non-dictionary, got {type(data)}") + + def verify(self, world: Type['World'], player_name: str, plando_options: PlandoOptions) -> None: + """Overridden version of function from Options.VerifyKeys for a better error message""" + new_value: dict[str, int] = {} + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in world.item_name_groups.items() + } + case_insensitive_group_mapping.update({item.casefold(): {item} for item in world.item_names}) + for group_name in self.value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + for item_name in item_names: + new_value[item_name] = new_value.get(item_name, 0) + self.value[group_name] + self.value = new_value + for item_name in self.value: + if item_name not in world.item_names: + from .item import item_groups + picks = get_fuzzy_results( + item_name, + list(world.item_names) + list(item_groups.ItemGroupNames.get_all_group_names()), + limit=1, + ) + raise Exception(f"Item {item_name} from option {self} " + f"is not a valid item name from {world.game}. " + f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)") + + def get_option_name(self, value): + return ", ".join(f"{key}: {v}" for key, v in value.items()) + + def __getitem__(self, item: str) -> int: + return self.value.__getitem__(item) + + def __iter__(self) -> Iterator[str]: + return self.value.__iter__() + + def __len__(self) -> int: + return self.value.__len__() + + +class Sc2StartInventory(Sc2ItemDict): + """Start with these items.""" + display_name = StartInventory.display_name + + +class LockedItems(Sc2ItemDict): + """Guarantees that these items will be unlockable, in the amount specified. + Specify an amount of 0 to lock all copies of an item.""" + display_name = "Locked Items" + + +class ExcludedItems(Sc2ItemDict): + """Guarantees that these items will not be unlockable, in the amount specified. + Specify an amount of 0 to exclude all copies of an item.""" + display_name = "Excluded Items" + + +class UnexcludedItems(Sc2ItemDict): + """Undoes an item exclusion; useful for whitelisting or fine-tuning a category. + Specify an amount of 0 to unexclude all copies of an item.""" + display_name = "Unexcluded Items" + + +class ExcludedMissions(Sc2MissionSet): + """Guarantees that these missions will not appear in the campaign + Doesn't apply to vanilla mission order. + It may be impossible to build a valid campaign if too many missions are excluded.""" + display_name = "Excluded Missions" + valid_keys = {mission.mission_name for mission in SC2Mission} + + +class DifficultyCurve(Choice): + """ + Determines whether campaign missions will be placed with a smooth difficulty curve. + Standard: The campaign will start with easy missions and end with challenging missions. Short campaigns will be more difficult. + Uneven: The campaign will start with easy missions, but easy missions can still appear later in the campaign. Short campaigns will be easier. + """ + display_name = "Difficulty Curve" + option_standard = 0 + option_uneven = 1 + + +class ExcludeVeryHardMissions(Choice): + """ + Excludes Very Hard missions outside of Epilogue campaign (All-In, The Reckoning, Salvation, and all Epilogue missions are considered Very Hard). + Doesn't apply to "Vanilla" mission order. + + Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20, + excluded for any other order + Yes: Non-Epilogue Very Hard missions are excluded and won't be generated + No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders. + + See also: Excluded Missions, Enabled Campaigns, Maximum Campaign Size + """ + display_name = "Exclude Very Hard Missions" + option_default = 0 + option_true = 1 + option_false = 2 + + @classmethod + def get_option_name(cls, value): + return ["Default", "Yes", "No"][int(value)] + + +class VictoryCache(Range): + """ + Controls how many additional checks are awarded for completing a mission. + Goal missions are unaffected by this option. + """ + display_name = "Victory Checks" + range_start = 0 + range_end = 10 + default = 0 + + +class LocationInclusion(Choice): + option_enabled = 0 + option_half_chance = 3 + option_filler = 1 + option_disabled = 2 + + +class VanillaLocations(LocationInclusion): + """ + Enables or disables checks for completing vanilla objectives. + Vanilla objectives are bonus objectives from the vanilla game, + along with some additional objectives to balance the missions. + Enable these locations for a balanced experience. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Vanilla Locations" + + +class ExtraLocations(LocationInclusion): + """ + Enables or disables checks for mission progress and minor objectives. + This includes mandatory mission objectives, + collecting reinforcements and resource pickups, + destroying structures, and overcoming minor challenges. + Enables these locations to add more checks and items to your world. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Extra Locations" + + +class ChallengeLocations(LocationInclusion): + """ + Enables or disables checks for completing challenge tasks. + Challenges are tasks that are more difficult than completing the mission, and are often based on achievements. + You might be required to visit the same mission later after getting stronger in order to finish these tasks. + Enable these locations to increase the difficulty of completing the multiworld. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Challenge Locations" + + +class MasteryLocations(LocationInclusion): + """ + Enables or disables checks for overcoming especially difficult challenges. + These challenges are often based on Mastery achievements and Feats of Strength. + Enable these locations to add the most difficult checks to the world. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Mastery Locations" + + +class BasebustLocations(LocationInclusion): + """ + Enables or disables checks for killing non-objective bases. + These challenges are about destroying enemy bases that you normally don't have to fight to win a mission. + Enable these locations if you like sieges or being rewarded for achieving alternate win conditions. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and basebust will have a 25% of a challenge-basebust location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Base-Bust Locations" + + +class SpeedrunLocations(LocationInclusion): + """ + Enables or disables checks for overcoming speedrun challenges. + These challenges are often based on speed achievements or community challenges. + Enable these locations if you want to be rewarded for going fast. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and speedrun will have a 25% of a challenge-speedrun location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Speedrun Locations" + + +class PreventativeLocations(LocationInclusion): + """ + Enables or disables checks for overcoming preventative challenges. + These challenges are about winning or achieving something while preventing something else from happening, + such as beating Evacuation without losing a colonist. + Enable these locations if you want to be rewarded for achieving a higher standard on some locations. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and preventative will have a 25% of a challenge-preventative location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Preventative Locations" + + +class MissionOrderScouting(Choice): + """ + Allow the Sc2 mission order client tabs to indicate the type of item (i.e., progression, useful, etc.) available at each location of a mission. + The option defines when this information will be available for the player. + By default, this option is deactivated. + + None: Never provide information + Completed: Only for missions that were completed + Available: Only for missions that are available to play + Layout: Only for missions that are in an accessible layout (e.g. Char, Mar Sara, etc.) + Campaign: Only for missions that are in an accessible campaign (e.g. WoL, HotS, etc.) + All: All missions + """ + display_name = "Mission Order Scouting" + option_none = 0 + option_completed = 1 + option_available = 2 + option_layout = 3 + option_campaign = 4 + option_all = 5 + + default = option_none + + +class FillerPercentage(Range): + """ + Percentage of the item pool filled with filler items. + If the world has more locations than items, additional filler items may be generated. + """ + display_name = "Filler Percentage" + range_start = 0 + range_end = 70 + default = 0 + + +class MineralsPerItem(Range): + """ + Configures how many minerals are given per resource item. + """ + display_name = "Minerals Per Item" + range_start = 0 + range_end = 200 + default = 25 + + +class VespenePerItem(Range): + """ + Configures how much vespene gas is given per resource item. + """ + display_name = "Vespene Per Item" + range_start = 0 + range_end = 200 + default = 25 + + +class StartingSupplyPerItem(Range): + """ + Configures how much starting supply per is given per item. + """ + display_name = "Starting Supply Per Item" + range_start = 0 + range_end = 16 + default = 2 + + +class MaximumSupplyPerItem(Range): + """ + Configures how much the maximum supply limit increases per item. + """ + display_name = "Maximum Supply Per Item" + range_start = 0 + range_end = 10 + default = 1 + + +class MaximumSupplyReductionPerItem(Range): + """ + Configures how much maximum supply is reduced per trap item. + """ + display_name = "Maximum Supply Reduction Per Item" + range_start = 1 + range_end = 10 + default = 1 + + +class LowestMaximumSupply(Range): + """Controls how far max supply reduction traps can reduce maximum supply.""" + display_name = "Lowest Maximum Supply" + range_start = 100 + range_end = 200 + default = 180 + +class ResearchCostReductionPerItem(Range): + """ + Controls how much weapon/armor research cost is cut per research cost filler item. + Affects both minerals and vespene. + """ + display_name = "Upgrade Cost Discount Per Item" + range_start = 0 + range_end = 10 + default = 2 + + +class FillerItemsDistribution(ItemDict): + """ + Controls the relative probability of each filler item being generated over others. + Items that are bound to specific race or option are automatically eliminated. + Kerrigan levels generated this way don't go against Kerrigan level item sum + """ + default = { + item_names.STARTING_MINERALS: 1, + item_names.STARTING_VESPENE: 1, + item_names.STARTING_SUPPLY: 1, + item_names.MAX_SUPPLY: 1, + item_names.SHIELD_REGENERATION: 1, + item_names.BUILDING_CONSTRUCTION_SPEED: 1, + item_names.KERRIGAN_LEVELS_1: 0, + item_names.UPGRADE_RESEARCH_SPEED: 1, + item_names.UPGRADE_RESEARCH_COST: 1, + item_names.REDUCED_MAX_SUPPLY: 0, + } + valid_keys = default.keys() + display_name = "Filler Items Distribution" + + def __init__(self, value: Dict[str, int]): + # Allow zeros that the parent class doesn't allow + if any(item_count < 0 for item_count in value.values()): + raise Exception("Cannot have negative item weight.") + super(ItemDict, self).__init__(value) + + +@dataclass +class Starcraft2Options(PerGameCommonOptions): + start_inventory: Sc2StartInventory # type: ignore + game_difficulty: GameDifficulty + difficulty_damage_modifier: DifficultyDamageModifier + game_speed: GameSpeed + disable_forced_camera: DisableForcedCamera + skip_cutscenes: SkipCutscenes + all_in_map: AllInMap + mission_order: MissionOrder + maximum_campaign_size: MaximumCampaignSize + two_start_positions: TwoStartPositions + key_mode: KeyMode + player_color_terran_raynor: PlayerColorTerranRaynor + player_color_protoss: PlayerColorProtoss + player_color_zerg: PlayerColorZerg + player_color_zerg_primal: PlayerColorZergPrimal + player_color_nova: PlayerColorNova + selected_races: SelectRaces + enabled_campaigns: EnabledCampaigns + enable_race_swap: EnableRaceSwapVariants + mission_race_balancing: EnableMissionRaceBalancing + shuffle_campaigns: ShuffleCampaigns + shuffle_no_build: ShuffleNoBuild + starter_unit: StarterUnit + required_tactics: RequiredTactics + enable_void_trade: EnableVoidTrade + void_trade_age_limit: VoidTradeAgeLimit + void_trade_workers: VoidTradeWorkers + ensure_generic_items: EnsureGenericItems + min_number_of_upgrades: MinNumberOfUpgrades + max_number_of_upgrades: MaxNumberOfUpgrades + mercenary_highlanders: MercenaryHighlanders + max_upgrade_level: MaxUpgradeLevel + generic_upgrade_missions: GenericUpgradeMissions + generic_upgrade_research: GenericUpgradeResearch + generic_upgrade_research_speedup: GenericUpgradeResearchSpeedup + generic_upgrade_items: GenericUpgradeItems + kerrigan_presence: KerriganPresence + kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted + kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap + kerrigan_level_item_sum: KerriganLevelItemSum + kerrigan_level_item_distribution: KerriganLevelItemDistribution + kerrigan_total_level_cap: KerriganTotalLevelCap + start_primary_abilities: StartPrimaryAbilities + kerrigan_primal_status: KerriganPrimalStatus + kerrigan_max_active_abilities: KerriganMaxActiveAbilities + kerrigan_max_passive_abilities: KerriganMaxPassiveAbilities + enable_morphling: EnableMorphling + war_council_nerfs: WarCouncilNerfs + spear_of_adun_presence: SpearOfAdunPresence + spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild + spear_of_adun_passive_ability_presence: SpearOfAdunPassiveAbilityPresence + spear_of_adun_passive_present_in_no_build: SpearOfAdunPassivesPresentInNoBuild + spear_of_adun_max_active_abilities: SpearOfAdunMaxActiveAbilities + spear_of_adun_max_passive_abilities: SpearOfAdunMaxAutocastAbilities + grant_story_tech: GrantStoryTech + grant_story_levels: GrantStoryLevels + nova_max_weapons: NovaMaxWeapons + nova_max_gadgets: NovaMaxGadgets + nova_ghost_of_a_chance_variant: NovaGhostOfAChanceVariant + take_over_ai_allies: TakeOverAIAllies + locked_items: LockedItems + excluded_items: ExcludedItems + unexcluded_items: UnexcludedItems + excluded_missions: ExcludedMissions + difficulty_curve: DifficultyCurve + exclude_very_hard_missions: ExcludeVeryHardMissions + vanilla_items_only: VanillaItemsOnly + exclude_overpowered_items: ExcludeOverpoweredItems + victory_cache: VictoryCache + vanilla_locations: VanillaLocations + extra_locations: ExtraLocations + challenge_locations: ChallengeLocations + mastery_locations: MasteryLocations + basebust_locations: BasebustLocations + speedrun_locations: SpeedrunLocations + preventative_locations: PreventativeLocations + filler_percentage: FillerPercentage + minerals_per_item: MineralsPerItem + vespene_per_item: VespenePerItem + starting_supply_per_item: StartingSupplyPerItem + maximum_supply_per_item: MaximumSupplyPerItem + maximum_supply_reduction_per_item: MaximumSupplyReductionPerItem + lowest_maximum_supply: LowestMaximumSupply + research_cost_reduction_per_item: ResearchCostReductionPerItem + filler_items_distribution: FillerItemsDistribution + mission_order_scouting: MissionOrderScouting + + custom_mission_order: CustomMissionOrder + +option_groups = [ + OptionGroup("Difficulty Settings", [ + GameDifficulty, + GameSpeed, + StarterUnit, + RequiredTactics, + WarCouncilNerfs, + DifficultyCurve, + ]), + OptionGroup("Primary Campaign Settings", [ + MissionOrder, + MaximumCampaignSize, + EnabledCampaigns, + EnableRaceSwapVariants, + ShuffleNoBuild, + ]), + OptionGroup("Optional Campaign Settings", [ + KeyMode, + ShuffleCampaigns, + AllInMap, + TwoStartPositions, + SelectRaces, + ExcludeVeryHardMissions, + EnableMissionRaceBalancing, + ]), + OptionGroup("Unit Upgrades", [ + EnsureGenericItems, + MinNumberOfUpgrades, + MaxNumberOfUpgrades, + MaxUpgradeLevel, + GenericUpgradeMissions, + GenericUpgradeResearch, + GenericUpgradeResearchSpeedup, + GenericUpgradeItems, + ]), + OptionGroup("Kerrigan", [ + KerriganPresence, + GrantStoryLevels, + KerriganLevelsPerMissionCompleted, + KerriganLevelsPerMissionCompletedCap, + KerriganLevelItemSum, + KerriganLevelItemDistribution, + KerriganTotalLevelCap, + StartPrimaryAbilities, + KerriganPrimalStatus, + KerriganMaxActiveAbilities, + KerriganMaxPassiveAbilities, + ]), + OptionGroup("Spear of Adun", [ + SpearOfAdunPresence, + SpearOfAdunPresentInNoBuild, + SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPassivesPresentInNoBuild, + SpearOfAdunMaxActiveAbilities, + SpearOfAdunMaxAutocastAbilities, + ]), + OptionGroup("Nova", [ + NovaMaxWeapons, + NovaMaxGadgets, + NovaGhostOfAChanceVariant, + ]), + OptionGroup("Race Specific Options", [ + EnableMorphling, + MercenaryHighlanders, + ]), + OptionGroup("Check Locations", [ + VictoryCache, + VanillaLocations, + ExtraLocations, + ChallengeLocations, + MasteryLocations, + BasebustLocations, + SpeedrunLocations, + PreventativeLocations, + ]), + OptionGroup("Filler Options", [ + FillerPercentage, + MineralsPerItem, + VespenePerItem, + StartingSupplyPerItem, + MaximumSupplyPerItem, + MaximumSupplyReductionPerItem, + LowestMaximumSupply, + ResearchCostReductionPerItem, + FillerItemsDistribution, + ]), + OptionGroup("Inclusions & Exclusions", [ + LockedItems, + ExcludedItems, + UnexcludedItems, + VanillaItemsOnly, + ExcludeOverpoweredItems, + ExcludedMissions, + ]), + OptionGroup("Advanced Gameplay", [ + MissionOrderScouting, + DifficultyDamageModifier, + TakeOverAIAllies, + EnableVoidTrade, + VoidTradeAgeLimit, + VoidTradeWorkers, + GrantStoryTech, + CustomMissionOrder, + ]), + OptionGroup("Cosmetics", [ + PlayerColorTerranRaynor, + PlayerColorProtoss, + PlayerColorZerg, + PlayerColorZergPrimal, + PlayerColorNova, + ]) +] + +def get_option_value(world: Union['SC2World', None], name: str) -> int: + """ + You should basically never use this unless `world` can be `None`. + Use `world.options..value` instead for better typing, autocomplete, and error messages. + """ + if world is None: + field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0] + if isinstance(field.type, str): + if field.type in globals(): + return globals()[field.type].default + import Options + return Options.__dict__[field.type].default + return field.type.default + + player_option = getattr(world.options, name) + + return player_option.value + + +def get_enabled_races(world: Optional['SC2World']) -> Set[SC2Race]: + race_names = world.options.selected_races.value if world and len(world.options.selected_races.value) > 0 else SelectRaces.valid_keys + return {race for race in SC2Race if race.get_title() in race_names} + + +def get_enabled_campaigns(world: Optional['SC2World']) -> Set[SC2Campaign]: + if world is None: + return {campaign for campaign in SC2Campaign if campaign.campaign_name in EnabledCampaigns.default} + campaign_names = world.options.enabled_campaigns + campaigns = {campaign for campaign in SC2Campaign if campaign.campaign_name in campaign_names} + if (world.options.mission_order.value == MissionOrder.option_vanilla + and get_enabled_races(world) != {SC2Race.TERRAN, SC2Race.ZERG, SC2Race.PROTOSS} + and SC2Campaign.EPILOGUE in campaigns + ): + campaigns.remove(SC2Campaign.EPILOGUE) + if len(campaigns) == 0: + # Everything is disabled, roll as everything enabled + return {campaign for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL} + return campaigns + + +def get_disabled_campaigns(world: 'SC2World') -> Set[SC2Campaign]: + all_campaigns = set(SC2Campaign) + enabled_campaigns = get_enabled_campaigns(world) + disabled_campaigns = all_campaigns.difference(enabled_campaigns) + disabled_campaigns.remove(SC2Campaign.GLOBAL) + return disabled_campaigns + + +def get_disabled_flags(world: 'SC2World') -> MissionFlag: + excluded = ( + (MissionFlag.Terran | MissionFlag.Zerg | MissionFlag.Protoss) + ^ functools.reduce(lambda a, b: a | b, [race.get_mission_flag() for race in get_enabled_races(world)]) + ) + # filter out no-build missions + if not world.options.shuffle_no_build.value: + excluded |= MissionFlag.NoBuild + raceswap_option = world.options.enable_race_swap.value + if raceswap_option == EnableRaceSwapVariants.option_disabled: + excluded |= MissionFlag.RaceSwap + elif raceswap_option in [EnableRaceSwapVariants.option_pick_one_non_vanilla, EnableRaceSwapVariants.option_shuffle_all_non_vanilla]: + excluded |= MissionFlag.HasRaceSwap + # TODO: add more flags to potentially exclude once we have a way to get that from the player + return MissionFlag(excluded) + + +def get_excluded_missions(world: 'SC2World') -> Set[SC2Mission]: + mission_order_type = world.options.mission_order.value + excluded_mission_names = world.options.excluded_missions.value + disabled_campaigns = get_disabled_campaigns(world) + disabled_flags = get_disabled_flags(world) + + excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names]) + + # Excluding Very Hard missions depending on options + if (mission_order_type != MissionOrder.option_vanilla and + ( + world.options.exclude_very_hard_missions == ExcludeVeryHardMissions.option_true + or ( + world.options.exclude_very_hard_missions == ExcludeVeryHardMissions.option_default + and ( + ( + mission_order_type in dynamic_mission_orders + and world.options.maximum_campaign_size < 20 + ) + or mission_order_type == MissionOrder.option_mini_campaign + ) + ) + ) + ): + excluded_missions = excluded_missions.union( + [mission for mission in SC2Mission if + mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE] + ) + # Omitting missions with flags we don't want + if disabled_flags: + excluded_missions = excluded_missions.union(get_missions_with_any_flags_in_list(disabled_flags)) + # Omitting missions not in enabled campaigns + for campaign in disabled_campaigns: + excluded_missions = excluded_missions.union(campaign_mission_table[campaign]) + # Omitting unwanted mission variants + if world.options.enable_race_swap.value in [EnableRaceSwapVariants.option_pick_one, EnableRaceSwapVariants.option_pick_one_non_vanilla]: + swaps = [ + mission for mission in SC2Mission + if mission not in excluded_missions + and mission.flags & (MissionFlag.HasRaceSwap|MissionFlag.RaceSwap) + ] + while len(swaps) > 0: + curr = swaps[0] + variants = [mission for mission in swaps if mission.map_file == curr.map_file] + variants.sort(key=lambda mission: mission.id) + swaps = [mission for mission in swaps if mission not in variants] + if len(variants) > 1: + variants.pop(world.random.randint(0, len(variants)-1)) + excluded_missions = excluded_missions.union(variants) + + return excluded_missions + + +def is_mission_in_soa_presence( + spear_of_adun_presence: int, + mission: SC2Mission, + option_class: Type[SpearOfAdunPresence] | Type[SpearOfAdunPassiveAbilityPresence] = SpearOfAdunPresence +) -> bool: + """ + Returns True if the mission can have Spear of Adun abilities. + No-build presence must be checked separately. + """ + return ( + (spear_of_adun_presence == option_class.option_everywhere) + or (spear_of_adun_presence == option_class.option_protoss and MissionFlag.Protoss in mission.flags) + or (spear_of_adun_presence == option_class.option_any_race_lotv + and (mission.campaign == SC2Campaign.LOTV or MissionFlag.VanillaSoa in mission.flags) + ) + or (spear_of_adun_presence == option_class.option_vanilla + and (MissionFlag.VanillaSoa in mission.flags # Keeps SOA off on Growing Shadow, as that's vanilla behaviour + or (MissionFlag.NoBuild in mission.flags and mission.campaign == SC2Campaign.LOTV) + ) + ) + ) + + + +static_mission_orders = [ + MissionOrder.option_vanilla, + MissionOrder.option_vanilla_shuffled, + MissionOrder.option_mini_campaign, +] + +dynamic_mission_orders = [ + MissionOrder.option_golden_path, + MissionOrder.option_grid, + MissionOrder.option_gauntlet, + MissionOrder.option_blitz, + MissionOrder.option_hopscotch, +] + +LEGACY_GRID_ORDERS = {3, 4, 8} # Medium Grid, Mini Grid, and Tiny Grid respectively + +kerrigan_unit_available = [ + KerriganPresence.option_vanilla, +] + +# Names of upgrades to be included for different options +upgrade_included_names: Dict[int, Set[str]] = { + GenericUpgradeItems.option_individual_items: { + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE, + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS, + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + }, + GenericUpgradeItems.option_bundle_weapon_and_armor: { + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, + }, + GenericUpgradeItems.option_bundle_unit_class: { + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE, + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE, + }, + GenericUpgradeItems.option_bundle_all: { + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, + } +} + +# Mapping trade age limit options to their millisecond equivalents +void_trade_age_limits_ms: Dict[int, int] = { + VoidTradeAgeLimit.option_5_minutes: 1000 * int(timedelta(minutes = 5).total_seconds()), + VoidTradeAgeLimit.option_30_minutes: 1000 * int(timedelta(minutes = 30).total_seconds()), + VoidTradeAgeLimit.option_1_hour: 1000 * int(timedelta(hours = 1).total_seconds()), + VoidTradeAgeLimit.option_2_hours: 1000 * int(timedelta(hours = 2).total_seconds()), + VoidTradeAgeLimit.option_4_hours: 1000 * int(timedelta(hours = 4).total_seconds()), + VoidTradeAgeLimit.option_1_day: 1000 * int(timedelta(days = 1).total_seconds()), + VoidTradeAgeLimit.option_1_week: 1000 * int(timedelta(weeks = 1).total_seconds()), +} diff --git a/worlds/sc2/pool_filter.py b/worlds/sc2/pool_filter.py new file mode 100644 index 00000000..31e47934 --- /dev/null +++ b/worlds/sc2/pool_filter.py @@ -0,0 +1,493 @@ +import logging +from typing import Callable, Dict, List, Set, Tuple, TYPE_CHECKING, Iterable + +from BaseClasses import Location, ItemClassification +from .item import StarcraftItem, ItemFilterFlags, item_names, item_parents, item_groups +from .item.item_tables import item_table, TerranItemType, ZergItemType, spear_of_adun_calldowns, \ + spear_of_adun_castable_passives +from .options import RequiredTactics + +if TYPE_CHECKING: + from . import SC2World + + +# Items that can be placed before resources if not already in +# General upgrades and Mercs +second_pass_placeable_items: Tuple[str, ...] = ( + # Global weapon/armor upgrades + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_SHIELDS, + # Terran Buildings without upgrades + item_names.SENSOR_TOWER, + item_names.HIVE_MIND_EMULATOR, + item_names.PSI_DISRUPTER, + item_names.PERDITION_TURRET, + # General Terran upgrades without any dependencies + item_names.SCV_ADVANCED_CONSTRUCTION, + item_names.SCV_DUAL_FUSION_WELDERS, + item_names.SCV_CONSTRUCTION_JUMP_JETS, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, + item_names.PROGRESSIVE_ORBITAL_COMMAND, + item_names.ULTRA_CAPACITORS, + item_names.VANADIUM_PLATING, + item_names.ORBITAL_DEPOTS, + item_names.MICRO_FILTERING, + item_names.AUTOMATED_REFINERY, + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, + item_names.TECH_REACTOR, + item_names.CELLULAR_REACTOR, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 + item_names.STRUCTURE_ARMOR, + item_names.HI_SEC_AUTO_TRACKING, + item_names.ADVANCED_OPTICS, + item_names.ROGUE_FORCES, + # Mercenaries (All races) + *[item_name for item_name, item_data in item_table.items() + if item_data.type in (TerranItemType.Mercenary, ZergItemType.Mercenary)], + # Kerrigan and Nova levels, abilities and generally useful stuff + *[item_name for item_name, item_data in item_table.items() + if item_data.type in ( + ZergItemType.Level, + ZergItemType.Ability, + ZergItemType.Evolution_Pit, + TerranItemType.Nova_Gear + )], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, + # Zerg static defenses + item_names.SPORE_CRAWLER, + item_names.SPINE_CRAWLER, + # Overseer + item_names.OVERLORD_OVERSEER_ASPECT, + # Spear of Adun Abilities + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT, + # Protoss generic upgrades + item_names.MATRIX_OVERLOAD, + item_names.QUATRO, + item_names.NEXUS_OVERCHARGE, + item_names.ORBITAL_ASSIMILATORS, + item_names.WARP_HARMONIZATION, + item_names.GUARDIAN_SHELL, + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.SUPERIOR_WARP_GATES, + item_names.KHALAI_INGENUITY, + item_names.AMPLIFIED_ASSIMILATORS, + # Protoss static defenses + item_names.PHOTON_CANNON, + item_names.KHAYDARIN_MONOLITH, + item_names.SHIELD_BATTERY, +) + + +def copy_item(item: StarcraftItem) -> StarcraftItem: + return StarcraftItem(item.name, item.classification, item.code, item.player, item.filter_flags) + + +class ValidInventory: + def __init__(self, world: 'SC2World', item_pool: List[StarcraftItem]) -> None: + self.multiworld = world.multiworld + self.player = world.player + self.world: 'SC2World' = world + # Track all Progression items and those with complex rules for filtering + self.logical_inventory: Dict[str, int] = {} + for item in item_pool: + if not item_table[item.name].is_important_for_filtering(): + continue + self.logical_inventory.setdefault(item.name, 0) + self.logical_inventory[item.name] += 1 + self.item_pool = item_pool + self.item_name_to_item: Dict[str, List[StarcraftItem]] = {} + self.item_name_to_child_items: Dict[str, List[StarcraftItem]] = {} + for item in item_pool: + self.item_name_to_item.setdefault(item.name, []).append(item) + for parent_item in item_parents.child_item_to_parent_items.get(item.name, []): + self.item_name_to_child_items.setdefault(parent_item, []).append(item) + + def has(self, item: str, player: int, count: int = 1) -> bool: + return self.logical_inventory.get(item, 0) >= count + + def has_any(self, items: Set[str], player: int) -> bool: + return any(self.logical_inventory.get(item) for item in items) + + def has_all(self, items: Set[str], player: int) -> bool: + return all(self.logical_inventory.get(item) for item in items) + + def has_group(self, item_group: str, player: int, count: int = 1) -> bool: + return False # Deliberately fails here, as item pooling is not aware about mission layout + + def count_group(self, item_name_group: str, player: int) -> int: + return 0 # For item filtering assume no missions are beaten + + def count(self, item: str, player: int) -> int: + return self.logical_inventory.get(item, 0) + + def count_from_list(self, items: Iterable[str], player: int) -> int: + return sum(self.logical_inventory.get(item, 0) for item in items) + + def count_from_list_unique(self, items: Iterable[str], player: int) -> int: + return sum(item in self.logical_inventory for item in items) + + def generate_reduced_inventory(self, inventory_size: int, filler_amount: int, mission_requirements: List[Tuple[str, Callable]]) -> List[StarcraftItem]: + """Attempts to generate a reduced inventory that can fulfill the mission requirements.""" + inventory: List[StarcraftItem] = list(self.item_pool) + requirements = mission_requirements + min_upgrades_per_unit = self.world.options.min_number_of_upgrades.value + max_upgrades_per_unit = self.world.options.max_number_of_upgrades.value + if max_upgrades_per_unit > -1 and min_upgrades_per_unit > max_upgrades_per_unit: + logging.getLogger("Starcraft 2").warning( + f"min upgrades per unit is greater than max upgrades per unit ({min_upgrades_per_unit} > {max_upgrades_per_unit}). " + f"Setting both to minimum value ({min_upgrades_per_unit})" + ) + max_upgrades_per_unit = min_upgrades_per_unit + + def attempt_removal( + item: StarcraftItem, + remove_flag: ItemFilterFlags = ItemFilterFlags.FilterExcluded, + ) -> str: + """ + Returns empty string and applies `remove_flag` if the item is removable, + else returns a string containing failed locations and applies ItemFilterFlags.LogicLocked + """ + # Only run logic checks when removing logic items + if self.logical_inventory.get(item.name, 0) > 0: + self.logical_inventory[item.name] -= 1 + failed_rules = [name for name, requirement in mission_requirements if not requirement(self)] + if failed_rules: + # If item cannot be removed, lock and revert + self.logical_inventory[item.name] += 1 + item.filter_flags |= ItemFilterFlags.LogicLocked + return f"{len(failed_rules)} rules starting with \"{failed_rules[0]}\"" + if not self.logical_inventory[item.name]: + del self.logical_inventory[item.name] + item.filter_flags |= remove_flag + return "" + + def remove_child_items( + parent_item: StarcraftItem, + remove_flag: ItemFilterFlags = ItemFilterFlags.FilterExcluded, + ) -> None: + child_items = self.item_name_to_child_items.get(parent_item.name, []) + for child_item in child_items: + if (ItemFilterFlags.AllowedOrphan|ItemFilterFlags.Unexcludable) & child_item.filter_flags: + continue + parent_id = item_table[child_item.name].parent + assert parent_id is not None + if item_parents.parent_present[parent_id](self.logical_inventory, self.world.options): + continue + if not attempt_removal(child_item, remove_flag): + remove_child_items(child_item, remove_flag) + + def cull_items_over_maximum(group: List[StarcraftItem], allowed_max: int) -> None: + for item in group: + if len([x for x in group if ItemFilterFlags.Culled not in x.filter_flags]) <= allowed_max: + break + if ItemFilterFlags.Uncullable & item.filter_flags: + continue + attempt_removal(item, remove_flag=ItemFilterFlags.Culled) + + def request_minimum_items(group: List[StarcraftItem], requested_minimum) -> None: + for item in group: + if len([x for x in group if ItemFilterFlags.RequestedOrBetter & x.filter_flags]) >= requested_minimum: + break + if ItemFilterFlags.Culled & item.filter_flags: + continue + item.filter_flags |= ItemFilterFlags.Requested + + # Process Excluded items, validate if the item can get actually excluded + excluded_items: List[StarcraftItem] = [starcraft_item for starcraft_item in inventory if ItemFilterFlags.Excluded & starcraft_item.filter_flags] + self.world.random.shuffle(excluded_items) + for excluded_item in excluded_items: + if ItemFilterFlags.Unexcludable & excluded_item.filter_flags: + continue + removal_failed = attempt_removal(excluded_item, remove_flag=ItemFilterFlags.Removed) + if removal_failed: + if ItemFilterFlags.UserExcluded in excluded_item.filter_flags: + logging.getLogger("Starcraft 2").warning( + f"Cannot exclude item {excluded_item.name} as it would break {removal_failed}" + ) + else: + assert False, f"Item filtering excluded an item which is logically required: {excluded_item.name}" + continue + remove_child_items(excluded_item, remove_flag=ItemFilterFlags.Removed) + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + + # Clear excluded flags; all existing ones should be implemented or out-of-logic + for item in inventory: + item.filter_flags &= ~ItemFilterFlags.Excluded + + # Determine item groups to be constrained by min/max upgrades per unit + group_to_item: Dict[str, List[StarcraftItem]] = {} + group: str = "" + for group, group_member_names in item_parents.item_upgrade_groups.items(): + group_to_item[group] = [] + for item_name in group_member_names: + inventory_items = self.item_name_to_item.get(item_name, []) + group_to_item[group].extend(item for item in inventory_items if ItemFilterFlags.Removed not in item.filter_flags) + + # Limit the maximum number of upgrades + if max_upgrades_per_unit != -1: + for group_name, group_items in group_to_item.items(): + self.world.random.shuffle(group_to_item[group]) + cull_items_over_maximum(group_items, max_upgrades_per_unit) + + # Requesting minimum upgrades for items that have already been locked/placed when minimum required + if min_upgrades_per_unit != -1: + for group_name, group_items in group_to_item.items(): + self.world.random.shuffle(group_items) + request_minimum_items(group_items, min_upgrades_per_unit) + + # Kerrigan max abilities + kerrigan_actives = [item for item in inventory if item.name in item_groups.kerrigan_active_abilities] + self.world.random.shuffle(kerrigan_actives) + cull_items_over_maximum(kerrigan_actives, self.world.options.kerrigan_max_active_abilities.value) + + kerrigan_passives = [item for item in inventory if item.name in item_groups.kerrigan_passives] + self.world.random.shuffle(kerrigan_passives) + cull_items_over_maximum(kerrigan_passives, self.world.options.kerrigan_max_passive_abilities.value) + + # Spear of Adun max abilities + spear_of_adun_actives = [item for item in inventory if item.name in spear_of_adun_calldowns] + self.world.random.shuffle(spear_of_adun_actives) + cull_items_over_maximum(spear_of_adun_actives, self.world.options.spear_of_adun_max_active_abilities.value) + + spear_of_adun_autocasts = [item for item in inventory if item.name in spear_of_adun_castable_passives] + self.world.random.shuffle(spear_of_adun_autocasts) + cull_items_over_maximum(spear_of_adun_autocasts, self.world.options.spear_of_adun_max_passive_abilities.value) + + # Nova items + nova_weapon_items = [item for item in inventory if item.name in item_groups.nova_weapons] + self.world.random.shuffle(nova_weapon_items) + cull_items_over_maximum(nova_weapon_items, self.world.options.nova_max_weapons.value) + + nova_gadget_items = [item for item in inventory if item.name in item_groups.nova_gadgets] + self.world.random.shuffle(nova_gadget_items) + cull_items_over_maximum(nova_gadget_items, self.world.options.nova_max_gadgets.value) + + # Determining if the full-size inventory can complete campaign + # Note(mm): Now that user excludes are checked against logic, this can probably never fail unless there's a bug. + failed_locations: List[str] = [location for (location, requirement) in requirements if not requirement(self)] + if len(failed_locations) > 0: + raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") + + # Optionally locking generic items + generic_items: List[StarcraftItem] = [ + starcraft_item for starcraft_item in inventory + if starcraft_item.name in second_pass_placeable_items + and ( + not ItemFilterFlags.CulledOrBetter & starcraft_item.filter_flags + or ItemFilterFlags.RequestedOrBetter & starcraft_item.filter_flags + ) + ] + reserved_generic_percent = self.world.options.ensure_generic_items.value / 100 + reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) + self.world.random.shuffle(generic_items) + for starcraft_item in generic_items[:reserved_generic_amount]: + starcraft_item.filter_flags |= ItemFilterFlags.Requested + + # Main cull process + def remove_random_item( + removable: List[StarcraftItem], + dont_remove_flags: ItemFilterFlags, + remove_flag: ItemFilterFlags = ItemFilterFlags.Removed, + ) -> bool: + if len(removable) == 0: + return False + item = self.world.random.choice(removable) + # Do not remove item if it would drop upgrades below minimum + if min_upgrades_per_unit > 0: + group_name = None + parent = item_table[item.name].parent + if parent is not None: + group_name = item_parents.parent_present[parent].constraint_group + if group_name is not None: + children = group_to_item.get(group_name, []) + children = [x for x in children if not (ItemFilterFlags.CulledOrBetter & x.filter_flags)] + if len(children) <= min_upgrades_per_unit: + # Attempt to remove a parent instead, if possible + dont_remove = ItemFilterFlags.Removed|dont_remove_flags + parent_items = [ + parent_item + for parent_name in item_parents.child_item_to_parent_items[item.name] + for parent_item in self.item_name_to_item.get(parent_name, []) + if not (dont_remove & parent_item.filter_flags) + ] + if parent_items: + item = self.world.random.choice(parent_items) + else: + # Lock remaining upgrades + for item in children: + item.filter_flags |= ItemFilterFlags.Locked + return False + if not attempt_removal(item, remove_flag): + remove_child_items(item, remove_flag) + return True + return False + + def item_included(item: StarcraftItem) -> bool: + return bool( + ItemFilterFlags.Removed not in item.filter_flags + and ((ItemFilterFlags.Unexcludable|ItemFilterFlags.Excluded) & item.filter_flags) != ItemFilterFlags.Excluded + ) + + # Actually remove culled items; we won't re-add them + inventory = [ + item for item in inventory + if (((ItemFilterFlags.Uncullable|ItemFilterFlags.Culled) & item.filter_flags) != ItemFilterFlags.Culled) + ] + + # Part 1: Remove items that are not requested + start_inventory_size = len([item for item in inventory if ItemFilterFlags.StartInventory in item.filter_flags]) + current_inventory_size = len([item for item in inventory if item_included(item)]) + cullable_items = [item for item in inventory if not (ItemFilterFlags.Uncullable & item.filter_flags)] + while current_inventory_size - start_inventory_size > inventory_size - filler_amount: + if len(cullable_items) == 0: + if filler_amount > 0: + filler_amount -= 1 + else: + break + if remove_random_item(cullable_items, ItemFilterFlags.Uncullable): + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + current_inventory_size = len([item for item in inventory if item_included(item)]) + cullable_items = [ + item for item in cullable_items + if not ((ItemFilterFlags.Removed|ItemFilterFlags.Uncullable) & item.filter_flags) + ] + + # Handle too many requested + if current_inventory_size - start_inventory_size > inventory_size - filler_amount: + for item in inventory: + item.filter_flags &= ~ItemFilterFlags.Requested + + # Part 2: If we need to remove more, allow removing requested items + excludable_items = [item for item in inventory if not (ItemFilterFlags.Unexcludable & item.filter_flags)] + while current_inventory_size - start_inventory_size > inventory_size - filler_amount: + if len(excludable_items) == 0: + break + if remove_random_item(excludable_items, ItemFilterFlags.Unexcludable): + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + current_inventory_size = len([item for item in inventory if item_included(item)]) + excludable_items = [ + item for item in inventory + if not ((ItemFilterFlags.Removed|ItemFilterFlags.Unexcludable) & item.filter_flags) + ] + + # Part 3: If it still doesn't fit, move locked items to start inventory until it fits + precollect_items = current_inventory_size - inventory_size - start_inventory_size - filler_amount + if precollect_items > 0: + promotable = [ + item + for item in inventory + if ItemFilterFlags.StartInventory not in item.filter_flags + and ItemFilterFlags.Locked in item.filter_flags + ] + self.world.random.shuffle(promotable) + for item in promotable[:precollect_items]: + item.filter_flags |= ItemFilterFlags.StartInventory + start_inventory_size += 1 + + # Removing extra dependencies + # Transport Hook + if not self.logical_inventory.get(item_names.MEDIVAC): + # Don't allow L2 Siege Tank Transport Hook without Medivac + inventory_transport_hooks = [item for item in inventory if item.name == item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK] + removable_transport_hooks = [item for item in inventory_transport_hooks if not (ItemFilterFlags.Unexcludable & item.filter_flags)] + if len(inventory_transport_hooks) > 1 and removable_transport_hooks: + inventory.remove(removable_transport_hooks[0]) + + # Weapon/Armour upgrades + def exclude_wa(prefix: str) -> List[StarcraftItem]: + return [ + item for item in inventory + if (ItemFilterFlags.UnexcludableUpgrade & item.filter_flags) + or not item.name.startswith(prefix) + ] + used_item_names: Set[str] = {item.name for item in inventory} + if used_item_names.isdisjoint(item_groups.barracks_wa_group): + inventory = exclude_wa(item_names.TERRAN_INFANTRY_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.factory_wa_group): + inventory = exclude_wa(item_names.TERRAN_VEHICLE_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.starport_wa_group): + inventory = exclude_wa(item_names.TERRAN_SHIP_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.zerg_melee_wa): + inventory = exclude_wa(item_names.PROGRESSIVE_ZERG_MELEE_ATTACK) + if used_item_names.isdisjoint(item_groups.zerg_ranged_wa): + inventory = exclude_wa(item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK) + if used_item_names.isdisjoint(item_groups.zerg_air_units): + inventory = exclude_wa(item_names.ZERG_FLYER_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.protoss_ground_wa): + inventory = exclude_wa(item_names.PROTOSS_GROUND_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.protoss_air_wa): + inventory = exclude_wa(item_names.PROTOSS_AIR_UPGRADE_PREFIX) + + # Part 4: Last-ditch effort to reduce inventory size; upgrades can go in start inventory + current_inventory_size = len(inventory) + precollect_items = current_inventory_size - inventory_size - start_inventory_size - filler_amount + if precollect_items > 0: + promotable = [ + item + for item in inventory + if ItemFilterFlags.StartInventory not in item.filter_flags + ] + self.world.random.shuffle(promotable) + for item in promotable[:precollect_items]: + item.filter_flags |= ItemFilterFlags.StartInventory + start_inventory_size += 1 + + assert current_inventory_size - start_inventory_size <= inventory_size - filler_amount, ( + f"Couldn't reduce inventory to fit. target={inventory_size}, poolsize={current_inventory_size}, " + f"start_inventory={starcraft_item}, filler_amount={filler_amount}" + ) + + return inventory + + +def filter_items(world: 'SC2World', location_cache: List[Location], item_pool: List[StarcraftItem]) -> List[StarcraftItem]: + """ + Returns a semi-randomly pruned set of items based on number of available locations. + The returned inventory must be capable of logically accessing every location in the world. + """ + open_locations = [location for location in location_cache if location.item is None] + inventory_size = len(open_locations) + # Most of the excluded locations get actually removed but Victory ones are mandatory in order to allow the game + # to progress normally. Since regular items aren't flagged as filler, we need to generate enough filler for those + # locations as we need to have something that can be actually placed there. + # Therefore, we reserve those to be filler. + excluded_locations = [location for location in open_locations if location.name in world.options.exclude_locations.value] + reserved_filler_count = len(excluded_locations) + target_nonfiller_item_count = inventory_size - reserved_filler_count + filler_amount = (inventory_size * world.options.filler_percentage) // 100 + if world.options.required_tactics.value == RequiredTactics.option_no_logic: + mission_requirements = [] + else: + mission_requirements = [(location.name, location.access_rule) for location in location_cache] + valid_inventory = ValidInventory(world, item_pool) + + valid_items = valid_inventory.generate_reduced_inventory(target_nonfiller_item_count, filler_amount, mission_requirements) + for _ in range(reserved_filler_count): + filler_item = world.create_item(world.get_filler_item_name()) + if filler_item.classification & ItemClassification.progression: + filler_item.classification = ItemClassification.filler # Must be flagged as Filler, even if it's a Kerrigan level + valid_items.append(filler_item) + return valid_items diff --git a/worlds/sc2/regions.py b/worlds/sc2/regions.py new file mode 100644 index 00000000..26d127a1 --- /dev/null +++ b/worlds/sc2/regions.py @@ -0,0 +1,532 @@ +from typing import TYPE_CHECKING, List, Dict, Any, Tuple, Optional + +from Options import OptionError +from .locations import LocationData, Location +from .mission_tables import ( + SC2Mission, SC2Campaign, MissionFlag, get_campaign_goal_priority, + campaign_final_mission_locations, campaign_alt_final_mission_locations +) +from .options import ( + ShuffleNoBuild, RequiredTactics, ShuffleCampaigns, + kerrigan_unit_available, TakeOverAIAllies, MissionOrder, get_excluded_missions, get_enabled_campaigns, + static_mission_orders, + TwoStartPositions, KeyMode, EnableMissionRaceBalancing, EnableRaceSwapVariants, NovaGhostOfAChanceVariant, + WarCouncilNerfs, GrantStoryTech +) +from .mission_order.options import CustomMissionOrder +from .mission_order import SC2MissionOrder +from .mission_order.nodes import SC2MOGenMissionOrder, Difficulty +from .mission_order.mission_pools import SC2MOGenMissionPools +from .mission_order.generation import resolve_unlocks, fill_depths, resolve_difficulties, fill_missions, make_connections, resolve_generic_keys + +if TYPE_CHECKING: + from . import SC2World + + +def create_mission_order( + world: 'SC2World', locations: Tuple[LocationData, ...], location_cache: List[Location] +): + # 'locations' contains both actual game locations and beat event locations for all mission regions + # When a region (mission) is accessible, all its locations are potentially accessible + # Accessible in this context always means "its access rule evaluates to True" + # This includes the beat events, which copy the access rules of the victory locations + # Beat events being added to logical inventory is auto-magic: + # Event locations contain an event item of (by default) identical name, + # which Archipelago's generator will consider part of the logical inventory + # whenever the event location becomes accessible + + # Set up mission pools + mission_pools = SC2MOGenMissionPools() + mission_pools.set_exclusions(get_excluded_missions(world), []) # TODO set unexcluded + adjust_mission_pools(world, mission_pools) + setup_mission_pool_balancing(world, mission_pools) + + mission_order_type = world.options.mission_order + if mission_order_type == MissionOrder.option_custom: + mission_order_dict = world.options.custom_mission_order.value + else: + mission_order_option = create_regular_mission_order(world, mission_pools) + if mission_order_type in static_mission_orders: + # Static orders get converted early to curate preset content, so it can be used as-is + mission_order_dict = mission_order_option + else: + mission_order_dict = CustomMissionOrder(mission_order_option).value + mission_order = SC2MOGenMissionOrder(world, mission_order_dict) + + # Set up requirements for individual parts of the mission order + resolve_unlocks(mission_order) + + # Ensure total accessibilty and resolve relative difficulties + fill_depths(mission_order) + resolve_difficulties(mission_order) + + # Build the mission order + fill_missions(mission_order, mission_pools, world, [], locations, location_cache) # TODO set locked missions + make_connections(mission_order, world) + + # Fill in Key requirements now that missions are placed + resolve_generic_keys(mission_order) + + return SC2MissionOrder(mission_order, mission_pools) + +def adjust_mission_pools(world: 'SC2World', pools: SC2MOGenMissionPools): + # Mission pool changes + mission_order_type = world.options.mission_order.value + enabled_campaigns = get_enabled_campaigns(world) + adv_tactics = world.options.required_tactics.value != RequiredTactics.option_standard + shuffle_no_build = world.options.shuffle_no_build.value + extra_locations = world.options.extra_locations.value + grant_story_tech = world.options.grant_story_tech.value + grant_story_levels = world.options.grant_story_levels.value + war_council_nerfs = world.options.war_council_nerfs.value == WarCouncilNerfs.option_true + + # WoL + if shuffle_no_build == ShuffleNoBuild.option_false or adv_tactics: + # Replacing No Build missions with Easy missions + # WoL + pools.move_mission(SC2Mission.ZERO_HOUR, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION_P, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND_P, Difficulty.EASY, Difficulty.STARTER) + if world.options.required_tactics != RequiredTactics.option_any_units: + # Per playtester feedback: doing this mission with only one unit is flaky + # but there are enough viable comps that >= 2 random units is probably workable + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY_P, Difficulty.EASY, Difficulty.STARTER) + # LotV + pools.move_mission(SC2Mission.THE_GROWING_SHADOW, Difficulty.EASY, Difficulty.STARTER) + if shuffle_no_build == ShuffleNoBuild.option_false: + # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only + pools.move_mission(SC2Mission.OUTBREAK, Difficulty.EASY, Difficulty.MEDIUM) + # Pushing extra Normal missions to Easy + pools.move_mission(SC2Mission.ECHOES_OF_THE_FUTURE, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.CUTTHROAT, Difficulty.MEDIUM, Difficulty.EASY) + # Additional changes on Advanced Tactics + if adv_tactics: + # WoL + pools.move_mission(SC2Mission.SMASH_AND_GRAB, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR_Z, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR_P, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.WELCOME_TO_THE_JUNGLE, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.ENGINE_OF_DESTRUCTION, Difficulty.HARD, Difficulty.MEDIUM) + # Prophecy needs to be adjusted if by itself + if enabled_campaigns == {SC2Campaign.PROPHECY}: + pools.move_mission(SC2Mission.A_SINISTER_TURN, Difficulty.MEDIUM, Difficulty.EASY) + # Prologue's only valid starter is the goal mission + if enabled_campaigns == {SC2Campaign.PROLOGUE} \ + or mission_order_type in static_mission_orders \ + and world.options.shuffle_campaigns.value == ShuffleCampaigns.option_false: + pools.move_mission(SC2Mission.DARK_WHISPERS, Difficulty.EASY, Difficulty.STARTER) + # HotS + kerriganless = world.options.kerrigan_presence.value not in kerrigan_unit_available \ + or SC2Campaign.HOTS not in enabled_campaigns + if grant_story_tech == GrantStoryTech.option_grant: + # Additional starter mission if player is granted story tech + pools.move_mission(SC2Mission.ENEMY_WITHIN, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.TEMPLAR_S_RETURN, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_ESCAPE, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.IN_THE_ENEMY_S_SHADOW, Difficulty.MEDIUM, Difficulty.STARTER) + if not war_council_nerfs: + pools.move_mission(SC2Mission.TEMPLAR_S_RETURN, Difficulty.MEDIUM, Difficulty.STARTER) + if (grant_story_tech == GrantStoryTech.option_grant and grant_story_levels) or kerriganless: + # The player has, all the stuff he needs, provided under these settings + pools.move_mission(SC2Mission.SUPREME, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_INFINITE_CYCLE, Difficulty.HARD, Difficulty.STARTER) + pools.move_mission(SC2Mission.CONVICTION, Difficulty.MEDIUM, Difficulty.STARTER) + if (grant_story_tech != GrantStoryTech.option_grant + and ( + world.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + or ( + SC2Campaign.NCO in enabled_campaigns + and world.options.nova_ghost_of_a_chance_variant.value == NovaGhostOfAChanceVariant.option_auto + ) + ) + ): + # Using NCO tech for this mission that must be acquired + pools.move_mission(SC2Mission.GHOST_OF_A_CHANCE, Difficulty.STARTER, Difficulty.MEDIUM) + if world.options.take_over_ai_allies.value == TakeOverAIAllies.option_true: + pools.move_mission(SC2Mission.HARBINGER_OF_OBLIVION, Difficulty.MEDIUM, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) < 2 and not kerriganless or adv_tactics: + # Conditionally moving Easy missions to Starter + pools.move_mission(SC2Mission.HARVEST_OF_SCREAMS, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION, Difficulty.EASY, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) < 2: + pools.move_mission(SC2Mission.DOMINATION, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION_T, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION_P, Difficulty.EASY, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) + pools.get_pool_size(Difficulty.EASY) < 2: + # Flashpoint needs just a few items at start but competent comp at the end + pools.move_mission(SC2Mission.FLASHPOINT, Difficulty.HARD, Difficulty.EASY) + +def setup_mission_pool_balancing(world: 'SC2World', pools: SC2MOGenMissionPools): + race_mission_balance = world.options.mission_race_balancing.value + flag_ratios: Dict[MissionFlag, int] = {} + flag_weights: Dict[MissionFlag, int] = {} + if race_mission_balance == EnableMissionRaceBalancing.option_semi_balanced: + flag_weights = { MissionFlag.Terran: 1, MissionFlag.Zerg: 1, MissionFlag.Protoss: 1 } + elif race_mission_balance == EnableMissionRaceBalancing.option_fully_balanced: + flag_ratios = { MissionFlag.Terran: 1, MissionFlag.Zerg: 1, MissionFlag.Protoss: 1 } + pools.set_flag_balances(flag_ratios, flag_weights) + +def create_regular_mission_order(world: 'SC2World', mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + mission_order_type = world.options.mission_order.value + + if mission_order_type in static_mission_orders: + return create_static_mission_order(world, mission_order_type, mission_pools) + else: + return create_dynamic_mission_order(world, mission_order_type, mission_pools) + +def create_static_mission_order(world: 'SC2World', mission_order_type: int, mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + mission_order: Dict[str, Dict[str, Any]] = {} + + enabled_campaigns = get_enabled_campaigns(world) + if mission_order_type == MissionOrder.option_vanilla: + missions = "vanilla" + elif world.options.shuffle_campaigns.value == ShuffleCampaigns.option_true: + missions = "random" + else: + missions = "vanilla_shuffled" + + if world.options.enable_race_swap.value == EnableRaceSwapVariants.option_disabled: + shuffle_raceswaps = False + else: + # Picking specific raceswap variants is handled by mission exclusion + shuffle_raceswaps = True + + key_mode_option = world.options.key_mode.value + if key_mode_option == KeyMode.option_missions: + keys = "missions" + elif key_mode_option == KeyMode.option_questlines: + keys = "layouts" + elif key_mode_option == KeyMode.option_progressive_missions: + keys = "progressive_missions" + elif key_mode_option == KeyMode.option_progressive_questlines: + keys = "progressive_layouts" + elif key_mode_option == KeyMode.option_progressive_per_questline: + keys = "progressive_per_layout" + else: + keys = "none" + + if mission_order_type == MissionOrder.option_mini_campaign: + prefix = "mini " + else: + prefix = "" + + def mission_order_preset(name: str) -> Dict[str, str]: + return { + "preset": prefix + name, + "missions": missions, + "shuffle_raceswaps": shuffle_raceswaps, + "keys": keys + } + + prophecy_enabled = SC2Campaign.PROPHECY in enabled_campaigns + wol_enabled = SC2Campaign.WOL in enabled_campaigns + if wol_enabled: + mission_order[SC2Campaign.WOL.campaign_name] = mission_order_preset("wol") + + if prophecy_enabled: + mission_order[SC2Campaign.PROPHECY.campaign_name] = mission_order_preset("prophecy") + + if SC2Campaign.HOTS in enabled_campaigns: + mission_order[SC2Campaign.HOTS.campaign_name] = mission_order_preset("hots") + + if SC2Campaign.PROLOGUE in enabled_campaigns: + mission_order[SC2Campaign.PROLOGUE.campaign_name] = mission_order_preset("prologue") + + if SC2Campaign.LOTV in enabled_campaigns: + mission_order[SC2Campaign.LOTV.campaign_name] = mission_order_preset("lotv") + + if SC2Campaign.EPILOGUE in enabled_campaigns: + mission_order[SC2Campaign.EPILOGUE.campaign_name] = mission_order_preset("epilogue") + entry_rules = [] + if SC2Campaign.WOL in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.WOL.campaign_name }) + if SC2Campaign.HOTS in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.HOTS.campaign_name }) + if SC2Campaign.LOTV in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.LOTV.campaign_name }) + mission_order[SC2Campaign.EPILOGUE.campaign_name]["entry_rules"] = entry_rules + + if SC2Campaign.NCO in enabled_campaigns: + mission_order[SC2Campaign.NCO.campaign_name] = mission_order_preset("nco") + + # Resolve immediately so the layout updates are simpler + mission_order = CustomMissionOrder(mission_order).value + + # WoL requirements should count missions from Prophecy if both are enabled, and Prophecy should require a WoL mission + # There is a preset that already does this, but special-casing this way is easier to work with for other code + if wol_enabled and prophecy_enabled: + fix_wol_prophecy_entry_rules(mission_order) + + # Vanilla Shuffled is allowed to drop some slots + if mission_order_type == MissionOrder.option_vanilla_shuffled: + remove_missions(world, mission_order, mission_pools) + + # Curate final missions and goal campaigns + force_final_missions(world, mission_order, mission_order_type) + + return mission_order + + +def fix_wol_prophecy_entry_rules(mission_order: Dict[str, Dict[str, Any]]): + prophecy_name = SC2Campaign.PROPHECY.campaign_name + + # Make the mission count entry rules in WoL also count Prophecy + def fix_entry_rule(entry_rule: Dict[str, Any], local_campaign_scope: str): + # This appends Prophecy to any scope that points at the local campaign (WoL) + if "scope" in entry_rule: + if entry_rule["scope"] == local_campaign_scope: + entry_rule["scope"] = [local_campaign_scope, prophecy_name] + elif isinstance(entry_rule["scope"], list) and local_campaign_scope in entry_rule["scope"]: + entry_rule["scope"] = entry_rule["scope"] + [prophecy_name] + + for layout_dict in mission_order[SC2Campaign.WOL.campaign_name].values(): + if not isinstance(layout_dict, dict): + continue + if "entry_rules" in layout_dict: + for entry_rule in layout_dict["entry_rules"]: + fix_entry_rule(entry_rule, "..") + if "missions" in layout_dict: + for mission_dict in layout_dict["missions"]: + if "entry_rules" in mission_dict: + for entry_rule in mission_dict["entry_rules"]: + fix_entry_rule(entry_rule, "../..") + + # Make Prophecy require Artifact's second mission + mission_order[prophecy_name][prophecy_name]["entry_rules"] = [{ "scope": [f"{SC2Campaign.WOL.campaign_name}/Artifact/1"]}] + + +def force_final_missions(world: 'SC2World', mission_order: Dict[str, Dict[str, Any]], mission_order_type: int): + goal_mission: Optional[SC2Mission] = None + excluded_missions = get_excluded_missions(world) + enabled_campaigns = get_enabled_campaigns(world) + raceswap_variants = [mission for mission in SC2Mission if mission.flags & MissionFlag.RaceSwap] + # Prefer long campaigns over shorter ones and harder missions over easier ones + goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} + goal_level = max(goal_priorities.values()) + candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] + candidate_campaigns.sort(key=lambda it: it.id) + + # Vanilla Shuffled & Mini Campaign get a curated final mission + if mission_order_type != MissionOrder.option_vanilla: + for goal_campaign in candidate_campaigns: + primary_goal = campaign_final_mission_locations[goal_campaign] + if primary_goal is None or primary_goal.mission in excluded_missions: + # No primary goal or its mission is excluded + candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) + # Also allow raceswaps of curated final missions, provided they're not excluded + for candidate_with_raceswaps in [mission for mission in candidate_missions if mission.flags & MissionFlag.HasRaceSwap]: + raceswap_candidates = [mission for mission in raceswap_variants if mission.map_file == candidate_with_raceswaps.map_file] + candidate_missions.extend(raceswap_candidates) + candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] + if len(candidate_missions) == 0: + raise OptionError(f"There are no valid goal missions for campaign {goal_campaign.campaign_name}. Please exclude fewer missions.") + goal_mission = world.random.choice(candidate_missions) + else: + goal_mission = primary_goal.mission + + # The goal layout for static presets is the layout corresponding to the last key + goal_layout = list(mission_order[goal_campaign.campaign_name].keys())[-1] + goal_index = mission_order[goal_campaign.campaign_name][goal_layout]["size"] - 1 + mission_order[goal_campaign.campaign_name][goal_layout]["missions"].append({ + "index": [goal_index], + "mission_pool": [goal_mission.id] + }) + + # Remove goal status from lower priority campaigns + for campaign in enabled_campaigns: + if campaign not in candidate_campaigns: + mission_order[campaign.campaign_name]["goal"] = False + +def remove_missions(world: 'SC2World', mission_order: Dict[str, Dict[str, Any]], mission_pools: SC2MOGenMissionPools): + enabled_campaigns = get_enabled_campaigns(world) + removed_counts: Dict[SC2Campaign, Dict[str, int]] = {} + for campaign in enabled_campaigns: + # Count missing missions for each campaign individually + campaign_size = sum(layout["size"] for layout in mission_order[campaign.campaign_name].values() if type(layout) == dict) + allowed_missions = mission_pools.count_allowed_missions(campaign) + removal_count = campaign_size - allowed_missions + if removal_count > len(removal_priorities[campaign]): + raise OptionError(f"Too many missions of campaign {campaign.campaign_name} excluded, cannot fill vanilla shuffled mission order.") + for layout in removal_priorities[campaign][:removal_count]: + removed_counts.setdefault(campaign, {}).setdefault(layout, 0) + removed_counts[campaign][layout] += 1 + mission_order[campaign.campaign_name][layout]["size"] -= 1 + + # Fix mission indices & nexts + for (campaign, layouts) in removed_counts.items(): + for (layout, amount) in layouts.items(): + new_size = mission_order[campaign.campaign_name][layout]["size"] + original_size = new_size + amount + for removed_idx in range(new_size, original_size): + for mission in mission_order[campaign.campaign_name][layout]["missions"]: + if "index" in mission and removed_idx in mission["index"]: + mission["index"].remove(removed_idx) + if "next" in mission and removed_idx in mission["next"]: + mission["next"].remove(removed_idx) + + # Special cases + if SC2Campaign.WOL in removed_counts: + if "Char" in removed_counts[SC2Campaign.WOL]: + # Remove the first two mission changes that create the branching path + mission_order[SC2Campaign.WOL.campaign_name]["Char"]["missions"] = mission_order[SC2Campaign.WOL.campaign_name]["Char"]["missions"][2:] + if SC2Campaign.NCO in removed_counts: + # Remove the whole last layout if its size is 0 + if "Mission Pack 3" in removed_counts[SC2Campaign.NCO] and removed_counts[SC2Campaign.NCO]["Mission Pack 3"] == 3: + mission_order[SC2Campaign.NCO.campaign_name].pop("Mission Pack 3") + +removal_priorities: Dict[SC2Campaign, List[str]] = { + SC2Campaign.WOL: [ + "Colonist", + "Covert", + "Covert", + "Char", + "Rebellion", + "Artifact", + "Artifact", + "Rebellion" + ], + SC2Campaign.PROPHECY: [ + "Prophecy", + "Prophecy" + ], + SC2Campaign.HOTS: [ + "Umoja", + "Kaldir", + "Char", + "Zerus", + "Skygeirr Station" + ], + SC2Campaign.PROLOGUE: [ + "Prologue", + ], + SC2Campaign.LOTV: [ + "Ulnar", + "Return to Aiur", + "Aiur", + "Tal'darim", + "Purifier", + "Shakuras", + "Korhal" + ], + SC2Campaign.EPILOGUE: [ + "Epilogue", + ], + SC2Campaign.NCO: [ + "Mission Pack 3", + "Mission Pack 3", + "Mission Pack 2", + "Mission Pack 2", + "Mission Pack 1", + "Mission Pack 1", + "Mission Pack 3" + ] +} + +def make_grid(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "grid": { + "display_name": "", + "type": "grid", + "size": size, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def make_golden_path(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + key_mode = world.options.key_mode.value + if key_mode == KeyMode.option_missions: + keys = "missions" + elif key_mode == KeyMode.option_questlines: + keys = "layouts" + elif key_mode == KeyMode.option_progressive_missions: + keys = "progressive_missions" + elif key_mode == KeyMode.option_progressive_questlines: + keys = "progressive_layouts" + elif key_mode == KeyMode.option_progressive_per_questline: + keys = "progressive_per_layout" + else: + keys = "none" + + mission_order = { + "golden path": { + "display_name": "", + "preset": "golden path", + "size": size, + "keys": keys, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def make_gauntlet(size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "gauntlet": { + "display_name": "", + "type": "gauntlet", + "size": size, + } + } + return mission_order + +def make_blitz(size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "blitz": { + "display_name": "", + "type": "blitz", + "size": size, + } + } + return mission_order + +def make_hopscotch(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "hopscotch": { + "display_name": "", + "type": "hopscotch", + "size": size, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def create_dynamic_mission_order(world: 'SC2World', mission_order_type: int, mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + num_missions = min(mission_pools.get_allowed_mission_count(), world.options.maximum_campaign_size.value) + num_missions = max(1, num_missions) + if mission_order_type == MissionOrder.option_golden_path: + return make_golden_path(world, num_missions) + + if mission_order_type == MissionOrder.option_grid: + mission_order = make_grid(world, num_missions) + elif mission_order_type == MissionOrder.option_gauntlet: + mission_order = make_gauntlet(num_missions) + elif mission_order_type == MissionOrder.option_blitz: + mission_order = make_blitz(num_missions) + elif mission_order_type == MissionOrder.option_hopscotch: + mission_order = make_hopscotch(world, num_missions) + else: + raise ValueError("Received unknown Mission Order type") + + # Optionally add key requirements + # This only works for layout types that don't define their own entry rules (which is currently all of them) + # Golden Path handles Key Mode on its own + key_mode = world.options.key_mode.value + if key_mode == KeyMode.option_missions: + mission_order[list(mission_order.keys())[0]]["missions"] = [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": "entrances", "entry_rules": [] } + ] + elif key_mode == KeyMode.option_progressive_missions: + mission_order[list(mission_order.keys())[0]]["missions"] = [ + { "index": "all", "entry_rules": [{ "items": { "Progressive Key": 1 }}] }, + { "index": "entrances", "entry_rules": [] } + ] + + return mission_order diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py new file mode 100644 index 00000000..03072594 --- /dev/null +++ b/worlds/sc2/rules.py @@ -0,0 +1,3582 @@ +from math import floor +from typing import TYPE_CHECKING, Set, Optional, Callable, Dict, Tuple, Iterable + +from BaseClasses import CollectionState, Location +from .item.item_groups import kerrigan_non_ulimates, kerrigan_logic_active_abilities +from .item.item_names import PROGRESSIVE_PROTOSS_AIR_WEAPON, PROGRESSIVE_PROTOSS_AIR_ARMOR, PROGRESSIVE_PROTOSS_SHIELDS +from .options import ( + RequiredTactics, + kerrigan_unit_available, + AllInMap, + GrantStoryTech, + GrantStoryLevels, + SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPresence, + MissionOrder, + EnableMorphling, + NovaGhostOfAChanceVariant, + get_enabled_campaigns, + get_enabled_races, +) +from .item.item_tables import ( + tvx_defense_ratings, + tvz_defense_ratings, + tvx_air_defense_ratings, + kerrigan_levels, + get_full_item_list, + zvx_air_defense_ratings, + zvx_defense_ratings, + pvx_defense_ratings, + pvz_defense_ratings, + no_logic_basic_units, + advanced_basic_units, + basic_units, + upgrade_bundle_inverted_lookup, + WEAPON_ARMOR_UPGRADE_MAX_LEVEL, + soa_ultimate_ratings, + soa_energy_ratings, + terran_passive_ratings, + soa_passive_ratings, + zerg_passive_ratings, + protoss_passive_ratings, +) +from .mission_tables import SC2Race, SC2Campaign +from .item import item_groups, item_names + +if TYPE_CHECKING: + from . import SC2World + + +class SC2Logic: + def __init__(self, world: Optional["SC2World"]): + # Note: Don't store a reference to the world so we can cache this object on the world object + self.player = -1 if world is None else world.player + self.logic_level: int = world.options.required_tactics.value if world else RequiredTactics.default + self.advanced_tactics = self.logic_level != RequiredTactics.option_standard + self.take_over_ai_allies = bool(world and world.options.take_over_ai_allies) + self.kerrigan_unit_available = ( + (True if world is None else (world.options.kerrigan_presence.value in kerrigan_unit_available)) + and SC2Campaign.HOTS in get_enabled_campaigns(world) + and SC2Race.ZERG in get_enabled_races(world) + ) + self.kerrigan_levels_per_mission_completed = 0 if world is None else world.options.kerrigan_levels_per_mission_completed.value + self.kerrigan_levels_per_mission_completed_cap = -1 if world is None else world.options.kerrigan_levels_per_mission_completed_cap.value + self.kerrigan_total_level_cap = -1 if world is None else world.options.kerrigan_total_level_cap.value + self.morphling_enabled = False if world is None else (world.options.enable_morphling.value == EnableMorphling.option_true) + self.grant_story_tech = GrantStoryTech.option_no_grant if world is None else (world.options.grant_story_tech.value) + self.story_levels_granted = False if world is None else (world.options.grant_story_levels.value != GrantStoryLevels.option_disabled) + self.basic_terran_units = get_basic_units(self.logic_level, SC2Race.TERRAN) + self.basic_zerg_units = get_basic_units(self.logic_level, SC2Race.ZERG) + self.basic_protoss_units = get_basic_units(self.logic_level, SC2Race.PROTOSS) + self.spear_of_adun_presence = SpearOfAdunPresence.default if world is None else world.options.spear_of_adun_presence.value + self.spear_of_adun_passive_presence = ( + SpearOfAdunPassiveAbilityPresence.default if world is None else world.options.spear_of_adun_passive_ability_presence.value + ) + self.enabled_campaigns = get_enabled_campaigns(world) + self.mission_order = MissionOrder.default if world is None else world.options.mission_order.value + self.generic_upgrade_missions = 0 if world is None else world.options.generic_upgrade_missions.value + self.all_in_map = AllInMap.option_ground if world is None else world.options.all_in_map.value + self.nova_ghost_of_a_chance_variant = NovaGhostOfAChanceVariant.option_wol if world is None else world.options.nova_ghost_of_a_chance_variant.value + self.war_council_upgrades = True if world is None else not world.options.war_council_nerfs.value + self.base_power_rating = 2 if self.advanced_tactics else 0 + + # Must be set externally for accurate logic checking of upgrade level when generic_upgrade_missions is checked + self.total_mission_count = 1 + + # Must be set externally + self.nova_used = True + + # Conditionally set to False by the world after culling items + self.has_barracks_unit: bool = True + self.has_factory_unit: bool = True + self.has_starport_unit: bool = True + self.has_zerg_melee_unit: bool = True + self.has_zerg_ranged_unit: bool = True + self.has_zerg_air_unit: bool = True + self.has_protoss_ground_unit: bool = True + self.has_protoss_air_unit: bool = True + + self.unit_count_functions: Dict[Tuple[SC2Race, int], Callable[[CollectionState], bool]] = {} + """Cache of logic functions used by any_units logic level""" + + # Super Globals + + def is_item_placement(self, state: CollectionState) -> bool: + """ + Tells if it's item placement or item pool filter + :return: True for item placement, False for pool filter + """ + # has_group with count = 0 is always true for item placement and always false for SC2 item filtering + return state.has_group("Missions", self.player, 0) + + def get_very_hard_required_upgrade_level(self): + return 2 if self.advanced_tactics else 3 + + def weapon_armor_upgrade_count(self, upgrade_item: str, state: CollectionState) -> int: + assert upgrade_item in upgrade_bundle_inverted_lookup.keys() + count: int = 0 + if self.generic_upgrade_missions > 0: + if (not self.is_item_placement(state)) or self.logic_level == RequiredTactics.option_no_logic: + # Item pool filtering, W/A upgrades aren't items + # No Logic: Don't care about W/A in this case + return WEAPON_ARMOR_UPGRADE_MAX_LEVEL + else: + count += floor((100 / self.generic_upgrade_missions) * (state.count_group("Missions", self.player) / self.total_mission_count)) + count += state.count(upgrade_item, self.player) + count += state.count_from_list(upgrade_bundle_inverted_lookup[upgrade_item], self.player) + if upgrade_item == item_names.PROGRESSIVE_PROTOSS_SHIELDS: + count += max( + state.count(item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, self.player), + state.count(item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE, self.player), + ) + if upgrade_item in item_groups.protoss_generic_upgrades and state.has(item_names.QUATRO, self.player): + count += 1 + return count + + def soa_power_rating(self, state: CollectionState): + power_rating = 0 + # Spear of Adun Ultimates (Strongest) + for item, rating in soa_ultimate_ratings.items(): + if state.has(item, self.player): + power_rating += rating + break + # Spear of Adun ability that consumes energy (Strongest, then second strongest) + found_main_weapon = False + for item, rating in soa_energy_ratings.items(): + count = 1 + if item == item_names.SOA_PROGRESSIVE_PROXY_PYLON: + count = 2 + if state.has(item, self.player, count): + if not found_main_weapon: + power_rating += rating + found_main_weapon = True + else: + power_rating += rating // 2 + break + # Mass Recall (Negligible energy cost) + if state.has(item_names.SOA_MASS_RECALL, self.player): + power_rating += 2 + return power_rating + + # Global Terran + + def terran_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in terran_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere: + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def terran_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + """ + Minimum W/A upgrade level for unit classes present in the world + """ + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + if self.has_barracks_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, state), + ) + if self.has_factory_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, state), + ) + if self.has_starport_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, state), + ) + return count + + def terran_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.terran_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + # WoL + def terran_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_terran_units, self.player) + + def terran_early_tech(self, state: CollectionState): + """ + Basic combat unit that can be deployed quickly from mission start + :param state + :return: + """ + return state.has_any( + {item_names.MARINE, item_names.DOMINION_TROOPER, item_names.FIREBAT, item_names.MARAUDER, item_names.REAPER, item_names.HELLION}, + self.player, + ) or ( + self.advanced_tactics and state.has_any({item_names.GOLIATH, item_names.DIAMONDBACK, item_names.VIKING, item_names.BANSHEE}, self.player) + ) + + def terran_air(self, state: CollectionState) -> bool: + """ + Air units or drops on advanced tactics + """ + return ( + state.has_any({item_names.VIKING, item_names.WRAITH, item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or ( + self.advanced_tactics + and ( + (state.has_any({item_names.HERCULES, item_names.MEDIVAC}, self.player) and self.terran_common_unit(state)) + or (state.has_all((item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON), self.player)) + ) + ) + ) + + def terran_air_anti_air(self, state: CollectionState) -> bool: + """ + Air-to-air + """ + return ( + state.has(item_names.VIKING, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or ( + self.advanced_tactics + and state.has_any({item_names.WRAITH, item_names.VALKYRIE, item_names.BATTLECRUISER}, self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + ) + + def terran_any_air_unit(self, state: CollectionState) -> bool: + return state.has_any( + { + item_names.VIKING, + item_names.MEDIVAC, + item_names.RAVEN, + item_names.BANSHEE, + item_names.SCIENCE_VESSEL, + item_names.BATTLECRUISER, + item_names.WRAITH, + item_names.HERCULES, + item_names.LIBERATOR, + item_names.VALKYRIE, + item_names.SKY_FURY, + item_names.NIGHT_HAWK, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_WOLF, + item_names.PRIDE_OF_AUGUSTRGRAD, + }, + self.player, + ) + + def terran_competent_ground_to_air(self, state: CollectionState) -> bool: + """ + Ground-to-air + """ + return ( + state.has(item_names.GOLIATH, self.player) + or ( + state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER}, self.player) + and self.terran_bio_heal(state) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state) >= 2 + ) + or self.advanced_tactics + and ( + state.has(item_names.CYCLONE, self.player) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + ) + ) + + def terran_competent_anti_air(self, state: CollectionState) -> bool: + """ + Good AA unit + """ + return self.terran_competent_ground_to_air(state) or self.terran_air_anti_air(state) + + def terran_any_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + # Barracks + item_names.MARINE, + item_names.WAR_PIGS, + item_names.SON_OF_KORHAL, + item_names.DOMINION_TROOPER, + item_names.GHOST, + item_names.SPECTRE, + item_names.EMPERORS_SHADOW, + # Factory + item_names.GOLIATH, + item_names.SPARTAN_COMPANY, + item_names.BULWARK_COMPANY, + item_names.CYCLONE, + item_names.WIDOW_MINE, + item_names.THOR, + item_names.JOTUN, + item_names.BLACKHAMMER, + # Ships + item_names.WRAITH, + item_names.WINGED_NIGHTMARES, + item_names.NIGHT_HAWK, + item_names.VIKING, + item_names.HELS_ANGELS, + item_names.SKY_FURY, + item_names.LIBERATOR, + item_names.MIDNIGHT_RIDERS, + item_names.EMPERORS_GUARDIAN, + item_names.VALKYRIE, + item_names.BRYNHILDS, + item_names.BATTLECRUISER, + item_names.JACKSONS_REVENGE, + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.RAVEN, + # Buildings + item_names.MISSILE_TURRET, + ), + self.player, + ) + or state.has_all((item_names.REAPER, item_names.REAPER_JET_PACK_OVERDRIVE), self.player) + or state.has_all((item_names.PLANETARY_FORTRESS, item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS), self.player) + or ( + state.has(item_names.MEDIVAC, self.player) + and state.has_any((item_names.SIEGE_TANK, item_names.SIEGE_BREAKERS, item_names.SHOCK_DIVISION), self.player) + and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 + ) + ) + + def terran_any_anti_air_or_science_vessels(self, state: CollectionState) -> bool: + return self.terran_any_anti_air(state) or state.has(item_names.SCIENCE_VESSEL, self.player) + + def terran_moderate_anti_air(self, state: CollectionState) -> bool: + return self.terran_competent_anti_air(state) or ( + state.has_any( + ( + item_names.MARINE, + item_names.DOMINION_TROOPER, + item_names.THOR, + item_names.CYCLONE, + item_names.BATTLECRUISER, + item_names.WRAITH, + item_names.VALKYRIE, + ), + self.player, + ) + or ( + state.has_all((item_names.MEDIVAC, item_names.SIEGE_TANK), self.player) + and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 + ) + or (self.advanced_tactics and state.has_any((item_names.GHOST, item_names.SPECTRE, item_names.LIBERATOR), self.player)) + ) + + def terran_basic_anti_air(self, state: CollectionState) -> bool: + """ + Basic AA to deal with few air units + """ + return ( + state.has_any( + ( + item_names.MISSILE_TURRET, + item_names.WAR_PIGS, + item_names.SPARTAN_COMPANY, + item_names.HELS_ANGELS, + item_names.WINGED_NIGHTMARES, + item_names.BRYNHILDS, + item_names.SKY_FURY, + item_names.SON_OF_KORHAL, + item_names.BULWARK_COMPANY, + ), + self.player, + ) + or self.terran_moderate_anti_air(state) + or self.advanced_tactics + and ( + state.has_any( + ( + item_names.WIDOW_MINE, + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.BLACKHAMMER, + item_names.EMPERORS_SHADOW, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_HAWK, + ), + self.player, + ) + ) + ) + + def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + :param air_enemy: Whether the enemy attacks with air + :return: + """ + defense_score = sum((tvx_defense_ratings[item] for item in tvx_defense_ratings if state.has(item, self.player))) + # Manned Bunker + if state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) and state.has( + item_names.BUNKER, self.player + ): + defense_score += 3 + elif zerg_enemy and state.has(item_names.FIREBAT, self.player) and state.has(item_names.BUNKER, self.player): + defense_score += 2 + # Siege Tank upgrades + if state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_MAELSTROM_ROUNDS}, self.player): + defense_score += 2 + if state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_GRADUATING_RANGE}, self.player): + defense_score += 1 + # Widow Mine upgrade + if state.has_all({item_names.WIDOW_MINE, item_names.WIDOW_MINE_CONCEALMENT}, self.player): + defense_score += 1 + # Viking with splash + if state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player): + defense_score += 2 + + # General enemy-based rules + if zerg_enemy: + defense_score += sum((tvz_defense_ratings[item] for item in tvz_defense_ratings if state.has(item, self.player))) + if air_enemy: + # Capped at 2 + defense_score += min(sum((tvx_air_defense_ratings[item] for item in tvx_air_defense_ratings if state.has(item, self.player))), 2) + if air_enemy and zerg_enemy and state.has(item_names.VALKYRIE, self.player): + # Valkyries shred mass Mutas, the most common air enemy that's massed in these cases + defense_score += 2 + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def terran_competent_comp(self, state: CollectionState) -> bool: + # All competent comps require anti-air + if not self.terran_competent_anti_air(state): + return False + # Infantry with Healing + infantry_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state) + infantry_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, state) + infantry = state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + if infantry_weapons >= 2 and infantry_armor >= 1 and infantry and self.terran_bio_heal(state): + return True + # Mass Air-To-Ground + ship_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) + ship_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, state) + if ship_weapons >= 1 and ship_armor >= 1: + air = ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or state.has_all({item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES}, self.player) + and ship_weapons >= 2 + ) + if air and self.terran_mineral_dump(state): + return True + # Strong Mech + vehicle_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, state) + vehicle_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, state) + if vehicle_weapons >= 1 and vehicle_armor >= 1: + strong_vehicle = state.has_any({item_names.THOR, item_names.SIEGE_TANK}, self.player) + light_frontline = state.has_any( + {item_names.MARINE, item_names.DOMINION_TROOPER, item_names.HELLION, item_names.VULTURE}, self.player + ) or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + if strong_vehicle and light_frontline: + return True + # Mech with Healing + vehicle = state.has_any({item_names.GOLIATH, item_names.WARHOUND}, self.player) + micro_gas_vehicle = self.advanced_tactics and state.has_any({item_names.DIAMONDBACK, item_names.CYCLONE}, self.player) + if self.terran_sustainable_mech_heal(state) and (vehicle or (micro_gas_vehicle and light_frontline)): + return True + return False + + def terran_mineral_dump(self, state: CollectionState) -> bool: + """ + Can build something using only minerals + """ + return ( + state.has_any({item_names.MARINE, item_names.VULTURE, item_names.HELLION, item_names.SON_OF_KORHAL}, self.player) + or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + or (self.advanced_tactics and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET}, self.player)) + ) + + def terran_beats_protoss_deathball(self, state: CollectionState) -> bool: + """ + Ability to deal with Immortals, Colossi with some air support + """ + return ( + ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + and self.terran_competent_anti_air(state) + or self.terran_competent_comp(state) + and self.terran_air_anti_air(state) + ) and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + + def marine_medic_upgrade(self, state: CollectionState) -> bool: + """ + Infantry upgrade to infantry-only no-build segments + """ + return ( + state.has_any({item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_MAGRAIL_MUNITIONS, item_names.MEDIC_STABILIZER_MEDPACKS}, self.player) + or (state.count(item_names.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2 and state.has_group("Missions", self.player, 1)) + or self.advanced_tactics + and state.has(item_names.MARINE_LASER_TARGETING_SYSTEM, self.player) + ) + + def marine_medic_firebat_upgrade(self, state: CollectionState) -> bool: + return ( + self.marine_medic_upgrade(state) + or state.count(item_names.FIREBAT_PROGRESSIVE_STIMPACK, self.player) >= 2 + or state.has_any((item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING), self.player) + ) + + def terran_bio_heal(self, state: CollectionState) -> bool: + """ + Ability to heal bio units + """ + return state.has_any({item_names.MEDIC, item_names.MEDIVAC, item_names.FIELD_RESPONSE_THETA}, self.player) or ( + self.advanced_tactics and state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) + ) + + def terran_base_trasher(self, state: CollectionState) -> bool: + """ + Can attack heavily defended bases + """ + if not self.terran_competent_comp(state): + return False + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + return ( + state.has_all((item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS), self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or ( + self.advanced_tactics + and (state.has_all({item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON}, self.player)) + and ( + state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has_all({item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY}, self.player) + ) + ) + ) + + def terran_mobile_detector(self, state: CollectionState) -> bool: + return state.has_any({item_names.RAVEN, item_names.SCIENCE_VESSEL, item_names.COMMAND_CENTER_SCANNER_SWEEP}, self.player) + + def can_nuke(self, state: CollectionState) -> bool: + """ + Ability to launch nukes + """ + return self.advanced_tactics and ( + state.has_any({item_names.GHOST, item_names.SPECTRE}, self.player) + or state.has_all({item_names.THOR, item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT}, self.player) + ) + + def terran_sustainable_mech_heal(self, state: CollectionState) -> bool: + """ + Can heal mech units without spending resources + """ + return ( + state.has(item_names.SCIENCE_VESSEL, self.player) + or ( + state.has_any({item_names.MEDIC, item_names.FIELD_RESPONSE_THETA}, self.player) + and state.has(item_names.MEDIC_ADAPTIVE_MEDPACKS, self.player) + ) + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 + or ( + self.advanced_tactics + and ( + state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2 + ) + ) + ) + + def terran_cliffjumper(self, state: CollectionState) -> bool: + return ( + state.has(item_names.REAPER, self.player) + or state.has_all({item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, self.player) + or state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS}, self.player) + ) + + def nova_any_nobuild_damage(self, state: CollectionState) -> bool: + return state.has_any( + ( + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_DOMINATION, + ), + self.player, + ) + + def nova_any_weapon(self, state: CollectionState) -> bool: + return state.has_any( + { + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + }, + self.player, + ) + + def nova_ranged_weapon(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_HELLFIRE_SHOTGUN, item_names.NOVA_PLASMA_RIFLE}, self.player) + + def nova_anti_air_weapon(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_PLASMA_RIFLE, item_names.NOVA_BLAZEFIRE_GUNBLADE}, self.player) + + def nova_splash(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_HELLFIRE_SHOTGUN, item_names.NOVA_PULSE_GRENADES}, self.player) or ( + self.advanced_tactics and state.has_any({item_names.NOVA_PLASMA_RIFLE, item_names.NOVA_MONOMOLECULAR_BLADE}, self.player) + ) + + def nova_dash(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_MONOMOLECULAR_BLADE, item_names.NOVA_BLINK}, self.player) + + def nova_full_stealth(self, state: CollectionState) -> bool: + return state.count(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) >= 2 + + def nova_heal(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_ARMORED_SUIT_MODULE, item_names.NOVA_STIM_INFUSION}, self.player) + + def nova_escape_assist(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_BLINK, item_names.NOVA_HOLO_DECOY, item_names.NOVA_IONIC_FORCE_FIELD}, self.player) + + def nova_beat_stone(self, state: CollectionState) -> bool: + """ + Used for any units logic for beating Stone. Shotgun may not be possible; may need feedback. + """ + return ( + state.has_any(( + item_names.NOVA_DOMINATION, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + item_names.NOVA_C20A_CANISTER_RIFLE, + ), self.player) + or (( + state.has_any(( + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + ), self.player) + or state.has_all(( + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_STIM_INFUSION + ), self.player) + ) + and state.has_any(( + item_names.NOVA_JUMP_SUIT_MODULE, + item_names.NOVA_ARMORED_SUIT_MODULE, + item_names.NOVA_ENERGY_SUIT_MODULE, + ), self.player) + and state.has_any(( + item_names.NOVA_FLASHBANG_GRENADES, + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_BLINK, + item_names.NOVA_IONIC_FORCE_FIELD, + ), self.player) + ) + ) + + # Global Zerg + def zerg_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in zerg_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere: + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def zerg_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + :param air_enemy: Whether the enemy attacks with air + """ + defense_score = sum((zvx_defense_ratings[item] for item in zvx_defense_ratings if state.has(item, self.player))) + # Twin Drones + if state.has(item_names.TWIN_DRONES, self.player): + if state.has(item_names.SPINE_CRAWLER, self.player): + defense_score += 1 + if state.has(item_names.SPORE_CRAWLER, self.player) and air_enemy: + defense_score += 1 + # Impaler + if self.morph_impaler(state): + defense_score += 3 + if state.has(item_names.IMPALER_SUNKEN_SPINES, self.player): + defense_score += 1 + if zerg_enemy: + defense_score += -1 + # Lurker + if self.morph_lurker(state): + defense_score += 2 + if state.has(item_names.LURKER_SEISMIC_SPINES, self.player): + defense_score += 2 + if state.has(item_names.LURKER_ADAPTED_SPINES, self.player) and not zerg_enemy: + defense_score += 1 + if zerg_enemy: + defense_score += 1 + # Brood Lord + if self.morph_brood_lord(state): + defense_score += 2 + # Corpser Roach + if state.has_all({item_names.ROACH, item_names.ROACH_CORPSER_STRAIN}, self.player): + defense_score += 1 + if zerg_enemy: + defense_score += 1 + # Igniter + if self.morph_igniter(state) and zerg_enemy: + defense_score += 2 + # Creep Tumors + if self.spread_creep(state, False): + if not zerg_enemy: + defense_score += 1 + if state.has(item_names.MALIGNANT_CREEP, self.player): + defense_score += 1 + # Infested Siege Tanks + if self.zerg_infested_tank_with_ammo(state): + defense_score += 5 + # Infested Liberators + if state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE), self.player): + defense_score += 3 + # Bile Launcher upgrades + if state.has_all((item_names.BILE_LAUNCHER, item_names.BILE_LAUNCHER_RAPID_BOMBARMENT), self.player): + defense_score += 2 + + # General enemy-based rules + if air_enemy: + # Capped at 2 + defense_score += min(sum((zvx_air_defense_ratings[item] for item in zvx_air_defense_ratings if state.has(item, self.player))), 2) + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def zerg_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + if self.has_zerg_melee_unit: + count = min(count, self.zerg_melee_weapon_armor_upgrade_min_level(state)) + if self.has_zerg_ranged_unit: + count = min(count, self.zerg_ranged_weapon_armor_upgrade_min_level(state)) + if self.has_zerg_air_unit: + count = min(count, self.zerg_flyer_weapon_armor_upgrade_min_level(state)) + return count + + def zerg_melee_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), + ) + + def zerg_ranged_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), + ) + + def zerg_flyer_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE, state), + ) + + def zerg_can_collect_pickup_across_gap(self, state: CollectionState) -> bool: + """Any way for zerg to get any ground unit across gaps longer than viper yoink range to collect a pickup.""" + return ( + state.has_any( + ( + item_names.NYDUS_WORM, + item_names.ECHIDNA_WORM, + item_names.OVERLORD_VENTRAL_SACS, + item_names.YGGDRASIL, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or (self.morph_ravager(state) and state.has(item_names.RAVAGER_DEEP_TUNNEL, self.player)) + or state.has_all( + ( + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL, + item_names.OVERLORD_GENERATE_CREEP, + ), + self.player, + ) + or state.has_all((item_names.SWARM_QUEEN_DEEP_TUNNEL, item_names.OVERLORD_OVERSEER_ASPECT), self.player) # Deep tunnel to a creep tumor + ) + + def zerg_has_infested_scv(self, state: CollectionState) -> bool: + return ( + state.has_any(( + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_BANSHEE, + item_names.BULLFROG, + item_names.INFESTED_LIBERATOR, + item_names.INFESTED_MISSILE_TURRET, + ), self.player) + ) + + def zerg_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.zerg_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + def zerg_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_zerg_units, self.player) + + def zerg_competent_anti_air(self, state: CollectionState) -> bool: + return state.has_any({item_names.HYDRALISK, item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN}, self.player) or ( + self.advanced_tactics and state.has(item_names.INFESTOR, self.player) + ) + + def zerg_moderate_anti_air(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_anti_air(state) + or self.zerg_basic_air_to_air(state) + or ( + state.has(item_names.SWARM_QUEEN, self.player) + or state.has_all({item_names.SWARM_HOST, item_names.SWARM_HOST_PRESSURIZED_GLANDS}, self.player) + or (self.spread_creep(state, True) and state.has(item_names.INFESTED_BUNKER, self.player)) + ) + or (self.advanced_tactics and state.has(item_names.INFESTED_MARINE, self.player)) + ) + + def zerg_kerrigan_or_any_anti_air(self, state: CollectionState) -> bool: + return self.kerrigan_unit_available or self.zerg_any_anti_air(state) + + def zerg_any_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + item_names.HYDRALISK, + item_names.SWARM_QUEEN, + item_names.BROOD_QUEEN, + item_names.MUTALISK, + item_names.CORRUPTOR, + item_names.SCOURGE, + item_names.INFESTOR, + item_names.INFESTED_MARINE, + item_names.INFESTED_LIBERATOR, + item_names.SPORE_CRAWLER, + item_names.INFESTED_MISSILE_TURRET, + item_names.INFESTED_BUNKER, + item_names.HUNTER_KILLERS, + item_names.CAUSTIC_HORRORS, + ), + self.player, + ) + or state.has_all((item_names.SWARM_HOST, item_names.SWARM_HOST_PRESSURIZED_GLANDS), self.player) + or state.has_all((item_names.ABERRATION, item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH), self.player) + or state.has_all((item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE), self.player) + or self.morph_ravager(state) + or self.morph_viper(state) + or self.morph_devourer(state) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + ) + + def zerg_basic_anti_air(self, state: CollectionState) -> bool: + return self.zerg_basic_kerriganless_anti_air(state) or self.kerrigan_unit_available + + def zerg_basic_kerriganless_anti_air(self, state: CollectionState) -> bool: + return ( + self.zerg_moderate_anti_air(state) + or state.has_any((item_names.HUNTER_KILLERS, item_names.CAUSTIC_HORRORS), self.player) + or (self.advanced_tactics and state.has_any({item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET}, self.player)) + ) + + def zerg_basic_air_to_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + {item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.SCOURGE, item_names.INFESTED_LIBERATOR}, self.player + ) + or self.morph_devourer(state) + or self.morph_viper(state) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + ) + + def zerg_basic_air_to_ground(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_guardian(state) + or self.morph_brood_lord(state) + or (self.morph_devourer(state) and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player)) + ) + + def zerg_versatile_air(self, state: CollectionState) -> bool: + return self.zerg_basic_air_to_air(state) and self.zerg_basic_air_to_ground(state) + + def zerg_infested_tank_with_ammo(self, state: CollectionState) -> bool: + return state.has(item_names.INFESTED_SIEGE_TANK, self.player) and ( + state.has_all({item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN}, self.player) + or state.has(item_names.INFESTED_BUNKER, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTED_MARINE, self.player)) + or state.count(item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS, self.player) >= (1 if self.advanced_tactics else 2) + ) + + def morph_baneling(self, state: CollectionState) -> bool: + return (state.has(item_names.ZERGLING, self.player) or self.morphling_enabled) and state.has(item_names.ZERGLING_BANELING_ASPECT, self.player) + + def morph_ravager(self, state: CollectionState) -> bool: + return (state.has(item_names.ROACH, self.player) or self.morphling_enabled) and state.has(item_names.ROACH_RAVAGER_ASPECT, self.player) + + def morph_brood_lord(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, self.player + ) + + def morph_guardian(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, self.player + ) + + def morph_viper(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, self.player + ) + + def morph_devourer(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, self.player + ) + + def morph_impaler(self, state: CollectionState) -> bool: + return (state.has(item_names.HYDRALISK, self.player) or self.morphling_enabled) and state.has( + item_names.HYDRALISK_IMPALER_ASPECT, self.player + ) + + def morph_lurker(self, state: CollectionState) -> bool: + return (state.has(item_names.HYDRALISK, self.player) or self.morphling_enabled) and state.has(item_names.HYDRALISK_LURKER_ASPECT, self.player) + + def morph_impaler_or_lurker(self, state: CollectionState) -> bool: + return self.morph_impaler(state) or self.morph_lurker(state) + + def morph_igniter(self, state: CollectionState) -> bool: + return (state.has(item_names.ROACH, self.player) or self.morphling_enabled) and state.has(item_names.ROACH_PRIMAL_IGNITER_ASPECT, self.player) + + def morph_tyrannozor(self, state: CollectionState) -> bool: + return state.has(item_names.ULTRALISK_TYRANNOZOR_ASPECT, self.player) and ( + state.has(item_names.ULTRALISK, self.player) or self.morphling_enabled + ) + + def zerg_competent_comp(self, state: CollectionState) -> bool: + if self.zerg_army_weapon_armor_upgrade_min_level(state) < 2: + return False + advanced = self.advanced_tactics + core_unit = state.has_any( + {item_names.ROACH, item_names.ABERRATION, item_names.ZERGLING, item_names.INFESTED_DIAMONDBACK}, self.player + ) or self.morph_igniter(state) + support_unit = ( + state.has_any({item_names.SWARM_QUEEN, item_names.HYDRALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_brood_lord(state) + or state.has_all((item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + or advanced + and (state.has_any({item_names.INFESTOR, item_names.DEFILER}, self.player) or self.morph_viper(state)) + ) + if core_unit and support_unit: + return True + vespene_unit = ( + state.has_any({item_names.ULTRALISK, item_names.ABERRATION}, self.player) + or ( + self.morph_guardian(state) + and state.has_any( + (item_names.GUARDIAN_SORONAN_ACID, item_names.GUARDIAN_EXPLOSIVE_SPORES, item_names.GUARDIAN_PRIMORDIAL_FURY), self.player + ) + ) + or advanced + and self.morph_viper(state) + ) + return vespene_unit and state.has_any({item_names.ZERGLING, item_names.SWARM_QUEEN}, self.player) + + def zerg_common_unit_basic_aa(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_basic_anti_air(state) + + def zerg_common_unit_competent_aa(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) + + def zerg_competent_comp_basic_aa(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_basic_anti_air(state) + + def zerg_competent_comp_competent_aa(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) + + def spread_creep(self, state: CollectionState, free_creep_tumor=True) -> bool: + return (self.advanced_tactics and free_creep_tumor) or state.has_any( + {item_names.SWARM_QUEEN, item_names.OVERLORD_OVERSEER_ASPECT}, self.player + ) + + def zerg_mineral_dump(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.ZERGLING, item_names.PYGALISK, item_names.INFESTED_BUNKER}, self.player) + or state.has_all({item_names.SWARM_QUEEN, item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY}, self.player) + or (self.advanced_tactics and self.spread_creep(state) and state.has(item_names.SPINE_CRAWLER, self.player)) + ) + + def zerg_big_monsters(self, state: CollectionState) -> bool: + """ + Durable units with some capacity for damage + """ + return ( + self.morph_tyrannozor(state) + or state.has_any((item_names.ABERRATION, item_names.ULTRALISK), self.player) + or (self.spread_creep(state, False) and state.has(item_names.INFESTED_BUNKER, self.player)) + ) + + def zerg_base_buster(self, state: CollectionState) -> bool: + """Powerful and sustainable zerg anti-ground for busting big bases; anti-air not included""" + if not self.zerg_competent_comp(state): + return False + return ( + ( + self.zerg_melee_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_tyrannozor(state) + or ( + state.has(item_names.ULTRALISK, self.player) + and state.has_any((item_names.ULTRALISK_TORRASQUE_STRAIN, item_names.ULTRALISK_CHITINOUS_PLATING), self.player) + ) + or (self.morph_baneling(state) and state.has(item_names.BANELING_SPLITTER_STRAIN, self.player)) + ) + and state.has(item_names.SWARM_QUEEN, self.player) # Healing to sustain the frontline + ) + or ( + self.zerg_ranged_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_impaler(state) + or self.morph_lurker(state) + and state.has_all((item_names.LURKER_SEISMIC_SPINES, item_names.LURKER_ADAPTED_SPINES), self.player) + or state.has_all( + ( + item_names.ROACH, + item_names.ROACH_CORPSER_STRAIN, + item_names.ROACH_ADAPTIVE_PLATING, + item_names.ROACH_GLIAL_RECONSTITUTION, + ), + self.player, + ) + or self.morph_igniter(state) + and state.has(item_names.PRIMAL_IGNITER_PRIMAL_TENACITY, self.player) + or state.has_all((item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN), self.player) + or self.spread_creep(state, False) + and state.has(item_names.INFESTED_BUNKER, self.player) + or self.zerg_infested_tank_with_ammo(state) + # Highly-upgraded swarm hosts may also work, but that would require promoting many upgrades to progression + ) + ) + or ( + self.zerg_flyer_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_brood_lord(state) + or self.morph_guardian(state) + and state.has_all((item_names.GUARDIAN_PROPELLANT_SACS, item_names.GUARDIAN_SORONAN_ACID), self.player) + or state.has_all((item_names.INFESTED_BANSHEE, item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS), self.player) + # Highly-upgraded anti-ground devourers would also be good + ) + ) + ) + + def zergling_hydra_roach_start(self, state: CollectionState): + """ + Created mainly for engine of destruction start, but works for other missions with no-build starts. + """ + return state.has_any( + { + item_names.ZERGLING_ADRENAL_OVERLOAD, + item_names.HYDRALISK_FRENZY, + item_names.ROACH_HYDRIODIC_BILE, + item_names.ZERGLING_RAPTOR_STRAIN, + item_names.ROACH_CORPSER_STRAIN, + }, + self.player, + ) + + def kerrigan_levels(self, state: CollectionState, target: int, story_levels_available=True) -> bool: + if (story_levels_available and self.story_levels_granted) or not self.kerrigan_unit_available: + return True # Levels are granted + if ( + self.kerrigan_levels_per_mission_completed > 0 + and self.kerrigan_levels_per_mission_completed_cap != 0 + and not self.is_item_placement(state) + ): + # Levels can be granted from mission completion. + # Item pool filtering isn't aware of missions beaten. Assume that missions beaten will fulfill this rule. + return True + # Levels from missions beaten + levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player) + if self.kerrigan_levels_per_mission_completed_cap != -1: + levels = min(levels, self.kerrigan_levels_per_mission_completed_cap) + # Levels from items + for kerrigan_level_item in kerrigan_levels: + level_amount = get_full_item_list()[kerrigan_level_item].number + item_count = state.count(kerrigan_level_item, self.player) + levels += item_count * level_amount + # Total level cap + if self.kerrigan_total_level_cap != -1: + levels = min(levels, self.kerrigan_total_level_cap) + + return levels >= target + + def basic_kerrigan(self, state: CollectionState) -> bool: + # One active ability that can be used to defeat enemies directly on Standard + if not state.has_any( + ( + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_PSIONIC_SHIFT, + item_names.KERRIGAN_CRUSHING_GRIP, + ), + self.player, + ): + return False + # Two non-ultimate abilities + count = 0 + for item in kerrigan_non_ulimates: + if state.has(item, self.player): + count += 1 + if count >= 2: + return True + return False + + def two_kerrigan_actives(self, state: CollectionState) -> bool: + count = 0 + for i in range(7): + if state.has_any(kerrigan_logic_active_abilities, self.player): + count += 1 + return count >= 2 + + # Global Protoss + def protoss_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # War Council Upgrades (all units are improved) + if self.war_council_upgrades: + power_score += 3 + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in protoss_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence in (SpearOfAdunPresence.option_everywhere, SpearOfAdunPresence.option_protoss): + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence in (SpearOfAdunPassiveAbilityPresence.option_everywhere, SpearOfAdunPresence.option_protoss): + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def protoss_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + 1 # +1 for Quatro + if self.has_protoss_ground_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, state), + ) + if self.has_protoss_air_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, state), + ) + if self.has_protoss_ground_unit or self.has_protoss_air_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_SHIELDS, state), + ) + return count + + def protoss_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.protoss_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + def protoss_defense_rating(self, state: CollectionState, zerg_enemy: bool) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + """ + defense_score = sum((pvx_defense_ratings[item] for item in pvx_defense_ratings if state.has(item, self.player))) + # Vanguard + rapid fire + if state.has_all((item_names.VANGUARD, item_names.VANGUARD_RAPIDFIRE_CANNON), self.player): + defense_score += 1 + # Fire Colossus + if state.has_all((item_names.COLOSSUS, item_names.COLOSSUS_FIRE_LANCE), self.player): + defense_score += 2 + if zerg_enemy: + defense_score += 2 + if ( + state.has_any((item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH, item_names.NEXUS_OVERCHARGE), self.player) + and state.has(item_names.SHIELD_BATTERY, self.player) + ): + defense_score += 2 + + # No anti-air defense dict here, use an existing logic rule instead + if zerg_enemy: + defense_score += sum((pvz_defense_ratings[item] for item in pvz_defense_ratings if state.has(item, self.player))) + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def protoss_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_protoss_units, self.player) + + def protoss_any_gap_transport(self, state: CollectionState) -> bool: + """Can get ground units across large gaps, larger than blink range""" + return ( + state.has_any( + ( + item_names.WARP_PRISM, + item_names.ARBITER, + ), + self.player, + ) + or state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player, count=2) + or state.has_all((item_names.MISTWING, item_names.MISTWING_PILOT), self.player) + or ( + state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player) + and ( + state.has_any(item_groups.gateway_units + [item_names.ELDER_PROBES, item_names.PROBE_WARPIN], self.player) + or (state.has(item_names.WARP_HARMONIZATION, self.player) and state.has_any(item_groups.protoss_ground_wa, self.player)) + ) + ) + ) + + def protoss_any_anti_air_unit_or_soa_any_protoss(self, state: CollectionState) -> bool: + return self.protoss_any_anti_air_unit(state) or ( + self.spear_of_adun_presence in (SpearOfAdunPresence.option_everywhere, SpearOfAdunPresence.option_protoss) + and self.protoss_any_anti_air_soa(state) + ) + + def protoss_any_anti_air_unit_or_soa(self, state: CollectionState) -> bool: + return self.protoss_any_anti_air_unit(state) or self.protoss_any_anti_air_soa(state) + + def protoss_any_anti_air_soa(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_SOLAR_BOMBARDMENT, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_PYLON_OVERCHARGE, + ), + self.player, + ) + or state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player, 2) # Warp-In Reinforcements + ) + + def protoss_any_anti_air_unit(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + # Gateway + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.DRAGOON, + item_names.ADEPT, + item_names.SENTRY, + item_names.ENERGIZER, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + # Robo + item_names.ANNIHILATOR, + # Stargate + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.SCOUT, + item_names.MISTWING, + item_names.CALADRIUS, + item_names.OPPRESSOR, + item_names.ARBITER, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.MOTHERSHIP, + # Buildings + item_names.NEXUS_OVERCHARGE, + item_names.PHOTON_CANNON, + item_names.KHAYDARIN_MONOLITH, + ), + self.player, + ) + or state.has_all((item_names.SUPPLICANT, item_names.SUPPLICANT_ZENITH_PITCH), self.player) + or state.has_all((item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER), self.player) + or state.has_all((item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING), self.player) + or state.has_all((item_names.DISRUPTOR, item_names.DISRUPTOR_PERFECTED_POWER), self.player) + or state.has_all((item_names.IMMORTAL, item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING), self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + or state.has_all((item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM), self.player) + or ( + state.has(item_names.DARK_TEMPLAR, self.player) + and state.has_any((item_names.DARK_TEMPLAR_DARK_ARCHON_MELD, item_names.DARK_TEMPLAR_ARCHON_MERGE), self.player) + ) + ) + + def protoss_basic_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.SCOUT, + item_names.DARK_ARCHON, + item_names.MOTHERSHIP, + item_names.MISTWING, + item_names.CALADRIUS, + item_names.OPPRESSOR, + item_names.PULSAR, + item_names.DRAGOON, + }, + self.player, + ) + or state.has_all({item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM}, self.player) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + or state.has_all({item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER}, self.player) + or self.advanced_tactics + and state.has_any({item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.SENTRY, item_names.ENERGIZER}, self.player) + or self.protoss_can_merge_archon(state) + or self.protoss_can_merge_dark_archon(state) + ) + + def protoss_anti_armor_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any((item_names.SCOUT, item_names.MISTWING, item_names.DRAGOON), self.player) + or ( + state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + ) + + def protoss_anti_light_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + + def protoss_moderate_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or self.protoss_anti_light_anti_air(state) + or self.protoss_anti_armor_anti_air(state) + or state.has(item_names.SKYLORD, self.player) + ) + + def protoss_common_unit_basic_aa(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_basic_anti_air(state) + + def protoss_common_unit_anti_light_air(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_anti_light_anti_air(state) + + def protoss_common_unit_anti_armor_air(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) + + def protoss_competent_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + { + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.ADEPT, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.TEMPEST, + item_names.CALADRIUS, + }, + self.player, + ) + or ( + ( + state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + and ( + state.has_any((item_names.SCOUT, item_names.MISTWING, item_names.DRAGOON), self.player) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + or ( + state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + ) + ) + or ( + self.advanced_tactics + and state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + ) + + def protoss_has_blink(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.STALKER, item_names.INSTIGATOR}, self.player) + or state.has_all({item_names.SLAYER, item_names.SLAYER_PHASE_BLINK}, self.player) + or ( + state.has(item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) + and state.has_any({item_names.DARK_TEMPLAR, item_names.BLOOD_HUNTER, item_names.AVENGER}, self.player) + ) + ) + + def protoss_fleet(self, state: CollectionState) -> bool: + return ( + ( + state.has_any( + { + item_names.CARRIER, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.VOID_RAY, + item_names.DESTROYER, + }, + self.player, + ) + ) + or ( + state.has_all((item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM), self.player) + and ( + state.has_any((item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR), self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + ) + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_AIR_WEAPON, state) >= 2 + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_AIR_ARMOR, state) >= 2 + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_SHIELDS, state) >= 2 + ) + + def protoss_hybrid_counter(self, state: CollectionState) -> bool: + """ + Ground Hybrids + """ + return ( + state.has_any( + { + item_names.ANNIHILATOR, + item_names.ASCENDANT, + item_names.TEMPEST, + item_names.CARRIER, + item_names.TRIREME, + item_names.VOID_RAY, + item_names.WRATHWALKER, + }, + self.player, + ) + or state.has_all((item_names.VANGUARD, item_names.VANGUARD_FUSION_MORTARS), self.player) + or ( + (state.has(item_names.IMMORTAL, self.player) or self.advanced_tactics) + and (state.has_any({item_names.STALKER, item_names.DRAGOON, item_names.ADEPT, item_names.INSTIGATOR, item_names.SLAYER}, self.player)) + ) + or (self.advanced_tactics and state.has_all((item_names.OPPRESSOR, item_names.OPPRESSOR_VULCAN_BLASTER), self.player)) + ) + + def protoss_basic_splash(self, state: CollectionState) -> bool: + return ( + state.has_any(( + item_names.COLOSSUS, + item_names.VANGUARD, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.REAVER, + item_names.ASCENDANT, + item_names.DAWNBRINGER, + ), self.player) + or state.has_all((item_names.ZEALOT, item_names.ZEALOT_WHIRLWIND), self.player) + or ( + state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), self.player + ) + ) + or ( + state.has(item_names.DESTROYER, self.player) + and ( + state.has_any(( + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE, + item_names.DESTROYER_RESOURCE_EFFICIENCY, + ), self.player) + ) + ) + ) + + def protoss_static_defense(self, state: CollectionState) -> bool: + return state.has_any({item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH}, self.player) + + def protoss_can_merge_archon(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.HIGH_TEMPLAR, item_names.SIGNIFIER}, self.player) + or state.has_all({item_names.ASCENDANT, item_names.ASCENDANT_ARCHON_MERGE}, self.player) + or state.has_all({item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_ARCHON_MERGE}, self.player) + ) + + def protoss_can_merge_dark_archon(self, state: CollectionState) -> bool: + return state.has(item_names.DARK_ARCHON, self.player) or state.has_all( + {item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_DARK_ARCHON_MELD}, self.player + ) + + def protoss_competent_comp(self, state: CollectionState) -> bool: + if not self.protoss_competent_anti_air(state): + return False + if self.protoss_fleet(state) and self.protoss_mineral_dump(state): + return True + if self.protoss_deathball(state): + return True + core_unit: bool = state.has_any( + ( + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.ADEPT, + ), + self.player, + ) + support_unit: bool = ( + state.has_any( + ( + item_names.SENTRY, + item_names.ENERGIZER, + item_names.IMMORTAL, + item_names.VANGUARD, + item_names.COLOSSUS, + item_names.REAVER, + item_names.VOID_RAY, + item_names.PHOENIX, + item_names.CORSAIR, + ), + self.player, + ) + or state.has_all((item_names.MIRAGE, item_names.MIRAGE_GRAVITON_BEAM), self.player) + or state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), self.player + ) + or ( + self.advanced_tactics + and ( + state.has_any( + ( + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.ANNIHILATOR, + item_names.WRATHWALKER, + item_names.SKIRMISHER, + item_names.ARBITER, + ), + self.player, + ) + ) + ) + ) + if core_unit and support_unit: + return True + return False + + def protoss_deathball(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and self.protoss_hybrid_counter(state) + and self.protoss_basic_splash(state) + and self.protoss_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def protoss_heal(self, state: CollectionState) -> bool: + return state.has_any((item_names.SENTRY, item_names.SHIELD_BATTERY, item_names.RECONSTRUCTION_BEAM), self.player) or state.has_all( + (item_names.CARRIER, item_names.CARRIER_REPAIR_DRONES), self.player + ) + + def protoss_mineral_dump(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.ZEALOT, item_names.SENTINEL, item_names.PHOTON_CANNON), self.player) + or state.has_all((item_names.CENTURION, item_names.CENTURION_RESOURCE_EFFICIENCY), self.player) + or self.advanced_tactics + and state.has_any((item_names.SUPPLICANT, item_names.SHIELD_BATTERY), self.player) + ) + + def zealot_sentry_slayer_start(self, state: CollectionState): + """ + Created mainly for engine of destruction start, but works for other missions with no-build starts. + """ + return state.has_any( + { + item_names.ZEALOT_WHIRLWIND, + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE, + item_names.SLAYER_PHASE_BLINK, + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, + }, + self.player, + ) + + # Mission-specific rules + def ghost_of_a_chance_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_wol + or not self.nova_used + or ( + self.nova_ranged_weapon(state) + and state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_C20A_CANISTER_RIFLE}, self.player) + and (self.nova_full_stealth(state) or self.nova_heal(state)) + and self.nova_anti_air_weapon(state) + ) + ) + + def terran_outbreak_requirement(self, state: CollectionState) -> bool: + """Outbreak mission requirement""" + return self.terran_defense_rating(state, True, False) >= 4 and (self.terran_common_unit(state) or state.has(item_names.REAPER, self.player)) + + def zerg_outbreak_requirement(self, state: CollectionState) -> bool: + """ + Outbreak mission requirement. + Need to boot out Aberration-based comp + """ + return ( + self.zerg_defense_rating(state, True, False) >= 4 + and self.zerg_common_unit(state) + and ( + state.has_any( + ( + item_names.SWARM_QUEEN, + item_names.HYDRALISK, + item_names.ROACH, + item_names.MUTALISK, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or self.morph_lurker(state) + or self.morph_brood_lord(state) + or ( + self.advanced_tactics + and ( + self.morph_impaler(state) + or self.morph_igniter(state) + or state.has_any((item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK), self.player) + ) + ) + ) + ) + + def protoss_outbreak_requirement(self, state: CollectionState) -> bool: + """ + Outbreak mission requirement + Something other than Zealot-based comp is required. + """ + return ( + self.protoss_defense_rating(state, True) >= 4 + and self.protoss_common_unit(state) + and self.protoss_basic_splash(state) + and ( + state.has_any( + ( + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.ADEPT, + item_names.COLOSSUS, + item_names.VANGUARD, + item_names.SKIRMISHER, + item_names.OPPRESSOR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.DAWNBRINGER, + ), + self.player, + ) + or (self.advanced_tactics and (state.has_any((item_names.VOID_RAY, item_names.DESTROYER), self.player))) + ) + ) + + def terran_safe_haven_requirement(self, state: CollectionState) -> bool: + """Safe Haven mission requirement""" + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) + + def terran_havens_fall_requirement(self, state: CollectionState) -> bool: + """Haven's Fall mission requirement""" + return self.terran_common_unit(state) and ( + self.terran_competent_comp(state) + or ( + self.terran_competent_anti_air(state) + and ( + state.has_any((item_names.VIKING, item_names.BATTLECRUISER), self.player) + or state.has_all((item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + ) + ) + ) + + def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.terran_havens_fall_requirement(state) and ( + self.terran_air_anti_air(state) + or ( + state.has_any({item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + ) + + def zerg_havens_fall_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_competent_anti_air(state) + and (state.has(item_names.MUTALISK, self.player) or self.zerg_competent_comp(state)) + ) + + def zerg_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.zerg_havens_fall_requirement(state) and ( + self.morph_devourer(state) + or state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) + or self.advanced_tactics + and (self.morph_viper(state) or state.has_any({item_names.BROOD_QUEEN, item_names.SCOURGE}, self.player)) + ) + + def protoss_havens_fall_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and ( + self.protoss_competent_comp(state) + or ( + state.has_any((item_names.TEMPEST, item_names.SKYLORD, item_names.DESTROYER), self.player) + or ( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, state) >= 2 + and state.has(item_names.CARRIER, self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + ) + ) + ) + + def protoss_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.protoss_havens_fall_requirement(state) and ( + state.has_any({item_names.CARRIER, item_names.SKYLORD, item_names.DESTROYER, item_names.TEMPEST}, self.player) + # handle mutas + or ( + state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + # handle brood lords and virophages + and ( + state.has_any( + { + item_names.VOID_RAY, + }, + self.player, + ) + or self.advanced_tactics + and state.has_all({item_names.SCOUT, item_names.MISTWING}, self.player) + ) + ) + + def terran_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.terran_competent_comp(state) and (self.terran_defense_rating(state, True) > 6) + + def zerg_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.zerg_competent_comp_competent_aa(state) and (self.zerg_defense_rating(state, True) > 8) + + def protoss_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.protoss_competent_comp(state) and (self.protoss_defense_rating(state, True) > 6) + + def terran_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.terran_power_rating(state) < 5: + return False + return (self.terran_common_unit(state) and self.terran_competent_ground_to_air(state)) or ( + self.advanced_tactics + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.VULTURE}, self.player) + and self.terran_air_anti_air(state) + ) + + def zerg_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.zerg_power_rating(state) < 5: + return False + return (self.zerg_competent_comp(state) and state.has_any({item_names.HYDRALISK, item_names.MUTALISK}, self.player)) or ( + self.advanced_tactics + and self.zerg_common_unit(state) + and ( + state.has_any({item_names.MUTALISK, item_names.INFESTOR}, self.player) + or (self.morph_devourer(state) and state.has_any({item_names.HYDRALISK, item_names.SWARM_QUEEN}, self.player)) + or (self.morph_viper(state) and state.has(item_names.VIPER_PARASITIC_BOMB, self.player)) + ) + and self.zerg_army_weapon_armor_upgrade_min_level(state) >= 1 + ) + + def protoss_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.protoss_power_rating(state) < 5: + return False + return self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) + + def terran_can_grab_ghosts_in_the_fog_east_rock_formation(self, state: CollectionState) -> bool: + """ + Able to shoot by a long range or from air to claim the rock formation separated by a chasm + """ + return ( + state.has_any( + { + item_names.MEDIVAC, + item_names.HERCULES, + item_names.VIKING, + item_names.BANSHEE, + item_names.WRAITH, + item_names.SIEGE_TANK, + item_names.BATTLECRUISER, + item_names.NIGHT_HAWK, + item_names.NIGHT_WOLF, + item_names.SHOCK_DIVISION, + item_names.SKY_FURY, + }, + self.player, + ) + or state.has_all({item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES}, self.player) + or state.has_all({item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) + or ( + state.has_any({item_names.LIBERATOR, item_names.EMPERORS_GUARDIAN}, self.player) + and state.has(item_names.LIBERATOR_RAID_ARTILLERY, self.player) + ) + or ( + self.advanced_tactics + and ( + state.has_any( + { + item_names.HELS_ANGELS, + item_names.DUSK_WINGS, + item_names.WINGED_NIGHTMARES, + item_names.SIEGE_BREAKERS, + item_names.BRYNHILDS, + item_names.JACKSONS_REVENGE, + }, + self.player, + ) + ) + or state.has_all({item_names.MIDNIGHT_RIDERS, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + ) + + def terran_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return state.has_any( + {item_names.SIEGE_TANK, item_names.DIAMONDBACK, item_names.MARAUDER, item_names.CYCLONE, item_names.BANSHEE}, self.player + ) or ( + self.advanced_tactics + and ( + state.has_all({item_names.REAPER, item_names.REAPER_G4_CLUSTERBOMB}, self.player) + or state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player) + or state.has_any({item_names.VULTURE, item_names.LIBERATOR}, self.player) + ) + ) + + def zerg_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return ( + state.has_any( + ( + item_names.ABERRATION, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or state.has_all((item_names.HYDRALISK, item_names.HYDRALISK_MUSCULAR_AUGMENTS), self.player) + or ( + state.has(item_names.ZERGLING, self.player) + and ( + state.has_any( + (item_names.ZERGLING_SHREDDING_CLAWS, item_names.ZERGLING_SHREDDING_CLAWS, item_names.ZERGLING_RAPTOR_STRAIN), self.player + ) + ) + and (self.advanced_tactics or state.has_any((item_names.ZERGLING_METABOLIC_BOOST, item_names.ZERGLING_RAPTOR_STRAIN), self.player)) + ) + or self.zerg_infested_tank_with_ammo(state) + or (self.advanced_tactics and (self.morph_tyrannozor(state))) + ) + + def protoss_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return ( + state.has_any( + (item_names.ANNIHILATOR, item_names.IMMORTAL, item_names.STALKER, item_names.WRATHWALKER, item_names.VOID_RAY, item_names.DESTROYER), + self.player, + ) + or state.has_all({item_names.SLAYER, item_names.SLAYER_PHASE_BLINK}, self.player) + or state.has_all((item_names.REAVER, item_names.REAVER_KHALAI_REPLICATORS), self.player) + or state.has_all({item_names.VANGUARD, item_names.VANGUARD_FUSION_MORTARS}, self.player) + or ( + state.has(item_names.INSTIGATOR, self.player) + and state.has_any((item_names.INSTIGATOR_BLINK_OVERDRIVE, item_names.INSTIGATOR_MODERNIZED_SERVOS), self.player) + ) + or (state.has_all((item_names.OPPRESSOR, item_names.SCOUT_GRAVITIC_THRUSTERS, item_names.SCOUT_ADVANCED_PHOTON_BLASTERS), self.player)) + or state.has_all((item_names.ORACLE, item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM), self.player) + or ( + self.advanced_tactics + and ( + state.has(item_names.TEMPEST, self.player) + or state.has_all((item_names.ADEPT, item_names.ADEPT_RESONATING_GLAIVES), self.player) + or state.has_all({item_names.VANGUARD, item_names.VANGUARD_RAPIDFIRE_CANNON}, self.player) + or state.has_all((item_names.OPPRESSOR, item_names.SCOUT_GRAVITIC_THRUSTERS, item_names.OPPRESSOR_VULCAN_BLASTER), self.player) + or state.has_all((item_names.ASCENDANT, item_names.ASCENDANT_POWER_OVERWHELMING, item_names.SUPPLICANT), self.player) + or state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), + self.player, + ) + or ( + state.has(item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) + and ( + state.has_any((item_names.DARK_TEMPLAR, item_names.AVENGER), self.player) + or state.has_all((item_names.BLOOD_HUNTER, item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), self.player) + ) + ) + ) + ) + ) + + def terran_can_rescue(self, state) -> bool: + """ + Rescuing in The Moebius Factor + """ + return state.has_any({item_names.MEDIVAC, item_names.HERCULES, item_names.RAVEN, item_names.VIKING}, self.player) or self.advanced_tactics + + def terran_supernova_requirement(self, state) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 6 + + def zerg_supernova_requirement(self, state) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_power_rating(state) >= 6 + and (self.advanced_tactics or state.has(item_names.YGGDRASIL, self.player)) + ) + + def protoss_supernova_requirement(self, state: CollectionState): + return ( + ( + state.count(item_names.PROGRESSIVE_WARP_RELOCATE, self.player) >= 2 + or (self.advanced_tactics and state.has(item_names.PROGRESSIVE_WARP_RELOCATE, self.player)) + ) + and self.protoss_competent_anti_air(state) + and (self.protoss_fleet(state) or (self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 6)) + ) + + def terran_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to deal with large areas with environment damage + """ + return ( + state.has(item_names.BATTLECRUISER, self.player) + and ( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + or state.has(item_names.BATTLECRUISER_ATX_LASER_BATTERY, self.player) + ) + ) or ( + self.terran_air(state) + and ( + # Avoid dropping Troopers or units that do barely damage + state.has_any( + ( + item_names.GOLIATH, + item_names.THOR, + item_names.WARHOUND, + item_names.VIKING, + item_names.BANSHEE, + item_names.WRAITH, + item_names.BATTLECRUISER, + ), + self.player, + ) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or (state.has(item_names.MARAUDER, self.player) and self.terran_bio_heal(state)) + ) + and ( + # Can deal damage to air units inside rip fields + state.has_any((item_names.GOLIATH, item_names.CYCLONE, item_names.VIKING), self.player) + or ( + state.has_any((item_names.WRAITH, item_names.VALKYRIE, item_names.BATTLECRUISER), self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + ) + and self.terran_competent_comp(state) + and self.terran_competent_anti_air(state) + and self.terran_sustainable_mech_heal(state) + ) + + def zerg_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to cross defended gaps, deal with skytoss, and avoid costly losses. + """ + if self.advanced_tactics and state.has(item_names.INFESTOR, self.player): + return True + usable_muta = ( + state.has_all((item_names.MUTALISK, item_names.MUTALISK_RAPID_REGENERATION), self.player) + and state.has_any((item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + and ( + state.has(item_names.MUTALISK_SUNDERING_GLAIVE, self.player) + or state.has_all((item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + ) + ) + return ( + # Heal + ( + state.has(item_names.SWARM_QUEEN, self.player) + or self.advanced_tactics + and ((self.morph_tyrannozor(state) and state.has(item_names.TYRANNOZOR_HEALING_ADAPTATION, self.player)) or (usable_muta)) + ) + # Cross the gap + and ( + state.has_any((item_names.NYDUS_WORM, item_names.OVERLORD_VENTRAL_SACS), self.player) + or (self.advanced_tactics and state.has(item_names.YGGDRASIL, self.player)) + ) + # Air to ground + and (self.morph_brood_lord(state) or self.morph_guardian(state) or usable_muta) + # Ground to air + and ( + state.has(item_names.INFESTOR, self.player) + or self.morph_tyrannozor(state) + or state.has_all( + {item_names.SWARM_HOST, item_names.SWARM_HOST_RESOURCE_EFFICIENCY, item_names.SWARM_HOST_PRESSURIZED_GLANDS}, self.player + ) + or state.has_all({item_names.HYDRALISK, item_names.HYDRALISK_RESOURCE_EFFICIENCY}, self.player) + or state.has_all({item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE}, self.player) + ) + # Survives rip-field + and ( + state.has_any({item_names.ABERRATION, item_names.ROACH, item_names.ULTRALISK}, self.player) + or self.morph_tyrannozor(state) + or (self.advanced_tactics and usable_muta) + ) + # Air-to-air + and (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR, item_names.INFESTED_LIBERATOR, item_names.BROOD_QUEEN}, self.player)) + # Upgrades / general + and self.zerg_competent_anti_air(state) + and self.zerg_competent_comp(state) + ) + + def protoss_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to cross defended gaps and deal with skytoss. + """ + return ( + ( + state.has(item_names.WARP_PRISM, self.player) + or ( + self.advanced_tactics + and (state.has(item_names.ARBITER, self.player) or state.has_all((item_names.MISTWING, item_names.MISTWING_PILOT), self.player)) + ) + ) + and self.protoss_common_unit_anti_armor_air(state) + and self.protoss_fleet(state) + ) + + def terran_engine_of_destruction_requirement(self, state: CollectionState) -> int: + power_rating = self.terran_power_rating(state) + if power_rating < 3 or not self.marine_medic_upgrade(state) or not self.terran_common_unit(state): + return False + if power_rating >= 7 and self.terran_competent_comp(state): + return True + else: + return ( + state.has_any((item_names.WRAITH, item_names.BATTLECRUISER), self.player) + or self.terran_air_anti_air(state) + and state.has_any((item_names.BANSHEE, item_names.LIBERATOR), self.player) + ) + + def zerg_engine_of_destruction_requirement(self, state: CollectionState) -> int: + power_rating = self.zerg_power_rating(state) + if ( + power_rating < 3 + or not self.zergling_hydra_roach_start(state) + or not self.zerg_common_unit(state) + or not self.zerg_competent_anti_air(state) + or not self.zerg_repair_odin(state) + ): + return False + if power_rating >= 7 and self.zerg_competent_comp(state): + return True + else: + return self.zerg_base_buster(state) + + def protoss_engine_of_destruction_requirement(self, state: CollectionState): + return ( + self.zealot_sentry_slayer_start(state) + and self.protoss_repair_odin(state) + and (self.protoss_deathball(state) or self.protoss_fleet(state)) + ) + + def zerg_repair_odin(self, state: CollectionState): + return ( + self.zerg_has_infested_scv(state) + or state.has_all({item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION, item_names.SWARM_QUEEN}, self.player) + or (self.advanced_tactics and state.has(item_names.SWARM_QUEEN, self.player)) + ) + + def protoss_repair_odin(self, state: CollectionState): + return ( + state.has(item_names.SENTRY, self.player) + or state.has_all((item_names.CARRIER, item_names.CARRIER_REPAIR_DRONES), self.player) + or ( + self.spear_of_adun_passive_presence + in [SpearOfAdunPassiveAbilityPresence.option_protoss, SpearOfAdunPassiveAbilityPresence.option_everywhere] + and state.has(item_names.RECONSTRUCTION_BEAM, self.player) + ) + or (self.advanced_tactics and state.has_all({item_names.SHIELD_BATTERY, item_names.KHALAI_INGENUITY}, self.player)) + ) + + def terran_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.terran_competent_comp(state) and self.terran_defense_rating(state, True, True) >= 8 + + def zerg_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_defense_rating(state, True, True) >= 8 + + def protoss_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_defense_rating(state, True) >= 4 + + def terran_all_in_requirement(self, state: CollectionState): + """ + All-in + """ + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.BANSHEE}, self.player) + or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + or (self.all_in_map == AllInMap.option_air and state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player)) + or (self.advanced_tactics and state.has_all((item_names.GHOST, item_names.GHOST_EMP_ROUNDS), self.player)) + ) + if not beats_kerrigan: + return False + if not self.terran_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.terran_defense_rating(state, True, False) + if state.has_any({item_names.BATTLECRUISER, item_names.BANSHEE}, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.terran_defense_rating(state, True, True) + return ( + defense_rating >= 9 + and self.terran_competent_anti_air(state) + and state.has_any({item_names.VIKING, item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) + and state.has_any({item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER, item_names.MISSILE_TURRET}, self.player) + ) + + def zerg_all_in_requirement(self, state: CollectionState): + """ + All-in (Zerg) + """ + if not self.zerg_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + state.has_any({item_names.INFESTED_MARINE, item_names.INFESTED_BANSHEE, item_names.INFESTED_BUNKER}, self.player) + or state.has_all({item_names.SWARM_HOST, item_names.SWARM_HOST_RESOURCE_EFFICIENCY}, self.player) + or self.morph_brood_lord(state) + ) + if not beats_kerrigan: + return False + if not self.zerg_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.zerg_defense_rating(state, True, False) + if ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + ): + defense_rating += 3 + if state.has(item_names.SPINE_CRAWLER, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.zerg_defense_rating(state, True, True) + return ( + defense_rating >= 9 + and state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) + and state.has_any({item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET}, self.player) + ) + + def protoss_all_in_requirement(self, state: CollectionState): + """ + All-in (Protoss) + """ + if not self.protoss_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + # cheap units with multiple small attacks, or anything with Feedback + state.has_any({item_names.ZEALOT, item_names.SENTINEL, item_names.SKIRMISHER, item_names.HIGH_TEMPLAR}, self.player) + or state.has_all((item_names.CENTURION, item_names.CENTURION_RESOURCE_EFFICIENCY), self.player) + or state.has_all({item_names.SIGNIFIER, item_names.SIGNIFIER_FEEDBACK}, self.player) + or (self.protoss_can_merge_archon(state) and state.has(item_names.ARCHON_HIGH_ARCHON, self.player)) + or (self.protoss_can_merge_dark_archon(state) and state.has(item_names.DARK_ARCHON_FEEDBACK, self.player)) + ) + if not beats_kerrigan: + return False + if not self.protoss_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.protoss_defense_rating(state, True) + if ( + state.has_any({item_names.SKIRMISHER, item_names.DARK_TEMPLAR, item_names.TEMPEST, item_names.TRIREME}, self.player) + or state.has_all((item_names.BLOOD_HUNTER, item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), self.player) + or state.has_all((item_names.AVENGER, item_names.AVENGER_KRYHAS_CLOAK), self.player) + ): + defense_rating += 2 + if state.has(item_names.PHOTON_CANNON, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.protoss_defense_rating(state, True) + if state.has(item_names.KHAYDARIN_MONOLITH, self.player): + defense_rating += 2 + if state.has(item_names.PHOTON_CANNON, self.player): + defense_rating += 2 + return defense_rating >= 9 and (state.has_any({item_names.TEMPEST, item_names.SKYLORD, item_names.VOID_RAY}, self.player)) + + def zerg_can_grab_ghosts_in_the_fog_east_rock_formation(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE, item_names.OVERLORD_VENTRAL_SACS, item_names.INFESTOR}, self.player) + or (self.morph_devourer(state) and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player)) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + or ((self.morph_guardian(state) or self.morph_brood_lord(state)) and self.zerg_basic_air_to_air(state)) + or ( + self.advanced_tactics + and ( + state.has_any({item_names.INFESTED_SIEGE_BREAKERS, item_names.INFESTED_DUSK_WINGS}, self.player) + or (state.has(item_names.HUNTERLING, self.player) and self.zerg_basic_air_to_air(state)) + ) + ) + ) + def zerg_any_units_back_in_the_saddle_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + # Note(mm): This check isn't necessary as self.kerrigan_levels cover it, + # and it's not fully desirable in future when we support non-grant story tech + kerriganless. + # or not self.kerrigan_presence + or state.has_any(( + # Cases tested by Snarky + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_CRUSHING_GRIP, + item_names.KERRIGAN_PSIONIC_SHIFT, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_FURY, + item_names.KERRIGAN_APOCALYPSE, + item_names.KERRIGAN_DROP_PODS, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + item_names.KERRIGAN_IMMOBILIZATION_WAVE, # Involves a 1-minute cooldown wait before the ultra + item_names.KERRIGAN_MEND, # See note from THE EV below + ), self.player) + or self.kerrigan_levels(state, 20) + or (self.kerrigan_levels(state, 10) and state.has(item_names.KERRIGAN_CHAIN_REACTION, self.player)) + # Tested by THE EV, "facetank with Kerrigan and stutter step to the end with >10s left" + # > have to lure the first group of Zerg in the 2nd timed section into the first room of the second area + # > (with the heal box) so you can kill them before the timer starts. + # + # phaneros: Technically possible without the levels, but adding them in for safety margin and to hopefully + # make generation force this branch less often + or (state.has_any((item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_INFEST_BROODLINGS), self.player) + and self.kerrigan_levels(state, 5) + ) + # Insufficient: Wild Mutation, Assimilation Aura + ) + + def zerg_pass_vents(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or state.has_any({item_names.ZERGLING, item_names.HYDRALISK, item_names.ROACH}, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTOR, self.player)) + ) + + def supreme_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or not self.kerrigan_unit_available or (self.grant_story_tech == GrantStoryTech.option_allow_substitutes + and state.has_any(( + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.OVERLORD_VENTRAL_SACS, + item_names.YGGDRASIL, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.NYDUS_WORM, + item_names.BULLFROG, + ), self.player) + and state.has_any(( + item_names.KERRIGAN_MEND, + item_names.SWARM_QUEEN, + item_names.INFESTED_MEDICS, + ), self.player) + and self.kerrigan_levels(state, 35) + ) + or (state.has_all((item_names.KERRIGAN_LEAPING_STRIKE, item_names.KERRIGAN_MEND), self.player) and self.kerrigan_levels(state, 35)) + ) + + def terran_infested_garrison_claimer(self, state: CollectionState) -> bool: + return state.has_any((item_names.GHOST, item_names.SPECTRE, item_names.EMPERORS_SHADOW), self.player) + + def protoss_infested_garrison_claimer(self, state: CollectionState) -> bool: + return state.has_any( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT), self.player + ) or self.protoss_can_merge_dark_archon(state) + + def terran_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return self.terran_competent_comp(state) and self.terran_power_rating(state) >= 6 + + def zerg_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and (self.zerg_competent_anti_air(state) or self.advanced_tactics and self.zerg_moderate_anti_air(state)) + and (self.basic_kerrigan(state) or self.zerg_power_rating(state) >= 4) + ) + + def protoss_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 6 + + def terran_planetfall_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 8 + + def zerg_planetfall_requirement(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_power_rating(state) >= 8 + + def protoss_planetfall_requirement(self, state: CollectionState) -> bool: + return self.protoss_deathball(state) and self.protoss_power_rating(state) >= 8 + + def zerg_the_reckoning_requirement(self, state: CollectionState) -> bool: + if not (self.zerg_power_rating(state) >= 6 or self.basic_kerrigan(state)): + return False + if self.take_over_ai_allies: + return ( + self.terran_competent_comp(state) + and self.zerg_competent_comp(state) + and (self.zerg_competent_anti_air(state) or self.terran_competent_anti_air(state)) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.zerg_very_hard_mission_weapon_armor_level(state) + ) + else: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + + def terran_the_reckoning_requirement(self, state: CollectionState) -> bool: + return self.terran_very_hard_mission_weapon_armor_level(state) and self.terran_base_trasher(state) + + def protoss_the_reckoning_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_very_hard_mission_weapon_armor_level(state) + and self.protoss_deathball(state) + and (not self.take_over_ai_allies or (self.terran_competent_comp(state) and self.terran_very_hard_mission_weapon_armor_level(state))) + ) + + def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: + return ( + state.has_any( + { + item_names.SCOUT, + item_names.TEMPEST, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.DAWNBRINGER, + item_names.MOTHERSHIP, + }, + self.player, + ) + or self.protoss_has_blink(state) + or ( + state.has(item_names.WARP_PRISM, self.player) + and (self.protoss_common_unit(state) or state.has(item_names.WARP_PRISM_PHASE_BLASTER, self.player)) + ) + or (self.advanced_tactics and state.has_any({item_names.ORACLE, item_names.ARBITER}, self.player)) + ) + + def the_infinite_cycle_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or not self.kerrigan_unit_available + or ( + state.has_any( + ( + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + ), + self.player, + ) + and self.basic_kerrigan(state) + and self.kerrigan_levels(state, 70) + ) + ) + + def templars_return_phase_2_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.advanced_tactics + or ( + state.has_any( + ( + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.REAVER, + item_names.DARK_TEMPLAR, + item_names.HIGH_TEMPLAR, + item_names.ENERGIZER, + item_names.SENTRY, + ), + self.player, + ) + ) + ) + + def templars_return_phase_3_reach_colossus_requirement(self, state: CollectionState) -> bool: + return self.templars_return_phase_2_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.advanced_tactics + and state.has_any({item_names.ZEALOT_WHIRLWIND, item_names.VANGUARD_RAPIDFIRE_CANNON}, self.player) + or state.has_all(( + item_names.ZEALOT_WHIRLWIND, item_names.VANGUARD_RAPIDFIRE_CANNON + ), self.player) + ) + + def templars_return_phase_3_reach_dts_requirement(self, state: CollectionState) -> bool: + return self.templars_return_phase_3_reach_colossus_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ( + (self.advanced_tactics or state.has(item_names.ENERGIZER_MOBILE_CHRONO_BEAM, self.player)) + and (state.has(item_names.COLOSSUS_FIRE_LANCE, self.player) + or ( + state.has_all( + { + item_names.COLOSSUS_PACIFICATION_PROTOCOL, + item_names.ENERGIZER_MOBILE_CHRONO_BEAM, + }, + self.player, + ) + ) + )) + ) + + def terran_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) and self.terran_defense_rating(state, False, False) >= 5 + + def zerg_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) and self.zerg_defense_rating(state, False, False) >= 5 + + def protoss_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_anti_light_anti_air(state) + and ( + state.has_any((item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.ADEPT), self.player) + or self.protoss_basic_splash(state) + ) + and self.protoss_defense_rating(state, False) >= 5 + ) + + def terran_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) and self.terran_power_rating(state) >= 7 + + def zerg_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) and self.zerg_power_rating(state) >= 7 + + def protoss_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_competent_anti_air(state) and self.protoss_power_rating(state) >= 7 + + def protoss_brothers_in_arms_requirement(self, state: CollectionState) -> bool: + return (self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) and self.protoss_hybrid_counter(state)) or ( + self.take_over_ai_allies + and (self.terran_common_unit(state) or self.protoss_common_unit(state)) + and (self.terran_competent_anti_air(state) or self.protoss_anti_armor_anti_air(state)) + and ( + self.protoss_hybrid_counter(state) + or state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK}, self.player) + or (self.advanced_tactics and state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player)) + or ( + state.has(item_names.IMMORTAL, self.player) + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + and self.terran_bio_heal(state) + ) + ) + ) + + def zerg_brothers_in_arms_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) and self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_big_monsters(state) + ) or ( + self.take_over_ai_allies + and (self.zerg_common_unit(state) or self.terran_common_unit(state)) + and (self.terran_competent_anti_air(state) or self.zerg_competent_anti_air(state)) + and ( + self.zerg_big_monsters(state) + or state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK}, self.player) + or (self.advanced_tactics and state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player)) + or ( + state.has(item_names.ABERRATION, self.player) + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + and self.terran_bio_heal(state) + ) + ) + ) + + def protoss_amons_reach_requirement(self, state: CollectionState) -> bool: + return self.protoss_common_unit_anti_light_air(state) and self.protoss_basic_splash(state) and self.protoss_power_rating(state) >= 7 + + def protoss_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and self.protoss_static_defense(state) + and self.protoss_defense_rating(state, False) >= 8 + ) + + def terran_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_common_unit(state) + and state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET, item_names.PLANETARY_FORTRESS}, self.player) + and self.terran_air_anti_air(state) + and state.has_any({item_names.VIKING, item_names.BATTLECRUISER}, self.player) + and self.terran_defense_rating(state, True, False) >= 10 + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def zerg_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SPINE_CRAWLER, self.player) + and ( + self.morph_lurker(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or self.zerg_infested_tank_with_ammo(state) + or self.advanced_tactics + and state.has_all({item_names.ULTRALISK, item_names.ULTRALISK_CHITINOUS_PLATING, item_names.ULTRALISK_MONARCH_BLADES}, self.player) + ) + and ( + self.morph_impaler(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or self.zerg_infested_tank_with_ammo(state) + or state.has(item_names.BILE_LAUNCHER, self.player) + ) + and ( + self.morph_devourer(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or self.advanced_tactics + and state.has(item_names.BROOD_QUEEN, self.player) + ) + and self.zerg_mineral_dump(state) + and self.zerg_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def terran_temple_of_unification_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 10 + + def zerg_temple_of_unification_requirement(self, state: CollectionState) -> bool: + # Don't be locked to roach/hydra + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and ( + state.has(item_names.INFESTED_BANSHEE, self.player) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE), self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or self.zerg_big_monsters(state) + or ( + self.advanced_tactics + and (state.has_any({item_names.INFESTOR, item_names.DEFILER, item_names.BROOD_QUEEN}, self.player) or self.morph_viper(state)) + ) + ) + and self.zerg_power_rating(state) >= 10 + ) + + def protoss_temple_of_unification_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 10 + + def protoss_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_anti_armor_anti_air(state) + and ( + self.take_over_ai_allies + and (self.protoss_common_unit(state) or self.zerg_common_unit(state)) + or (self.protoss_competent_comp(state) and self.protoss_hybrid_counter(state)) + ) + and self.protoss_power_rating(state) >= 6 + ) + + def terran_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_anti_air(state) + and ( + self.take_over_ai_allies + and (self.terran_common_unit(state) or self.zerg_common_unit(state)) + or ( + self.terran_beats_protoss_deathball(state) + and state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK, item_names.THOR}, self.player) + ) + ) + and self.terran_power_rating(state) >= 6 + ) + + def zerg_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_anti_air(state) + and self.zerg_common_unit(state) + and (self.take_over_ai_allies or (self.zerg_competent_comp(state) and self.zerg_big_monsters(state))) + and self.zerg_power_rating(state) >= 6 + ) + + def terran_unsealing_the_past_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_anti_air(state) + and self.terran_competent_comp(state) + and self.terran_power_rating(state) >= 6 + and ( + state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS}, self.player) + or state.has_all( + {item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY, item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE}, self.player + ) + or ( + self.advanced_tactics + and ( + state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_SMART_SERVOS}, self.player) + or ( + state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_SMART_SERVOS}, self.player) + and ( + ( + state.has_all({item_names.HELLION, item_names.HELLION_HELLBAT}, self.player) + or state.has(item_names.FIREBAT, self.player) + ) + and self.terran_bio_heal(state) + or state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has(item_names.BANSHEE, self.player) + ) + ) + ) + ) + ) + ) + + def zerg_unsealing_the_past_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_power_rating(state) >= 6 + and ( + self.morph_brood_lord(state) + or self.zerg_big_monsters(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or ( + self.advanced_tactics + and (self.morph_igniter(state) or (self.morph_lurker(state) and state.has(item_names.LURKER_SEISMIC_SPINES, self.player))) + ) + ) + ) + + def terran_purification_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.terran_defense_rating(state, True, False) >= 10 + and ( + state.has_any({item_names.LIBERATOR, item_names.THOR}, self.player) + or ( + state.has(item_names.SIEGE_TANK, self.player) + and (self.advanced_tactics or state.has(item_names.SIEGE_TANK_MAELSTROM_ROUNDS, self.player)) + ) + ) + and ( + state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or ( + state.has(item_names.BANSHEE, self.player) + and ( + state.has(item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, self.player) + or (self.advanced_tactics and state.has(item_names.BANSHEE_ROCKET_BARRAGE, self.player)) + ) + ) + ) + ) + + def zerg_purification_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_defense_rating(state, True, True) >= 5 + and self.zerg_big_monsters(state) + and (state.has(item_names.ULTRALISK, self.player) or self.morph_igniter(state) or self.morph_lurker(state)) + ) + + def protoss_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return self.protoss_deathball(state) or self.protoss_fleet(state) + + def terran_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and ( + state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has_all((item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY), self.player) + ) + and ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has(item_names.VALKYRIE, self.player) + or state.has_all((item_names.VIKING, item_names.VIKING_RIPWAVE_MISSILES), self.player) + ) + and self.terran_very_hard_mission_weapon_armor_level(state) + ) + + def zerg_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_base_buster(state) + and ( + self.morph_lurker(state) + or self.zerg_infested_tank_with_ammo(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or (state.has(item_names.SWARM_QUEEN, self.player) and self.zerg_big_monsters(state)) + ) + and ( + state.has(item_names.INFESTED_LIBERATOR, self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or (state.has(item_names.MUTALISK, self.player) and self.morph_devourer(state)) + ) + ) + + def terran_rak_shir_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 10 + + def zerg_rak_shir_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and ( + self.zerg_big_monsters(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or self.morph_impaler_or_lurker(state) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or ( + state.has(item_names.MUTALISK, self.player) + and (state.has(item_names.MUTALISK_SUNDERING_GLAIVE, self.player) or self.morph_devourer(state)) + ) + or state.has(item_names.CORRUPTOR, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTOR, self.player)) + ) + and self.zerg_power_rating(state) >= 10 + ) + + def protoss_rak_shir_requirement(self, state: CollectionState) -> bool: + return (self.protoss_deathball(state) or self.protoss_fleet(state)) and self.protoss_power_rating(state) >= 10 + + def protoss_templars_charge_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_heal(state) + and self.protoss_anti_armor_anti_air(state) + and ( + self.protoss_fleet(state) + or ( + self.advanced_tactics + and self.protoss_competent_comp(state) + and ( + state.has_any((item_names.ARBITER, item_names.CORSAIR, item_names.PHOENIX), self.player) + or state.has_all((item_names.MIRAGE, item_names.MIRAGE_GRAVITON_BEAM), self.player) + ) + ) + ) + ) + + def terran_templars_charge_requirement(self, state: CollectionState) -> bool: + return self.terran_very_hard_mission_weapon_armor_level(state) and ( + ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + and state.count(item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, self.player) >= 2 + ) + or ( + self.terran_air_anti_air(state) + and self.terran_sustainable_mech_heal(state) + and ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or (self.advanced_tactics and (state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player))) + ) + ) + ) + + def zerg_templars_charge_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SWARM_QUEEN, self.player) + and ( + self.morph_guardian(state) + or self.morph_brood_lord(state) + or state.has(item_names.INFESTED_BANSHEE, self.player) + or ( + self.advanced_tactics + and ( + state.has_all( + { + item_names.MUTALISK, + item_names.MUTALISK_SEVERING_GLAIVE, + item_names.MUTALISK_VICIOUS_GLAIVE, + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE, + }, + self.player, + ) + or self.morph_viper(state) + ) + ) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + ) + ) + + def protoss_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_fleet(state) and self.protoss_static_defense(state) and self.protoss_army_weapon_armor_upgrade_min_level(state) >= 2 + ) or ( + self.protoss_deathball(state) + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + + def terran_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and ( + ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + and state.count(item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, self.player) >= 2 + ) + or ( + self.terran_air_anti_air(state) + and self.terran_sustainable_mech_heal(state) + and ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + ) + or ( + self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + ) + ) + + def zerg_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_very_hard_mission_weapon_armor_level(state) + and self.zerg_base_buster(state) + and self.zerg_big_monsters(state) + and ( + (self.morph_brood_lord(state) or self.morph_guardian(state)) + and ( + (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL), self.player) + ) + or ( + state.has_all( + ( + item_names.MUTALISK, + item_names.MUTALISK_SEVERING_GLAIVE, + item_names.MUTALISK_VICIOUS_GLAIVE, + item_names.MUTALISK_SUNDERING_GLAIVE, + item_names.MUTALISK_RAPID_REGENERATION, + ), + self.player, + ) + ) + ) + or ( + self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + ) + + def protoss_salvation_requirement(self, state: CollectionState) -> bool: + return ( + ([self.protoss_competent_comp(state), self.protoss_fleet(state), self.protoss_static_defense(state)].count(True) >= 2) + and self.protoss_very_hard_mission_weapon_armor_level(state) + and self.protoss_power_rating(state) >= 6 + ) + + def terran_salvation_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.terran_air_anti_air(state) + and state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET, item_names.PLANETARY_FORTRESS}, self.player) + and self.terran_power_rating(state) >= 6 + ) + + def zerg_salvation_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SPINE_CRAWLER, self.player) + and self.zerg_very_hard_mission_weapon_armor_level(state) + and ( + self.morph_impaler_or_lurker(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + ) + and self.zerg_power_rating(state) >= 6 + ) + + def into_the_void_requirement(self, state: CollectionState) -> bool: + if not self.protoss_very_hard_mission_weapon_armor_level(state): + return False + if self.take_over_ai_allies and not ( + self.terran_very_hard_mission_weapon_armor_level(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + ): + return False + return self.protoss_competent_comp(state) or ( + self.take_over_ai_allies + and ( + state.has(item_names.BATTLECRUISER, self.player) + or (state.has(item_names.ULTRALISK, self.player) and self.protoss_competent_anti_air(state)) + ) + ) + + def essence_of_eternity_requirement(self, state: CollectionState) -> bool: + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + if self.take_over_ai_allies and not ( + self.protoss_very_hard_mission_weapon_armor_level(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + ): + return False + defense_score = self.terran_defense_rating(state, False, True) + if self.take_over_ai_allies and self.protoss_static_defense(state): + defense_score += 2 + return ( + defense_score >= 12 + and (self.terran_competent_anti_air(state) or self.take_over_ai_allies and self.protoss_competent_anti_air(state)) + and ( + state.has(item_names.BATTLECRUISER, self.player) + or ( + state.has_any((item_names.BANSHEE, item_names.LIBERATOR), self.player) + and state.has_any({item_names.VIKING, item_names.VALKYRIE}, self.player) + ) + or self.take_over_ai_allies + and self.protoss_fleet(state) + ) + and self.terran_power_rating(state) >= 6 + ) + + def amons_fall_requirement(self, state: CollectionState) -> bool: + if not self.zerg_very_hard_mission_weapon_armor_level(state): + return False + if not self.zerg_competent_anti_air(state): + return False + if self.zerg_power_rating(state) < 6: + return False + if self.take_over_ai_allies and not ( + self.terran_very_hard_mission_weapon_armor_level(state) and self.protoss_very_hard_mission_weapon_armor_level(state) + ): + return False + if self.take_over_ai_allies: + return ( + ( + state.has_any({item_names.BATTLECRUISER, item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME}, self.player) + or ( + state.has(item_names.ULTRALISK, self.player) + and self.protoss_competent_anti_air(state) + and ( + state.has_any({item_names.LIBERATOR, item_names.BANSHEE, item_names.VALKYRIE, item_names.VIKING}, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or self.protoss_fleet(state) + ) + and ( + self.terran_sustainable_mech_heal(state) + or ( + self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere + and state.has(item_names.RECONSTRUCTION_BEAM, self.player) + ) + ) + ) + ) + and self.terran_competent_anti_air(state) + and self.protoss_deathball(state) + and self.zerg_competent_comp(state) + ) + else: + return ( + ( + state.has_any((item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.INFESTED_BANSHEE), self.player) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL), self.player) + or state.has_all((item_names.SCOURGE, item_names.SCOURGE_RESOURCE_EFFICIENCY), self.player) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + or self.morph_devourer(state) + ) + or (self.advanced_tactics and self.spread_creep(state, False) and self.zerg_big_monsters(state)) + ) and self.zerg_competent_comp(state) + + def the_escape_stuff_granted(self) -> bool: + """ + The NCO first mission requires having too much stuff first before actually able to do anything + :return: + """ + return self.grant_story_tech == GrantStoryTech.option_grant or (self.mission_order == MissionOrder.option_vanilla and self.enabled_campaigns == {SC2Campaign.NCO}) + + def the_escape_first_stage_requirement(self, state: CollectionState) -> bool: + return self.the_escape_stuff_granted() or (self.nova_ranged_weapon(state) and (self.nova_full_stealth(state) or self.nova_heal(state))) + + def the_escape_requirement(self, state: CollectionState) -> bool: + return self.the_escape_first_stage_requirement(state) and (self.the_escape_stuff_granted() or self.nova_splash(state)) + + def terran_able_to_snipe_defiler(self, state: CollectionState) -> bool: + return ( + state.has(item_names.BANSHEE, self.player) + or ( + state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + and (state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_PULSE_GRENADES}, self.player)) + ) + or (state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_MAELSTROM_ROUNDS, item_names.SIEGE_TANK_JUMP_JETS}, self.player)) + ) + + def sudden_strike_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_able_to_snipe_defiler(state) + and (self.terran_cliffjumper(state) or state.has(item_names.BANSHEE, self.player)) + and self.nova_splash(state) + and self.terran_defense_rating(state, True, False) >= 3 + and self.advanced_tactics + or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + ) + + def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool: + """ + Has unit usable as a Garrison in Enemy Intelligence + """ + return ( + state.has_any(( + item_names.MARINE, + item_names.SON_OF_KORHAL, + item_names.REAPER, + item_names.MARAUDER, + item_names.GHOST, + item_names.SPECTRE, + item_names.HELLION, + item_names.GOLIATH, + item_names.WARHOUND, + item_names.DIAMONDBACK, + item_names.VIKING, + item_names.DOMINION_TROOPER, + ), self.player) + or (self.advanced_tactics + and state.has(item_names.ROGUE_FORCES, self.player) + and state.count_from_list(( + item_names.WAR_PIGS, + item_names.HAMMER_SECURITIES, + item_names.DEATH_HEADS, + item_names.SPARTAN_COMPANY, + item_names.HELS_ANGELS, + item_names.BRYNHILDS, + ), self.player) >= 3 + ) + ) + + def enemy_intelligence_cliff_garrison(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.REAPER, item_names.VIKING), self.player) + or (state.has_any((item_names.MEDIVAC, item_names.HERCULES), self.player) + and self.enemy_intelligence_garrisonable_unit(state) + ) + or state.has_all({item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, self.player) + or (self.advanced_tactics and state.has_any({item_names.HELS_ANGELS, item_names.BRYNHILDS}, self.player)) + ) + + def enemy_intelligence_first_stage_requirement(self, state: CollectionState) -> bool: + return ( + self.enemy_intelligence_garrisonable_unit(state) + and ( + self.terran_competent_comp(state) + or (self.terran_common_unit(state) and self.terran_competent_anti_air(state) and state.has(item_names.NOVA_NUKE, self.player)) + ) + and self.terran_defense_rating(state, True, True) >= 5 + ) + + def enemy_intelligence_second_stage_requirement(self, state: CollectionState) -> bool: + return ( + self.enemy_intelligence_first_stage_requirement(state) + and self.enemy_intelligence_cliff_garrison(state) + and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ( + self.nova_any_weapon(state) + and (self.nova_full_stealth(state) or (self.nova_heal(state) and self.nova_splash(state) and self.nova_ranged_weapon(state))) + ) + ) + ) + + def enemy_intelligence_third_stage_requirement(self, state: CollectionState) -> bool: + return self.enemy_intelligence_second_stage_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant or (state.has(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) and self.nova_dash(state)) + ) + + def enemy_intelligence_cliff_garrison_and_nova_mobility(self, state: CollectionState) -> bool: + return self.enemy_intelligence_cliff_garrison(state) and ( + self.nova_any_nobuild_damage(state) + or ( + state.has(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player, 2) + and state.has_any((item_names.NOVA_FLASHBANG_GRENADES, item_names.NOVA_BLINK), self.player) + ) + ) + + def trouble_in_paradise_requirement(self, state: CollectionState) -> bool: + return ( + self.nova_any_weapon(state) + and self.nova_splash(state) + and self.terran_beats_protoss_deathball(state) + and self.terran_defense_rating(state, True, True) >= 7 + and self.terran_power_rating(state) >= 5 + ) + + def night_terrors_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_common_unit(state) + and self.terran_competent_anti_air(state) + and ( + # These can handle the waves of infested, even volatile ones + state.has(item_names.SIEGE_TANK, self.player) + or state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has_all((item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY), self.player) + or ( + ( + # Regular infesteds + ( + state.has_any((item_names.FIREBAT, item_names.REAPER), self.player) + or state.has_all({item_names.HELLION, item_names.HELLION_HELLBAT}, self.player) + ) + and self.terran_bio_heal(state) + or (self.advanced_tactics and state.has_any({item_names.PERDITION_TURRET, item_names.PLANETARY_FORTRESS}, self.player)) + ) + and ( + # Volatile infesteds + state.has(item_names.LIBERATOR, self.player) + or ( + self.advanced_tactics + and state.has(item_names.VULTURE, self.player) + or (state.has(item_names.HERC, self.player) and self.terran_bio_heal(state)) + ) + ) + ) + ) + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def flashpoint_far_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_mobile_detector(state) + and self.terran_defense_rating(state, True, False) >= 6 + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + and self.nova_splash(state) + and (self.advanced_tactics or self.terran_competent_ground_to_air(state)) + ) + + def enemy_shadow_tripwires_tool(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_FLASHBANG_GRENADES, item_names.NOVA_BLINK, item_names.NOVA_DOMINATION}, self.player) + + def enemy_shadow_door_unlocks_tool(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_BLINK, item_names.NOVA_JUMP_SUIT_MODULE}, self.player) + + def enemy_shadow_nova_damage_and_blazefire_unlock(self, state: CollectionState) -> bool: + return self.nova_any_nobuild_damage(state) and ( + state.has(item_names.NOVA_BLINK, self.player) or state.has_all((item_names.NOVA_HOLO_DECOY, item_names.NOVA_DOMINATION), self.player) + ) + + def enemy_shadow_domination(self, state: CollectionState) -> bool: + return self.grant_story_tech == GrantStoryTech.option_grant or ( + self.nova_ranged_weapon(state) + and ( + self.nova_full_stealth(state) + or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + or (self.nova_heal(state) and self.nova_splash(state)) + ) + ) + + def enemy_shadow_first_stage(self, state: CollectionState) -> bool: + return self.enemy_shadow_domination(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ((self.nova_full_stealth(state) and self.enemy_shadow_tripwires_tool(state)) or (self.nova_heal(state) and self.nova_splash(state))) + ) + + def enemy_shadow_second_stage(self, state: CollectionState) -> bool: + return self.enemy_shadow_first_stage(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or (self.nova_splash(state) or self.nova_heal(state) or self.nova_escape_assist(state)) + and (self.advanced_tactics or state.has(item_names.NOVA_GHOST_VISOR, self.player)) + ) + + def enemy_shadow_door_controls(self, state: CollectionState) -> bool: + return self.enemy_shadow_second_stage(state) and (self.grant_story_tech == GrantStoryTech.option_grant or self.enemy_shadow_door_unlocks_tool(state)) + + def enemy_shadow_victory(self, state: CollectionState) -> bool: + return self.enemy_shadow_door_controls(state) and (self.grant_story_tech == GrantStoryTech.option_grant or (self.nova_heal(state) and self.nova_beat_stone(state))) + + def dark_skies_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_beats_protoss_deathball(state) and self.terran_defense_rating(state, False, True) >= 8 + + def end_game_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_mobile_detector(state) + and self.nova_any_weapon(state) + and self.nova_splash(state) + and ( + # Xanthos + state.has_any((item_names.BATTLECRUISER, item_names.VIKING, item_names.WARHOUND), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_SMART_SERVOS), self.player) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + or ( + state.has(item_names.VALKYRIE, self.player) + and state.has_any((item_names.VALKYRIE_AFTERBURNERS, item_names.VALKYRIE_SHAPED_HULL), self.player) + and state.has_any((item_names.VALKYRIE_FLECHETTE_MISSILES, item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS), self.player) + ) + or (state.has(item_names.BANSHEE, self.player) and (self.advanced_tactics or state.has(item_names.BANSHEE_SHAPED_HULL, self.player))) + or ( + self.advanced_tactics + and ( + ( + state.has_all((item_names.MARINE, item_names.MARINE_PROGRESSIVE_STIMPACK), self.player) + and (self.terran_bio_heal(state) or state.count(item_names.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2) + ) + or (state.has(item_names.DOMINION_TROOPER, self.player) and self.terran_bio_heal(state)) + or state.has_all( + (item_names.PREDATOR, item_names.PREDATOR_RESOURCE_EFFICIENCY, item_names.PREDATOR_ADAPTIVE_DEFENSES), self.player + ) + or state.has_all((item_names.CYCLONE, item_names.CYCLONE_TARGETING_OPTICS), self.player) + ) + ) + ) + and ( # The enemy has 3/3 BCs + state.has_any( + (item_names.GOLIATH, item_names.VIKING, item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_BLAZEFIRE_GUNBLADE), self.player + ) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + or state.has_all((item_names.GHOST, item_names.GHOST_LOCKDOWN), self.player) + or state.has_all((item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY), self.player) + ) + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 3 + ) + + def has_terran_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_terran_units(state: CollectionState) -> bool: + return (state.count_from_list_unique(item_groups.terran_units + item_groups.terran_buildings, self.player) >= target) and ( + # Anything that can hit buildings + state.has_any(( + # Infantry + item_names.MARINE, + item_names.FIREBAT, + item_names.MARAUDER, + item_names.REAPER, + item_names.HERC, + item_names.DOMINION_TROOPER, + item_names.GHOST, + item_names.SPECTRE, + # Vehicles + item_names.HELLION, + item_names.VULTURE, + item_names.SIEGE_TANK, + item_names.WARHOUND, + item_names.GOLIATH, + item_names.DIAMONDBACK, + item_names.THOR, + item_names.PREDATOR, + item_names.CYCLONE, + # Ships + item_names.WRAITH, + item_names.VIKING, + item_names.BANSHEE, + item_names.RAVEN, + item_names.BATTLECRUISER, + # RG + item_names.SON_OF_KORHAL, + item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, + item_names.BULWARK_COMPANY, + item_names.SHOCK_DIVISION, + item_names.BLACKHAMMER, + item_names.SKY_FURY, + item_names.NIGHT_WOLF, + item_names.NIGHT_HAWK, + item_names.PRIDE_OF_AUGUSTRGRAD, + ), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.EMPERORS_GUARDIAN, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or state.has_all((item_names.WIDOW_MINE, item_names.WIDOW_MINE_DEMOLITION_PAYLOAD), self.player) + or ( + state.has_any(( + # Mercs with shortest initial cooldown (300s) + item_names.WAR_PIGS, + item_names.DEATH_HEADS, + item_names.HELS_ANGELS, + item_names.WINGED_NIGHTMARES, + ), self.player) + # + 2 upgrades that allow getting faster/earlier mercs + and state.count_from_list(( + item_names.RAPID_REINFORCEMENT, + item_names.PROGRESSIVE_FAST_DELIVERY, + item_names.ROGUE_FORCES, + # item_names.SIGNAL_BEACON, # Probably doesn't help too much on the first unit + ), self.player) >= 2 + ) + ) + + return _has_terran_units + + def has_zerg_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_zerg_units(state: CollectionState) -> bool: + num_units = ( + state.count_from_list_unique( + item_groups.zerg_nonmorph_units + item_groups.zerg_buildings + [item_names.OVERLORD_OVERSEER_ASPECT], + self.player + ) + + self.morph_baneling(state) + + self.morph_ravager(state) + + self.morph_igniter(state) + + self.morph_lurker(state) + + self.morph_impaler(state) + + self.morph_viper(state) + + self.morph_devourer(state) + + self.morph_brood_lord(state) + + self.morph_guardian(state) + + self.morph_tyrannozor(state) + ) + return ( + num_units >= target + and ( + # Anything that can hit buildings + state.has_any(( + item_names.ZERGLING, + item_names.SWARM_QUEEN, + item_names.ROACH, + item_names.HYDRALISK, + item_names.ABERRATION, + item_names.SWARM_HOST, + item_names.MUTALISK, + item_names.ULTRALISK, + item_names.PYGALISK, + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_BANSHEE, + # Mercs with <= 300s first drop time + item_names.DEVOURING_ONES, + item_names.HUNTER_KILLERS, + item_names.CAUSTIC_HORRORS, + item_names.HUNTERLING, + ), self.player) + or state.has_all((item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN), self.player) + or self.morph_baneling(state) + or self.morph_lurker(state) + or self.morph_impaler(state) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + or self.morph_ravager(state) + or self.morph_igniter(state) + or self.morph_tyrannozor(state) + or (self.morph_devourer(state) + and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player) + ) + or ( + state.has_any(( + # Mercs with <= 300s first drop time + item_names.DEVOURING_ONES, + item_names.HUNTER_KILLERS, + item_names.CAUSTIC_HORRORS, + item_names.HUNTERLING, + ), self.player) + # + 2 upgrades that allow getting faster/earlier mercs + and state.count_from_list(( + item_names.UNRESTRICTED_MUTATION, + item_names.EVOLUTIONARY_LEAP, + item_names.CELL_DIVISION, + item_names.SELF_SUFFICIENT, + ), self.player) >= 2 + ) + ) + ) + + return _has_zerg_units + + def has_protoss_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_protoss_units(state: CollectionState) -> bool: + return ( + state.count_from_list_unique(item_groups.protoss_units + item_groups.protoss_buildings + [item_names.NEXUS_OVERCHARGE], self.player) + >= target + ) and ( + # Anything that can hit buildings + state.has_any(( + # Gateway + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.SUPPLICANT, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.DRAGOON, + item_names.ADEPT, + item_names.SENTRY, + item_names.ENERGIZER, + item_names.AVENGER, + item_names.DARK_TEMPLAR, + item_names.BLOOD_HUNTER, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + # Robo + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.STALWART, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.REAVER, + item_names.DISRUPTOR, + # Stargate + item_names.SKIRMISHER, + item_names.SCOUT, + item_names.MISTWING, + item_names.OPPRESSOR, + item_names.PULSAR, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.DAWNBRINGER, + item_names.ARBITER, + item_names.ORACLE, + item_names.CARRIER, + item_names.TRIREME, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.MOTHERSHIP, + ), self.player) + or state.has_all((item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER), self.player) + or state.has_all((item_names.CALADRIUS, item_names.CALADRIUS_CORONA_BEAM), self.player) + or state.has_all((item_names.PHOTON_CANNON, item_names.KHALAI_INGENUITY), self.player) + or state.has_all((item_names.KHAYDARIN_MONOLITH, item_names.KHALAI_INGENUITY), self.player) + ) + + return _has_protoss_units + + def has_race_units(self, target: int, race: SC2Race) -> Callable[["CollectionState"], bool]: + if target == 0 or race == SC2Race.ANY: + return Location.access_rule + result = self.unit_count_functions.get((race, target)) + if result is not None: + return result + if race == SC2Race.TERRAN: + result = self.has_terran_units(target) + if race == SC2Race.ZERG: + result = self.has_zerg_units(target) + if race == SC2Race.PROTOSS: + result = self.has_protoss_units(target) + assert result + self.unit_count_functions[(race, target)] = result + return result + + +def get_basic_units(logic_level: int, race: SC2Race) -> Set[str]: + if logic_level > RequiredTactics.option_advanced: + return no_logic_basic_units[race] + elif logic_level == RequiredTactics.option_advanced: + return advanced_basic_units[race] + else: + return basic_units[race] diff --git a/worlds/sc2/settings.py b/worlds/sc2/settings.py new file mode 100644 index 00000000..26253b1e --- /dev/null +++ b/worlds/sc2/settings.py @@ -0,0 +1,49 @@ +from typing import Union +import settings + + +class Starcraft2Settings(settings.Group): + class WindowWidth(int): + """The starting width the client window in pixels""" + + class WindowHeight(int): + """The starting height the client window in pixels""" + + class GameWindowedMode(settings.Bool): + """Controls whether the game should start in windowed mode""" + + class TerranButtonColor(list): + """Defines the colour of terran mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class ZergButtonColor(list): + """Defines the colour of zerg mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class ProtossButtonColor(list): + """Defines the colour of protoss mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class DisableForcedCamera(str): + """Overrides the disable forced-camera slot option. Possible values: `true`, `false`, `default`. Default uses slot value""" + + class SkipCutscenes(str): + """Overrides the skip cutscenes slot option. Possible values: `true`, `false`, `default`. Default uses slot value""" + + class GameDifficulty(str): + """Overrides the slot's difficulty setting. Possible values: `casual`, `normal`, `hard`, `brutal`, `default`. Default uses slot value""" + + class GameSpeed(str): + """Overrides the slot's gamespeed setting. Possible values: `slower`, `slow`, `normal`, `fast`, `faster`, `default`. Default uses slot value""" + + class ShowTraps(settings.Bool): + """If set to true, in-client scouting will show traps as distinct from filler""" + + window_width: WindowWidth = WindowWidth(1080) + window_height: WindowHeight = WindowHeight(720) + game_windowed_mode: Union[GameWindowedMode, bool] = False + show_traps: Union[ShowTraps, bool] = False + disable_forced_camera: DisableForcedCamera = DisableForcedCamera("default") + skip_cutscenes: SkipCutscenes = SkipCutscenes("default") + game_difficulty: GameDifficulty = GameDifficulty("default") + game_speed: GameSpeed = GameSpeed("default") + terran_button_color: TerranButtonColor = TerranButtonColor([0.0838, 0.2898, 0.2346]) + zerg_button_color: ZergButtonColor = ZergButtonColor([0.345, 0.22425, 0.12765]) + protoss_button_color: ProtossButtonColor = ProtossButtonColor([0.18975, 0.2415, 0.345]) diff --git a/worlds/sc2/starcraft2.kv b/worlds/sc2/starcraft2.kv new file mode 100644 index 00000000..9013986f --- /dev/null +++ b/worlds/sc2/starcraft2.kv @@ -0,0 +1,61 @@ + + scroll_type: ["content", "bars"] + bar_width: dp(12) + effect_cls: "ScrollEffect" + canvas.after: + Color: + rgba: (0.82, 0.2, 0, root.border_on) + Line: + width: 1.5 + rectangle: self.x+1, self.y+1, self.width-1, self.height-1 + + + color: (1, 1, 1, 1) + canvas.before: + Color: + rgba: (0xd2/0xff, 0x33/0xff, 0, 1) + Rectangle: + pos: (self.x - 8, self.y - 8) + size: (self.width + 30, self.height + 16) + + + cols: 1 + size_hint_y: None + height: self.minimum_height + 15 + padding: [5,0,dp(12),0] + +: + cols: 1 + +: + rows: 1 + +: + cols: 1 + +: + rows: 1 + +: + cols: 1 + spacing: [0,5] + +: + text_size: self.size + markup: True + halign: 'center' + valign: 'middle' + padding: [5,0,5,0] + outline_width: 1 + canvas.before: + Color: + rgba: (1, 193/255, 86/255, root.is_goal) + Line: + width: 1 + rectangle: (self.x, self.y + 0.5, self.width, self.height) + canvas.after: + Color: + rgba: (0.8, 0.8, 0.8, root.is_exit) + Line: + width: 1 + rectangle: (self.x + 2, self.y + 3, self.width - 4, self.height - 4) \ No newline at end of file diff --git a/worlds/sc2/test/test_Regions.py b/worlds/sc2/test/test_Regions.py deleted file mode 100644 index c268b65d..00000000 --- a/worlds/sc2/test/test_Regions.py +++ /dev/null @@ -1,41 +0,0 @@ -import unittest -from .test_base import Sc2TestBase -from .. import Regions -from .. import Options, MissionTables - -class TestGridsizes(unittest.TestCase): - def test_grid_sizes_meet_specs(self): - self.assertTupleEqual((1, 2, 0), Regions.get_grid_dimensions(2)) - self.assertTupleEqual((1, 3, 0), Regions.get_grid_dimensions(3)) - self.assertTupleEqual((2, 2, 0), Regions.get_grid_dimensions(4)) - self.assertTupleEqual((2, 3, 1), Regions.get_grid_dimensions(5)) - self.assertTupleEqual((2, 4, 1), Regions.get_grid_dimensions(7)) - self.assertTupleEqual((2, 4, 0), Regions.get_grid_dimensions(8)) - self.assertTupleEqual((3, 3, 0), Regions.get_grid_dimensions(9)) - self.assertTupleEqual((2, 5, 0), Regions.get_grid_dimensions(10)) - self.assertTupleEqual((3, 4, 1), Regions.get_grid_dimensions(11)) - self.assertTupleEqual((3, 4, 0), Regions.get_grid_dimensions(12)) - self.assertTupleEqual((3, 5, 0), Regions.get_grid_dimensions(15)) - self.assertTupleEqual((4, 4, 0), Regions.get_grid_dimensions(16)) - self.assertTupleEqual((4, 6, 0), Regions.get_grid_dimensions(24)) - self.assertTupleEqual((5, 5, 0), Regions.get_grid_dimensions(25)) - self.assertTupleEqual((5, 6, 1), Regions.get_grid_dimensions(29)) - self.assertTupleEqual((5, 7, 2), Regions.get_grid_dimensions(33)) - - -class TestGridGeneration(Sc2TestBase): - options = { - "mission_order": Options.MissionOrder.option_grid, - "excluded_missions": [MissionTables.SC2Mission.ZERO_HOUR.mission_name,], - "enable_hots_missions": False, - "enable_prophecy_missions": True, - "enable_lotv_prologue_missions": False, - "enable_lotv_missions": False, - "enable_epilogue_missions": False, - "enable_nco_missions": False - } - - def test_size_matches_exclusions(self): - self.assertNotIn(MissionTables.SC2Mission.ZERO_HOUR.mission_name, self.multiworld.regions) - # WoL has 29 missions. -1 for Zero Hour being excluded, +1 for the automatically-added menu location - self.assertEqual(len(self.multiworld.regions), 29) diff --git a/worlds/sc2/test/test_base.py b/worlds/sc2/test/test_base.py index 28529e37..6110814c 100644 --- a/worlds/sc2/test/test_base.py +++ b/worlds/sc2/test/test_base.py @@ -1,11 +1,52 @@ from typing import * +import unittest +import random +from argparse import Namespace +from BaseClasses import MultiWorld, CollectionState, PlandoOptions +from Generate import get_seed_name +from worlds import AutoWorld +from test.general import gen_steps, call_all -from test.TestBase import WorldTestBase +from test.bases import WorldTestBase from .. import SC2World -from .. import Client +from .. import client class Sc2TestBase(WorldTestBase): - game = Client.SC2Context.game + game = client.SC2Context.game world: SC2World player: ClassVar[int] = 1 skip_long_tests: bool = True + + +class Sc2SetupTestBase(unittest.TestCase): + """ + A custom sc2-specific test base class that provides an explicit function to generate the world from options. + This allows potentially generating multiple worlds in one test case, useful for tracking down a rare / sporadic + crash. + """ + seed: Optional[int] = None + game = SC2World.game + player = 1 + def generate_world(self, options: Dict[str, Any]) -> None: + self.multiworld = MultiWorld(1) + self.multiworld.game[self.player] = self.game + self.multiworld.player_name = {self.player: "Tester"} + self.multiworld.set_seed(self.seed) + random.seed(self.multiworld.seed) + self.multiworld.seed_name = get_seed_name(random) # only called to get same RNG progression as Generate.py + args = Namespace() + for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].options_dataclass.type_hints.items(): + new_option = option.from_any(options.get(name, option.default)) + new_option.verify(SC2World, "Tester", PlandoOptions.items|PlandoOptions.connections|PlandoOptions.texts|PlandoOptions.bosses) + setattr(args, name, { + 1: new_option + }) + self.multiworld.set_options(args) + self.world: SC2World = cast(SC2World, self.multiworld.worlds[self.player]) + self.multiworld.state = CollectionState(self.multiworld) + try: + for step in gen_steps: + call_all(self.multiworld, step) + except Exception as ex: + ex.add_note(f"Seed: {self.multiworld.seed}") + raise diff --git a/worlds/sc2/test/test_custom_mission_orders.py b/worlds/sc2/test/test_custom_mission_orders.py new file mode 100644 index 00000000..f431e909 --- /dev/null +++ b/worlds/sc2/test/test_custom_mission_orders.py @@ -0,0 +1,216 @@ +""" +Unit tests for custom mission orders +""" + +from .test_base import Sc2SetupTestBase +from .. import MissionFlag +from ..item import item_tables, item_names +from BaseClasses import ItemClassification + +class TestCustomMissionOrders(Sc2SetupTestBase): + def test_mini_wol_generates(self): + world_options = { + 'mission_order': 'custom', + 'custom_mission_order': { + 'Mini Wings of Liberty': { + 'global': { + 'type': 'column', + 'mission_pool': [ + 'terran missions', + '^ wol missions' + ] + }, + 'Mar Sara': { + 'size': 1 + }, + 'Colonist': { + 'size': 2, + 'entry_rules': [{ + 'scope': '../Mar Sara' + }] + }, + 'Artifact': { + 'size': 3, + 'entry_rules': [{ + 'scope': '../Mar Sara' + }], + 'missions': [ + { + 'index': 1, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 4 + }] + }, + { + 'index': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 8 + }] + } + ] + }, + 'Prophecy': { + 'size': 2, + 'entry_rules': [{ + 'scope': '../Artifact/1' + }], + 'mission_pool': [ + 'protoss missions', + '^ prophecy missions' + ] + }, + 'Covert': { + 'size': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 2 + }] + }, + 'Rebellion': { + 'size': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 3 + }] + }, + 'Char': { + 'size': 3, + 'entry_rules': [{ + 'scope': '../Artifact/2' + }], + 'missions': [ + { + 'index': 0, + 'next': [2] + }, + { + 'index': 1, + 'entrance': True + } + ] + } + } + } + } + + self.generate_world(world_options) + flags = self.world.custom_mission_order.get_used_flags() + self.assertEqual(flags[MissionFlag.Terran], 13) + self.assertEqual(flags[MissionFlag.Protoss], 2) + self.assertEqual(flags.get(MissionFlag.Zerg, 0), 0) + sc2_regions = set(self.multiworld.regions.region_cache[self.player]) - {"Menu"} + self.assertEqual(len(self.world.custom_mission_order.get_used_missions()), len(sc2_regions)) + + def test_locked_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.MARINE_OPTIMIZED_LOGISTICS + world_options = { + 'mission_order': 'custom', + 'locked_items': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.assertNotEqual(item_tables.item_table[test_item].classification, ItemClassification.progression, f"Test item {test_item} won't change classification") + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + test_items_in_pool += [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 1) + self.assertEqual(test_items_in_pool[0].classification, ItemClassification.progression) + + def test_start_inventory_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.ZERGLING_METABOLIC_BOOST + world_options = { + 'mission_order': 'custom', + 'start_inventory': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 0) + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_start_inventory), 1) + + def test_start_inventory_and_locked_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.ZERGLING_METABOLIC_BOOST + world_options = { + 'mission_order': 'custom', + 'start_inventory': { test_item: 1 }, + 'locked_items': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 0) + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_start_inventory), 1) + + def test_key_item_rule_creates_correct_item_amount(self): + # This is an item that normally only exists once + test_item = item_names.ZERGLING + test_amount = 3 + world_options = { + 'mission_order': 'custom', + 'locked_items': { test_item: 1 }, # Make sure it is generated as normal + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 12, # Give the generator some space to place the keys + 'max_difficulty': 'easy', + 'mission_pool': ['zerg missions'], # Make sure the item isn't excluded by race selection + 'missions': [{ + 'index': 10, + 'entry_rules': [{ + 'items': { test_item: test_amount } # Require more than the usual item amount + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_pool + test_items_in_start_inventory), test_amount) diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py new file mode 100644 index 00000000..faedb19a --- /dev/null +++ b/worlds/sc2/test/test_generation.py @@ -0,0 +1,1228 @@ +""" +Unit tests for world generation +""" +from typing import * +from .test_base import Sc2SetupTestBase + +from .. import mission_groups, mission_tables, options, locations, SC2Mission, SC2Campaign, SC2Race, unreleased_items +from ..item import item_groups, item_tables, item_names +from .. import get_all_missions, get_random_first_mission +from ..options import EnabledCampaigns, NovaGhostOfAChanceVariant, MissionOrder, ExcludeOverpoweredItems, \ + VanillaItemsOnly, MaximumCampaignSize + + +class TestItemFiltering(Sc2SetupTestBase): + def test_explicit_locks_excludes_interact_and_set_flags(self): + world_options = { + 'locked_items': { + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.MEDIVAC: 1, + item_names.FIREBAT: 1, + item_names.ZEALOT: 0, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: 2, + }, + 'excluded_items': { + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.MEDIVAC: 0, + item_names.FIREBAT: 1, + item_names.ZERGLING: 0, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: 2, + } + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, itempool) + self.assertIn(item_names.MARAUDER, itempool) + self.assertIn(item_names.MEDIVAC, itempool) + self.assertIn(item_names.FIREBAT, itempool) + self.assertIn(item_names.ZEALOT, itempool) + self.assertNotIn(item_names.ZERGLING, itempool) + regen_biosteel_items = [x for x in itempool if x == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + self.assertEqual(len(regen_biosteel_items), 2) + + def test_unexcludes_cancel_out_excludes(self): + world_options = { + 'grant_story_tech': options.GrantStoryTech.option_grant, + 'excluded_items': { + item_groups.ItemGroupNames.NOVA_EQUIPMENT: 15, + item_names.MARINE_PROGRESSIVE_STIMPACK: 1, + item_names.MARAUDER_PROGRESSIVE_STIMPACK: 2, + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.REAPER: 1, + item_names.DIAMONDBACK: 0, + item_names.HELLION: 1, + # Additional excludes to increase the likelihood that unexcluded items actually appear + item_groups.ItemGroupNames.STARPORT_UNITS: 0, + item_names.WARHOUND: 0, + item_names.VULTURE: 0, + item_names.WIDOW_MINE: 0, + item_names.THOR: 0, + item_names.GHOST: 0, + item_names.SPECTRE: 0, + item_groups.ItemGroupNames.MENGSK_UNITS: 0, + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + }, + 'unexcluded_items': { + item_names.NOVA_PLASMA_RIFLE: 1, # Necessary to pass logic + item_names.NOVA_PULSE_GRENADES: 0, # Necessary to pass logic + item_names.NOVA_JUMP_SUIT_MODULE: 0, # Necessary to pass logic + item_groups.ItemGroupNames.BARRACKS_UNITS: 0, + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: 1, + item_names.HELLION: 1, + item_names.MARINE_PROGRESSIVE_STIMPACK: 1, + item_names.MARAUDER_PROGRESSIVE_STIMPACK: 0, + # Additional unexcludes for logic + item_names.MEDIVAC: 0, + item_names.BATTLECRUISER: 0, + item_names.SCIENCE_VESSEL: 0, + }, + # Terran-only + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, itempool) + self.assertIn(item_names.MARAUDER, itempool) + self.assertIn(item_names.REAPER, itempool) + self.assertEqual(itempool.count(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE), 1, "Stealth suit occurred the wrong number of times") + self.assertIn(item_names.HELLION, itempool) + self.assertEqual(itempool.count(item_names.MARINE_PROGRESSIVE_STIMPACK), 2, f"Marine stimpacks weren't unexcluded (seed {self.multiworld.seed})") + self.assertEqual(itempool.count(item_names.MARAUDER_PROGRESSIVE_STIMPACK), 2, f"Marauder stimpacks weren't unexcluded (seed {self.multiworld.seed})") + self.assertNotIn(item_names.DIAMONDBACK, itempool) + self.assertNotIn(item_names.NOVA_BLAZEFIRE_GUNBLADE, itempool) + self.assertNotIn(item_names.NOVA_ENERGY_SUIT_MODULE, itempool) + + def test_excluding_groups_excludes_all_items_in_group(self): + world_options = { + 'excluded_items': [ + item_groups.ItemGroupNames.BARRACKS_UNITS.lower(), + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, self.world.options.excluded_items) + for item_name in item_groups.barracks_units: + self.assertNotIn(item_name, itempool) + + def test_excluding_mission_groups_excludes_all_missions_in_group(self): + world_options = { + 'excluded_missions': [ + mission_groups.MissionGroupNames.HOTS_ZERUS_MISSIONS, + ], + 'mission_order': options.MissionOrder.option_grid, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.WAKING_THE_ANCIENT, missions) + self.assertNotIn(mission_tables.SC2Mission.THE_CRUCIBLE, missions) + self.assertNotIn(mission_tables.SC2Mission.SUPREME, missions) + + def test_excluding_campaigns_excludes_campaign_specific_items(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name + }, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ProtossItemType) + self.assertNotIn(item_data.type, item_tables.ZergItemType) + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Nova_Gear) + self.assertNotEqual(item_name, item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE) + + def test_starter_unit_populates_start_inventory(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'shuffle_no_build': options.ShuffleNoBuild.option_false, + 'mission_order': options.MissionOrder.option_grid, + 'starter_unit': options.StarterUnit.option_any_starter_unit, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + self.assertTrue(self.multiworld.precollected_items[self.player]) + + def test_excluding_all_terran_missions_excludes_all_terran_items(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Terran in mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.TerranItemType, f"Item '{item_name}' included when all terran missions are excluded") + + def test_excluding_all_terran_build_missions_excludes_all_terran_units(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Terran in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Unit, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Mercenary, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Building, f"Item '{item_name}' included when all terran build missions are excluded") + + def test_excluding_all_zerg_and_kerrigan_missions_excludes_all_zerg_items(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if (mission_tables.MissionFlag.Kerrigan | mission_tables.MissionFlag.Zerg) & mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ZergItemType, f"Item '{item_name}' included when all zerg missions are excluded") + + def test_excluding_all_zerg_build_missions_excludes_zerg_units(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Zerg in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags], + mission_tables.SC2Mission.ENEMY_WITHIN.mission_name, + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Unit, f"Item '{item_name}' included when all zerg build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Mercenary, f"Item '{item_name}' included when all zerg build missions are excluded") + + def test_excluding_all_protoss_missions_excludes_all_protoss_items(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Protoss in mission.flags], + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ProtossItemType, f"Item '{item_name}' included when all protoss missions are excluded") + + def test_excluding_all_protoss_build_missions_excludes_protoss_units(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission.race == mission_tables.SC2Race.PROTOSS + and mission_tables.MissionFlag.NoBuild not in mission.flags], + mission_tables.SC2Mission.TEMPLAR_S_RETURN.mission_name, + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit_2, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Building, f"Item '{item_name}' included when all protoss build missions are excluded") + + def test_vanilla_items_only_excludes_terran_progressives(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + self.assertTrue(world_items) + occurrences: Dict[str, int] = {} + for item_name, _ in world_items: + if item_name in item_groups.terran_progressive_items: + if item_name in item_groups.nova_equipment: + # The option imposes no contraint on Nova equipment + continue + occurrences.setdefault(item_name, 0) + occurrences[item_name] += 1 + self.assertLessEqual(occurrences[item_name], 1, f"'{item_name}' unexpectedly appeared multiple times in the pool") + + def test_vanilla_items_only_includes_only_nova_equipment_and_vanilla_and_filler_items(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + # Avoid options that lock non-vanilla items for logic + 'spear_of_adun_presence': options.SpearOfAdunPresence.option_protoss, + 'required_tactics': options.RequiredTactics.option_advanced, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'accessibility': 'locations', + 'vanilla_items_only': True, + # Move the unit nerf items from the start inventory to the pool, + # else this option could push non-vanilla items past this test + 'war_council_nerfs': True, + } + + self.generate_world(world_options) + + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + self.assertTrue(world_items) + self.assertNotIn(item_names.DESTROYER_REFORGED_BLOODSHARD_CORE, world_items) + for item_name, item_data in world_items: + if item_data.quantity == 0: + continue + self.assertIn(item_name, item_groups.vanilla_items + item_groups.nova_equipment) + + def test_evil_awoken_with_vanilla_items_only_generates(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + self.assertTrue(self.world.get_region(mission_tables.SC2Mission.EVIL_AWOKEN.mission_name)) + + def test_enemy_within_and_no_zerg_build_missions_generates(self) -> None: + world_options = { + # including WoL to allow for valid goal missions + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.HOTS.campaign_name + }, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Zerg in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags + ], + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + self.assertTrue(self.world.get_region(mission_tables.SC2Mission.ENEMY_WITHIN.mission_name)) + self.assertNotIn(item_names.ULTRALISK, itempool) + self.assertNotIn(item_names.SWARM_QUEEN, itempool) + self.assertNotIn(item_names.MUTALISK, itempool) + self.assertNotIn(item_names.CORRUPTOR, itempool) + self.assertNotIn(item_names.SCOURGE, itempool) + + def test_soa_items_are_included_in_wol_when_presence_set_to_everywhere(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'spear_of_adun_presence': options.SpearOfAdunPresence.option_everywhere, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + # Ensure enough locations to fit all wanted items + 'generic_upgrade_missions': 1, + 'victory_cache': 5, + 'excluded_items': {item_groups.ItemGroupNames.BARRACKS_UNITS: 0}, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + soa_items_in_pool = [item_name for item_name in itempool if item_tables.item_table[item_name].type == item_tables.ProtossItemType.Spear_Of_Adun] + self.assertGreater(len(soa_items_in_pool), 5) + + def test_lotv_only_doesnt_include_kerrigan_items_with_grant_story_tech(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.LOTV.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'grant_story_tech': options.GrantStoryTech.option_grant, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertIn(mission_tables.SC2Mission.TEMPLE_OF_UNIFICATION, missions) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + kerrigan_items_in_pool = set(item_groups.kerrigan_abilities).intersection(itempool) + self.assertFalse(kerrigan_items_in_pool) + kerrigan_passives_in_pool = set(item_groups.kerrigan_passives).intersection(itempool) + self.assertFalse(kerrigan_passives_in_pool) + + def test_excluding_zerg_units_with_morphling_enabled_doesnt_exclude_aspects(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'enable_morphling': options.EnableMorphling.option_true, + 'excluded_items': [ + item_groups.ItemGroupNames.ZERG_UNITS.lower() + ], + 'unexcluded_items': [ + item_groups.ItemGroupNames.ZERG_MORPHS.lower() + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + aspects_in_pool = list(set(itempool).intersection(set(item_groups.zerg_morphs))) + self.assertTrue(aspects_in_pool) + units_in_pool = list(set(itempool).intersection(set(item_groups.zerg_units)) + .difference(set(item_groups.zerg_morphs))) + self.assertFalse(units_in_pool) + + def test_excluding_zerg_units_with_morphling_disabled_should_exclude_aspects(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'enable_morphling': options.EnableMorphling.option_false, + 'excluded_items': [ + item_groups.ItemGroupNames.ZERG_UNITS.lower() + ], + 'unexcluded_items': [ + item_groups.ItemGroupNames.ZERG_MORPHS.lower() + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + aspects_in_pool = list(set(itempool).intersection(set(item_groups.zerg_morphs))) + if item_names.OVERLORD_OVERSEER_ASPECT in aspects_in_pool: + # Overseer morphs from Overlord, that's available always + aspects_in_pool.remove(item_names.OVERLORD_OVERSEER_ASPECT) + self.assertFalse(aspects_in_pool) + units_in_pool = list(set(itempool).intersection(set(item_groups.zerg_units)) + .difference(set(item_groups.zerg_morphs))) + self.assertFalse(units_in_pool) + + def test_deprecated_orbital_command_not_present(self) -> None: + """ + Orbital command got replaced. The item is still there for backwards compatibility. + It shouldn't be generated. + """ + world_options = {} + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertTrue(itempool) + self.assertNotIn(item_names.PROGRESSIVE_ORBITAL_COMMAND, itempool) + + def test_planetary_orbital_module_not_present_without_cc_spells(self) -> None: + world_options = { + "excluded_items": [ + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES + ], + "locked_items": [ + item_names.PLANETARY_FORTRESS + ] + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertTrue(itempool) + self.assertIn(item_names.PLANETARY_FORTRESS, itempool) + self.assertNotIn(item_names.PLANETARY_FORTRESS_ORBITAL_MODULE, itempool) + + def test_disabling_unit_nerfs_start_inventories_war_council_upgrades(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'war_council_nerfs': options.WarCouncilNerfs.option_false, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + war_council_item_names = set(item_groups.item_name_groups[item_groups.ItemGroupNames.WAR_COUNCIL]) + present_war_council_items = war_council_item_names.intersection(itempool) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + starting_war_council_items = war_council_item_names.intersection(starting_inventory) + + self.assertTrue(itempool) + self.assertFalse(present_war_council_items, f'Found war council upgrades when war_council_nerfs is false: {present_war_council_items}') + self.assertEqual(war_council_item_names, starting_war_council_items) + + def test_disabling_speedrun_locations_removes_them_from_the_pool(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_filler, + } + + self.generate_world(world_options) + world_regions = list(self.multiworld.regions) + world_location_names = [location.name for region in world_regions for location in region.locations] + all_location_names = [location_data.name for location_data in locations.DEFAULT_LOCATION_LIST] + speedrun_location_name = f"{mission_tables.SC2Mission.LAB_RAT.mission_name}: Win In Under 10 Minutes" + self.assertIn(speedrun_location_name, all_location_names) + self.assertNotIn(speedrun_location_name, world_location_names) + + def test_nco_and_wol_picks_correct_starting_mission(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + } + self.generate_world(world_options) + self.assertEqual(get_random_first_mission(self.world, self.world.custom_mission_order), mission_tables.SC2Mission.LIBERATION_DAY) + + def test_excluding_mission_short_name_excludes_all_variants_of_mission(self): + world_options = { + 'excluded_missions': [ + mission_tables.SC2Mission.ZERO_HOUR.mission_name.split(" (")[0] + ], + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': options.SelectRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR, missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR_Z, missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR_P, missions) + + def test_excluding_mission_variant_excludes_just_that_variant(self): + world_options = { + 'excluded_missions': [ + mission_tables.SC2Mission.ZERO_HOUR.mission_name + ], + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': options.SelectRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR, missions) + self.assertIn(mission_tables.SC2Mission.ZERO_HOUR_Z, missions) + self.assertIn(mission_tables.SC2Mission.ZERO_HOUR_P, missions) + + def test_weapon_armor_upgrades(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON] + other_bundle_items = [ + x for x in world_items if x in ( + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, + ) + ] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_weapon_items), 3) + self.assertEqual(len(other_bundle_items), 0) + + def test_weapon_armor_upgrades_with_bundles(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_unit_class, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_upgrade_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE] + other_bundle_items = [ + x for x in world_items if x in ( + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + ) + ] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_upgrade_items), 3) + self.assertEqual(len(other_bundle_items), 0) + + def test_weapon_armor_upgrades_all_in_air(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON] + ship_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_weapon_items), 3) + self.assertGreaterEqual(len(ship_weapon_items), 3) + + def test_weapon_armor_upgrades_generic_upgrade_missions(self): + """ + Tests the case when there aren't enough missions in order to get required weapon/armor upgrades + for logic requirements. + :return: + """ + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 100, # Fallback happens by putting weapon/armor upgrades into starting inventory + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertEqual(len(upgrade_items), 3) + + def test_weapon_armor_upgrades_generic_upgrade_missions_no_logic(self): + """ + Tests the case when there aren't enough missions in order to get required weapon/armor upgrades + for logic requirements. + + Except the case above it's No Logic, thus the fallback won't take place. + :return: + """ + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 100, # Fallback happens by putting weapon/armor upgrades into starting inventory + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # No logic won't take the fallback to trigger + self.assertEqual(len(upgrade_items), 0) + + def test_weapon_armor_upgrades_generic_upgrade_missions_no_countermeasure_needed(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 1, # Weapon / Armor upgrades should be available almost instantly + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # No additional starting inventory item placement is needed + self.assertEqual(len(upgrade_items), 0) + + def test_kerrigan_levels_per_mission_triggering_pre_fill(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 3, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.THE_INFINITE_CYCLE.mission_name] + }, + { + 'index': 2, + 'mission_pool': [SC2Mission.THE_RECKONING.mission_name] + }, + ] + } + } + }, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'grant_story_levels': options.GrantStoryLevels.option_disabled, + 'kerrigan_levels_per_mission_completed': 1, + 'kerrigan_level_item_distribution': options.KerriganLevelItemDistribution.option_size_2, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + kerrigan_1_stacks = [x for x in starting_inventory if x == item_names.KERRIGAN_LEVELS_1] + + self.assertGreater(len(kerrigan_1_stacks), 0) + + def test_kerrigan_levels_per_mission_and_generic_upgrades_both_triggering_pre_fill(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 3, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.THE_INFINITE_CYCLE.mission_name] + }, + { + 'index': 2, + 'mission_pool': [SC2Mission.THE_RECKONING.mission_name] + }, + ] + } + } + }, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'grant_story_levels': options.GrantStoryLevels.option_disabled, + 'kerrigan_levels_per_mission_completed': 1, + 'kerrigan_level_item_distribution': options.KerriganLevelItemDistribution.option_size_2, + 'generic_upgrade_missions': 100, # Weapon / Armor upgrades + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + kerrigan_1_stacks = [x for x in starting_inventory if x == item_names.KERRIGAN_LEVELS_1] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE] + + self.assertGreater(len(kerrigan_1_stacks), 0) # Kerrigan levels were added + self.assertEqual(len(upgrade_items), 3) # W/A upgrades were added + self.assertNotIn(item_names.KERRIGAN_LEVELS_70, itempool) + self.assertNotIn(item_names.KERRIGAN_LEVELS_70, starting_inventory) + + + + def test_locking_required_items(self): + world_options = { + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 2, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.SUPREME.mission_name] + }, + ] + } + } + }, + 'grant_story_levels': options.GrantStoryLevels.option_additive, + 'excluded_items': [ + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_MEND, + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + # These items will be in the pool despite exclusions + self.assertIn(item_names.KERRIGAN_LEAPING_STRIKE, itempool) + self.assertIn(item_names.KERRIGAN_MEND, itempool) + + + def test_fully_balanced_mission_races(self): + """ + Tests whether fully balanced mission race balancing actually is fully balanced. + """ + campaign_size = 57 + self.assertEqual(campaign_size % 3, 0, "Chosen test size cannot be perfectly balanced") + world_options = { + # Reasonably large grid with enough missions to balance races + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': campaign_size, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'selected_races': options.SelectRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_race_balancing': options.EnableMissionRaceBalancing.option_fully_balanced, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + missions = [mission_tables.lookup_name_to_mission[region] for region in world_regions] + race_flags = [mission_tables.MissionFlag.Terran, mission_tables.MissionFlag.Zerg, mission_tables.MissionFlag.Protoss] + race_counts = { flag: sum(flag in mission.flags for mission in missions) for flag in race_flags } + + self.assertEqual(race_counts[mission_tables.MissionFlag.Terran], race_counts[mission_tables.MissionFlag.Zerg]) + self.assertEqual(race_counts[mission_tables.MissionFlag.Zerg], race_counts[mission_tables.MissionFlag.Protoss]) + + def test_setting_filter_weight_to_zero_excludes_that_item(self) -> None: + world_options = { + 'filler_items_distribution': { + item_names.STARTING_MINERALS: 0, + item_names.STARTING_VESPENE: 1, + item_names.STARTING_SUPPLY: 0, + item_names.MAX_SUPPLY: 0, + item_names.REDUCED_MAX_SUPPLY: 0, + item_names.SHIELD_REGENERATION: 0, + item_names.BUILDING_CONSTRUCTION_SPEED: 0, + }, + # Exclude many items to get filler to generate + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + }, + 'max_number_of_upgrades': 2, + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.STARTING_MINERALS, itempool) + self.assertNotIn(item_names.STARTING_SUPPLY, itempool) + self.assertNotIn(item_names.MAX_SUPPLY, itempool) + self.assertNotIn(item_names.REDUCED_MAX_SUPPLY, itempool) + self.assertNotIn(item_names.SHIELD_REGENERATION, itempool) + self.assertNotIn(item_names.BUILDING_CONSTRUCTION_SPEED, itempool) + + self.assertIn(item_names.STARTING_VESPENE, itempool) + + def test_shields_filler_doesnt_appear_if_no_protoss_missions_appear(self) -> None: + world_options = { + 'filler_items_distribution': { + item_names.STARTING_MINERALS: 1, + item_names.STARTING_VESPENE: 0, + item_names.STARTING_SUPPLY: 0, + item_names.MAX_SUPPLY: 0, + item_names.REDUCED_MAX_SUPPLY: 1, + item_names.SHIELD_REGENERATION: 1, + item_names.BUILDING_CONSTRUCTION_SPEED: 0, + }, + # Exclude many items to get filler to generate + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + item_groups.ItemGroupNames.ZERG_MORPHS: 0, + }, + 'max_number_of_upgrades': 2, + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.SHIELD_REGENERATION, itempool) + + self.assertNotIn(item_names.STARTING_VESPENE, itempool) + self.assertNotIn(item_names.STARTING_SUPPLY, itempool) + self.assertNotIn(item_names.MAX_SUPPLY, itempool) + self.assertNotIn(item_names.BUILDING_CONSTRUCTION_SPEED, itempool) + + self.assertIn(item_names.STARTING_MINERALS, itempool) + self.assertIn(item_names.REDUCED_MAX_SUPPLY, itempool) + + def test_weapon_armor_upgrade_items_capped_by_max_upgrade_level(self) -> None: + MAX_LEVEL = 3 + world_options = { + 'locked_items': { + item_groups.ItemGroupNames.TERRAN_GENERIC_UPGRADES: MAX_LEVEL, + item_groups.ItemGroupNames.ZERG_GENERIC_UPGRADES: MAX_LEVEL, + item_groups.ItemGroupNames.PROTOSS_GENERIC_UPGRADES: MAX_LEVEL + 1, + }, + 'max_upgrade_level': MAX_LEVEL, + 'mission_order': options.MissionOrder.option_grid, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_weapon_and_armor + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + upgrade_item_counts: Dict[str, int] = {} + for item_name in itempool: + if item_tables.item_table[item_name].type in ( + item_tables.TerranItemType.Upgrade, + item_tables.ZergItemType.Upgrade, + item_tables.ProtossItemType.Upgrade, + ): + upgrade_item_counts[item_name] = upgrade_item_counts.get(item_name, 0) + 1 + expected_result = { + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: MAX_LEVEL + 1, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: MAX_LEVEL + 1, + } + self.assertDictEqual(expected_result, upgrade_item_counts) + + def test_ghost_of_a_chance_generates_without_nco(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 1, # Give the generator some space to place the key + 'mission_pool': [ + SC2Mission.GHOST_OF_A_CHANCE.mission_name + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.NOVA_C20A_CANISTER_RIFLE, itempool) + self.assertNotIn(item_names.NOVA_DOMINATION, itempool) + + def test_ghost_of_a_chance_generates_using_nco_nova(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_nco, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 2, # Give the generator some space to place the key + 'mission_pool': [ + SC2Mission.LIBERATION_DAY.mission_name, # Starter mission + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertGreater(len({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_DOMINATION}.intersection(itempool)), 0) + + def test_ghost_of_a_chance_generates_with_nco(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 3, # Give the generator some space to place the key + 'mission_pool': [ + SC2Mission.LIBERATION_DAY.mission_name, # Starter mission + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + SC2Mission.FLASHPOINT.mission_name, # A NCO mission + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertGreater(len({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_DOMINATION}.intersection(itempool)), 0) + + def test_exclude_overpowered_items(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + atx_laser_battery_items = [item for item in itempool if item == item_names.BATTLECRUISER_ATX_LASER_BATTERY] + + self.assertEqual(len(regen_biosteel_items), 2) # Progressive, only top level is excluded + self.assertEqual(len(atx_laser_battery_items), 0) # Non-progressive + + def test_exclude_overpowered_items_not_excluded(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + atx_laser_battery_items = [item for item in itempool if item == item_names.BATTLECRUISER_ATX_LASER_BATTERY] + + self.assertEqual(len(regen_biosteel_items), 3) + self.assertEqual(len(atx_laser_battery_items), 1) + + def test_exclude_overpowered_items_vanilla_only(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'vanilla_items_only': VanillaItemsOnly.option_true, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + # Regen biosteel is in both of the lists + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + + self.assertEqual(len(regen_biosteel_items), 1) # One stack shall remain + + def test_exclude_locked_overpowered_items(self) -> None: + locked_item = item_names.BATTLECRUISER_ATX_LASER_BATTERY + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'locked_items': [locked_item], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + atx_laser_battery_items = [item for item in itempool if item == locked_item] + + self.assertEqual(len(atx_laser_battery_items), 1) # Locked, remains + + def test_unreleased_item_quantity(self) -> None: + """ + Checks if all unreleased items are marked properly not to generate + """ + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + items_to_check: List[str] = unreleased_items + for item in items_to_check: + self.assertNotIn(item, itempool) + + def test_unreleased_item_quantity_locked(self) -> None: + """ + Checks if all unreleased items are marked properly not to generate + Locking overrides this behavior - if they're locked, they must appear + """ + world_options = { + 'mission_order': MissionOrder.option_grid, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'locked_items': {item_name: 0 for item_name in unreleased_items}, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + items_to_check: List[str] = unreleased_items + for item in items_to_check: + self.assertIn(item, itempool) + + def test_merc_excluded_excludes_merc_upgrades(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'excluded_items': [item_name for item_name in item_groups.terran_mercenaries], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.ROGUE_FORCES, itempool) + + def test_unexcluded_items_applies_over_op_items(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'unexcluded_items': [item_names.SOA_TIME_STOP], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn( + item_groups.overpowered_items[0], + itempool, + f"OP item {item_groups.overpowered_items[0]} in the item pool when exclude_overpowered_items was true" + ) + self.assertIn( + item_names.SOA_TIME_STOP, + itempool, + f"{item_names.SOA_TIME_STOP} was not unexcluded by unexcluded_items when exclude_overpowered_items was true" + ) + + def test_exclude_overpowered_items_and_not_allow_unit_nerfs(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'war_council_nerfs': options.WarCouncilNerfs.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + + # A unit nerf happens due to excluding OP items + self.assertNotIn(item_names.MOTHERSHIP_INTEGRATED_POWER, starting_inventory) diff --git a/worlds/sc2/test/test_item_filtering.py b/worlds/sc2/test/test_item_filtering.py new file mode 100644 index 00000000..898fb6da --- /dev/null +++ b/worlds/sc2/test/test_item_filtering.py @@ -0,0 +1,88 @@ +""" +Unit tests for item filtering like pool_filter.py +""" + +from .test_base import Sc2SetupTestBase +from ..item import item_groups, item_names +from .. import options +from ..mission_tables import SC2Race + +class ItemFilterTests(Sc2SetupTestBase): + def test_excluding_all_barracks_units_excludes_infantry_upgrades(self) -> None: + world_options = { + 'excluded_items': { + item_groups.ItemGroupNames.BARRACKS_UNITS: 0 + }, + 'required_tactics': 'standard', + 'min_number_of_upgrades': 1, + 'selected_races': { + SC2Race.TERRAN.get_title() + }, + 'mission_order': 'grid', + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + races = {mission.race for mission in self.world.custom_mission_order.get_used_missions()} + self.assertIn(SC2Race.TERRAN, races) + self.assertNotIn(SC2Race.ZERG, races) + self.assertNotIn(SC2Race.PROTOSS, races) + itempool = [item.name for item in self.multiworld.itempool] + self.assertNotIn(item_names.MARINE, itempool) + self.assertNotIn(item_names.MARAUDER, itempool) + + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, itempool) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, itempool) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, itempool) + + def test_excluding_one_item_of_multi_parent_doesnt_filter_children(self) -> None: + world_options = { + 'locked_items': { + item_names.SENTINEL: 1, + item_names.CENTURION: 1, + }, + 'excluded_items': { + item_names.ZEALOT: 1, + # Exclude more items to make space + item_names.WRATHWALKER: 1, + item_names.ENERGIZER: 1, + item_names.AVENGER: 1, + item_names.ARBITER: 1, + item_names.VOID_RAY: 1, + item_names.PULSAR: 1, + item_names.DESTROYER: 1, + item_names.DAWNBRINGER: 1, + }, + 'min_number_of_upgrades': 2, + 'required_tactics': 'standard', + 'selected_races': { + SC2Race.PROTOSS.get_title() + }, + 'mission_order': 'grid', + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY, itempool) + self.assertIn(item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS, itempool) + + def test_excluding_all_items_in_multiparent_excludes_child_items(self) -> None: + world_options = { + 'excluded_items': { + item_names.ZEALOT: 1, + item_names.SENTINEL: 1, + item_names.CENTURION: 1, + }, + 'min_number_of_upgrades': 2, + 'required_tactics': 'standard', + 'selected_races': { + SC2Race.PROTOSS.get_title() + }, + 'mission_order': 'grid', + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertNotIn(item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY, itempool) + self.assertNotIn(item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS, itempool) + diff --git a/worlds/sc2/test/test_itemdescriptions.py b/worlds/sc2/test/test_itemdescriptions.py new file mode 100644 index 00000000..a4fd6d5c --- /dev/null +++ b/worlds/sc2/test/test_itemdescriptions.py @@ -0,0 +1,18 @@ +import unittest + +from ..item import item_descriptions, item_tables + + +class TestItemDescriptions(unittest.TestCase): + def test_all_items_have_description(self) -> None: + for item_name in item_tables.item_table: + self.assertIn(item_name, item_descriptions.item_descriptions) + + def test_all_descriptions_refer_to_item_and_end_in_dot(self) -> None: + for item_name, item_desc in item_descriptions.item_descriptions.items(): + self.assertIn(item_name, item_tables.item_table) + self.assertEqual(item_desc.strip()[-1], '.', msg=f"{item_name}'s item description does not end in a '.': '{item_desc}'") + + def test_item_descriptions_follow_single_space_after_period_style(self) -> None: + for item_name, item_desc in item_descriptions.item_descriptions.items(): + self.assertNotIn('. ', item_desc, f"Double-space after period in description for {item_name}") diff --git a/worlds/sc2/test/test_itemgroups.py b/worlds/sc2/test/test_itemgroups.py new file mode 100644 index 00000000..43848d20 --- /dev/null +++ b/worlds/sc2/test/test_itemgroups.py @@ -0,0 +1,32 @@ +""" +Unit tests for item_groups.py +""" + +import unittest +from ..item import item_groups, item_tables + + +class ItemGroupsUnitTests(unittest.TestCase): + def test_all_production_structure_groups_capture_all_units(self) -> None: + self.assertCountEqual( + item_groups.terran_units, + item_groups.barracks_units + item_groups.factory_units + item_groups.starport_units + item_groups.terran_mercenaries + ) + self.assertCountEqual( + item_groups.protoss_units, + item_groups.gateway_units + item_groups.robo_units + item_groups.stargate_units + ) + + def test_terran_original_progressive_group_fully_contained_in_wol_upgrades(self) -> None: + for item_name in item_groups.terran_original_progressive_upgrades: + self.assertIn(item_tables.item_table[item_name].type, ( + item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2), f"{item_name} is not progressive") + self.assertIn(item_name, item_groups.wol_upgrades) + + def test_all_items_in_stimpack_group_are_stimpacks(self) -> None: + for item_name in item_groups.terran_stimpacks: + self.assertIn("Stimpack", item_name) + + def test_all_item_group_names_have_a_group_defined(self) -> None: + for display_name in item_groups.ItemGroupNames.get_all_group_names(): + self.assertIn(display_name, item_groups.item_name_groups) diff --git a/worlds/sc2/test/test_items.py b/worlds/sc2/test/test_items.py new file mode 100644 index 00000000..049810b9 --- /dev/null +++ b/worlds/sc2/test/test_items.py @@ -0,0 +1,170 @@ +import unittest +from typing import List, Set + +from ..item import item_tables + + +class TestItems(unittest.TestCase): + def test_grouped_upgrades_number(self) -> None: + """ + Tests if grouped upgrades have set number correctly + """ + bundled_items = item_tables.upgrade_bundles.keys() + bundled_item_data = [item_tables.get_full_item_list()[item_name] for item_name in bundled_items] + bundled_item_numbers = [item_data.number for item_data in bundled_item_data] + + check_numbers = [number == -1 for number in bundled_item_numbers] + + self.assertNotIn(False, check_numbers) + + def test_non_grouped_upgrades_number(self) -> None: + """ + Checks if non-grouped upgrades number is set correctly thus can be sent into the game. + """ + check_modulo = 4 + bundled_items = item_tables.upgrade_bundles.keys() + non_bundled_upgrades = [ + item_name for item_name in item_tables.get_full_item_list().keys() + if (item_name not in bundled_items + and item_tables.get_full_item_list()[item_name].type in item_tables.upgrade_item_types) + ] + non_bundled_upgrade_data = [item_tables.get_full_item_list()[item_name] for item_name in non_bundled_upgrades] + non_bundled_upgrade_numbers = [item_data.number for item_data in non_bundled_upgrade_data] + + check_numbers = [number % check_modulo == 0 for number in non_bundled_upgrade_numbers] + + self.assertNotIn(False, check_numbers) + + def test_bundles_contain_only_basic_elements(self) -> None: + """ + Checks if there are no bundles within bundles. + """ + bundled_items = item_tables.upgrade_bundles.keys() + bundle_elements: List[str] = [item_name for values in item_tables.upgrade_bundles.values() for item_name in values] + + for element in bundle_elements: + self.assertNotIn(element, bundled_items) + + def test_weapon_armor_level(self) -> None: + """ + Checks if Weapon/Armor upgrade level is correctly set to all Weapon/Armor upgrade items. + """ + weapon_armor_upgrades = [item for item in item_tables.get_full_item_list() if item_tables.get_item_table()[item].type in item_tables.upgrade_item_types] + + for weapon_armor_upgrade in weapon_armor_upgrades: + self.assertEqual(item_tables.get_full_item_list()[weapon_armor_upgrade].quantity, item_tables.WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + + def test_item_ids_distinct(self) -> None: + """ + Verifies if there are no duplicates of item ID. + """ + item_ids: Set[int] = {item_tables.get_full_item_list()[item_name].code for item_name in item_tables.get_full_item_list()} + + self.assertEqual(len(item_ids), len(item_tables.get_full_item_list())) + + def test_number_distinct_in_item_type(self) -> None: + """ + Tests if each item is distinct for sending into the mod. + """ + item_types: List[item_tables.ItemTypeEnum] = [ + *[item.value for item in item_tables.TerranItemType], + *[item.value for item in item_tables.ZergItemType], + *[item.value for item in item_tables.ProtossItemType], + *[item.value for item in item_tables.FactionlessItemType] + ] + + self.assertGreater(len(item_types), 0) + + for item_type in item_types: + item_names: List[str] = [ + item_name for item_name in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item_name].number >= 0 # Negative numbers have special meaning + and item_tables.get_full_item_list()[item_name].type == item_type + ] + item_numbers: Set[int] = {item_tables.get_full_item_list()[item_name] for item_name in item_names} + + self.assertEqual(len(item_names), len(item_numbers)) + + def test_progressive_has_quantity(self) -> None: + """ + :return: + """ + progressive_groups: List[item_tables.ItemTypeEnum] = [ + item_tables.TerranItemType.Progressive, + item_tables.TerranItemType.Progressive_2, + item_tables.ProtossItemType.Progressive, + item_tables.ZergItemType.Progressive + ] + + quantities: List[int] = [ + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in progressive_groups + ] + + self.assertNotIn(1, quantities) + + def test_non_progressive_quantity(self) -> None: + """ + Check if non-progressive items have quantity at most 1. + """ + non_progressive_single_entity_groups: List[item_tables.ItemTypeEnum] = [ + # Terran + item_tables.TerranItemType.Unit, + item_tables.TerranItemType.Unit_2, + item_tables.TerranItemType.Mercenary, + item_tables.TerranItemType.Armory_1, + item_tables.TerranItemType.Armory_2, + item_tables.TerranItemType.Armory_3, + item_tables.TerranItemType.Armory_4, + item_tables.TerranItemType.Armory_5, + item_tables.TerranItemType.Armory_6, + item_tables.TerranItemType.Armory_7, + item_tables.TerranItemType.Building, + item_tables.TerranItemType.Laboratory, + item_tables.TerranItemType.Nova_Gear, + # Zerg + item_tables.ZergItemType.Unit, + item_tables.ZergItemType.Mercenary, + item_tables.ZergItemType.Morph, + item_tables.ZergItemType.Strain, + item_tables.ZergItemType.Mutation_1, + item_tables.ZergItemType.Mutation_2, + item_tables.ZergItemType.Mutation_3, + item_tables.ZergItemType.Evolution_Pit, + item_tables.ZergItemType.Ability, + # Protoss + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, + item_tables.ProtossItemType.Forge_1, + item_tables.ProtossItemType.Forge_2, + item_tables.ProtossItemType.Forge_3, + item_tables.ProtossItemType.Forge_4, + item_tables.ProtossItemType.Solarite_Core, + item_tables.ProtossItemType.Spear_Of_Adun + ] + + quantities: List[int] = [ + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in non_progressive_single_entity_groups + ] + + for quantity in quantities: + self.assertLessEqual(quantity, 1) + + def test_item_number_less_than_30(self) -> None: + """ + Checks if all item numbers are within bounds supported by game mod. + """ + not_checked_item_types: List[item_tables.ItemTypeEnum] = [ + item_tables.ZergItemType.Level + ] + items_to_check: List[str] = [ + item for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type not in not_checked_item_types + ] + + for item in items_to_check: + item_number = item_tables.get_full_item_list()[item].number + self.assertLess(item_number, 30) + diff --git a/worlds/sc2/test/test_location_groups.py b/worlds/sc2/test/test_location_groups.py new file mode 100644 index 00000000..f429464f --- /dev/null +++ b/worlds/sc2/test/test_location_groups.py @@ -0,0 +1,37 @@ +import unittest +from .. import location_groups +from ..mission_tables import SC2Mission, MissionFlag + + +class TestLocationGroups(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.location_groups = location_groups.get_location_groups() + + def test_location_categories_have_a_group(self) -> None: + self.assertIn('Victory', self.location_groups) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Victory', self.location_groups['Victory']) + self.assertIn(f'{SC2Mission.IN_UTTER_DARKNESS.mission_name}: Defeat', self.location_groups['Victory']) + self.assertIn('Vanilla', self.location_groups) + self.assertIn(f'{SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name}: Close Relic', self.location_groups['Vanilla']) + self.assertIn('Extra', self.location_groups) + self.assertIn(f'{SC2Mission.SMASH_AND_GRAB.mission_name}: First Forcefield Area Busted', self.location_groups['Extra']) + self.assertIn('Challenge', self.location_groups) + self.assertIn(f'{SC2Mission.ZERO_HOUR.mission_name}: First Hatchery', self.location_groups['Challenge']) + self.assertIn('Mastery', self.location_groups) + self.assertIn(f'{SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name}: Protoss Cleared', self.location_groups['Mastery']) + + def test_missions_have_a_group(self) -> None: + self.assertIn(SC2Mission.LIBERATION_DAY.mission_name, self.location_groups) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Victory', self.location_groups[SC2Mission.LIBERATION_DAY.mission_name]) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Special Delivery', self.location_groups[SC2Mission.LIBERATION_DAY.mission_name]) + + def test_race_swapped_locations_share_a_group(self) -> None: + self.assertIn(MissionFlag.HasRaceSwap, SC2Mission.ZERO_HOUR.flags) + ZERO_HOUR = 'Zero Hour' + self.assertNotEqual(ZERO_HOUR, SC2Mission.ZERO_HOUR.mission_name) + self.assertIn(ZERO_HOUR, self.location_groups) + self.assertIn(f'{ZERO_HOUR}: Victory', self.location_groups) + self.assertIn(f'{SC2Mission.ZERO_HOUR.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) + self.assertIn(f'{SC2Mission.ZERO_HOUR_P.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) + self.assertIn(f'{SC2Mission.ZERO_HOUR_Z.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) diff --git a/worlds/sc2/test/test_mission_groups.py b/worlds/sc2/test/test_mission_groups.py new file mode 100644 index 00000000..6db7325d --- /dev/null +++ b/worlds/sc2/test/test_mission_groups.py @@ -0,0 +1,9 @@ +import unittest +from .. import mission_groups + + +class TestMissionGroups(unittest.TestCase): + def test_all_mission_groups_are_defined_and_nonempty(self) -> None: + for mission_group_name in mission_groups.MissionGroupNames.get_all_group_names(): + self.assertIn(mission_group_name, mission_groups.mission_groups) + self.assertTrue(mission_groups.mission_groups[mission_group_name]) diff --git a/worlds/sc2/test/test_options.py b/worlds/sc2/test/test_options.py index 30d21f39..69b834da 100644 --- a/worlds/sc2/test/test_options.py +++ b/worlds/sc2/test/test_options.py @@ -1,7 +1,19 @@ import unittest -from .test_base import Sc2TestBase -from .. import Options, MissionTables +from typing import Dict + +from .. import options +from ..item import item_parents + class TestOptions(unittest.TestCase): - def test_campaign_size_option_max_matches_number_of_missions(self): - self.assertEqual(Options.MaximumCampaignSize.range_end, len(MissionTables.SC2Mission)) + + def test_unit_max_upgrades_matching_items(self) -> None: + upgrade_group_to_count: Dict[str, int] = {} + for parent_id, child_list in item_parents.parent_id_to_children.items(): + main_parent = item_parents.parent_present[parent_id].constraint_group + if main_parent is None: + continue + upgrade_group_to_count.setdefault(main_parent, 0) + upgrade_group_to_count[main_parent] += len(child_list) + + self.assertEqual(options.MAX_UPGRADES_OPTION, max(upgrade_group_to_count.values())) diff --git a/worlds/sc2/test/test_regions.py b/worlds/sc2/test/test_regions.py new file mode 100644 index 00000000..880a02f9 --- /dev/null +++ b/worlds/sc2/test/test_regions.py @@ -0,0 +1,40 @@ +import unittest +from .test_base import Sc2TestBase +from .. import mission_tables, SC2Campaign +from .. import options +from ..mission_order.layout_types import Grid + +class TestGridsizes(unittest.TestCase): + def test_grid_sizes_meet_specs(self): + self.assertTupleEqual((1, 2, 0), Grid.get_grid_dimensions(2)) + self.assertTupleEqual((1, 3, 0), Grid.get_grid_dimensions(3)) + self.assertTupleEqual((2, 2, 0), Grid.get_grid_dimensions(4)) + self.assertTupleEqual((2, 3, 1), Grid.get_grid_dimensions(5)) + self.assertTupleEqual((2, 4, 1), Grid.get_grid_dimensions(7)) + self.assertTupleEqual((2, 4, 0), Grid.get_grid_dimensions(8)) + self.assertTupleEqual((3, 3, 0), Grid.get_grid_dimensions(9)) + self.assertTupleEqual((2, 5, 0), Grid.get_grid_dimensions(10)) + self.assertTupleEqual((3, 4, 1), Grid.get_grid_dimensions(11)) + self.assertTupleEqual((3, 4, 0), Grid.get_grid_dimensions(12)) + self.assertTupleEqual((3, 5, 0), Grid.get_grid_dimensions(15)) + self.assertTupleEqual((4, 4, 0), Grid.get_grid_dimensions(16)) + self.assertTupleEqual((4, 6, 0), Grid.get_grid_dimensions(24)) + self.assertTupleEqual((5, 5, 0), Grid.get_grid_dimensions(25)) + self.assertTupleEqual((5, 6, 1), Grid.get_grid_dimensions(29)) + self.assertTupleEqual((5, 7, 2), Grid.get_grid_dimensions(33)) + + +class TestGridGeneration(Sc2TestBase): + options = { + "mission_order": options.MissionOrder.option_grid, + "excluded_missions": [mission_tables.SC2Mission.ZERO_HOUR.mission_name,], + "enabled_campaigns": { + SC2Campaign.WOL.campaign_name, + SC2Campaign.PROPHECY.campaign_name, + } + } + + def test_size_matches_exclusions(self): + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR.mission_name, self.multiworld.regions) + # WoL has 29 missions. -1 for Zero Hour being excluded, +1 for the automatically-added menu location + self.assertEqual(len(self.multiworld.regions), 29) diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py new file mode 100644 index 00000000..d43a4d4e --- /dev/null +++ b/worlds/sc2/test/test_rules.py @@ -0,0 +1,186 @@ +import itertools +from dataclasses import fields +from random import Random +import unittest +from typing import List, Set, Iterable + +from BaseClasses import ItemClassification, MultiWorld +import Options as CoreOptions +from .. import options, locations +from ..item import item_tables +from ..rules import SC2Logic +from ..mission_tables import SC2Race, MissionFlag, lookup_name_to_mission + + +class TestInventory: + """ + Runs checks against inventory with validation if all target items are progression and returns a random result + """ + def __init__(self) -> None: + self.random: Random = Random() + self.progression_types: Set[ItemClassification] = {ItemClassification.progression, ItemClassification.progression_skip_balancing} + + def is_item_progression(self, item: str) -> bool: + return item_tables.item_table[item].classification in self.progression_types + + def random_boolean(self): + return self.random.choice([True, False]) + + def has(self, item: str, player: int, count: int = 1): + if not self.is_item_progression(item): + raise AssertionError("Logic item {} is not a progression item".format(item)) + return self.random_boolean() + + def has_any(self, items: Set[str], player: int): + non_progression_items = [item for item in items if not self.is_item_progression(item)] + if len(non_progression_items) > 0: + raise AssertionError("Logic items {} are not progression items".format(non_progression_items)) + return self.random_boolean() + + def has_all(self, items: Set[str], player: int): + return self.has_any(items, player) + + def has_group(self, item_group: str, player: int, count: int = 1): + return self.random_boolean() + + def count_group(self, item_name_group: str, player: int) -> int: + return self.random.randrange(0, 20) + + def count(self, item: str, player: int) -> int: + if not self.is_item_progression(item): + raise AssertionError("Item {} is not a progression item".format(item)) + random_value: int = self.random.randrange(0, 5) + if random_value == 4: # 0-3 has a higher chance due to logic rules + return self.random.randrange(4, 100) + else: + return random_value + + def count_from_list(self, items: Iterable[str], player: int) -> int: + return sum(self.count(item_name, player) for item_name in items) + + def count_from_list_unique(self, items: Iterable[str], player: int) -> int: + return sum(self.count(item_name, player) for item_name in items) + + +class TestWorld: + """ + Mock world to simulate different player options for logic rules + """ + def __init__(self) -> None: + defaults = dict() + for field in fields(options.Starcraft2Options): + field_class = field.type + option_name = field.name + if isinstance(field_class, str): + if field_class in globals(): + field_class = globals()[field_class] + else: + field_class = CoreOptions.__dict__[field.type] + defaults[option_name] = field_class(options.get_option_value(None, option_name)) + self.options: options.Starcraft2Options = options.Starcraft2Options(**defaults) + + self.options.mission_order.value = options.MissionOrder.option_vanilla_shuffled + + self.player = 1 + self.multiworld = MultiWorld(1) + + +class TestRules(unittest.TestCase): + def setUp(self) -> None: + self.required_tactics_values: List[int] = [ + options.RequiredTactics.option_standard, options.RequiredTactics.option_advanced + ] + self.all_in_map_values: List[int] = [ + options.AllInMap.option_ground, options.AllInMap.option_air + ] + self.take_over_ai_allies_values: List[int] = [ + options.TakeOverAIAllies.option_true, options.TakeOverAIAllies.option_false + ] + self.kerrigan_presence_values: List[int] = [ + options.KerriganPresence.option_vanilla, options.KerriganPresence.option_not_present + ] + self.NUM_TEST_RUNS = 100 + + @staticmethod + def _get_world( + required_tactics: int = options.RequiredTactics.default, + all_in_map: int = options.AllInMap.default, + take_over_ai_allies: int = options.TakeOverAIAllies.default, + kerrigan_presence: int = options.KerriganPresence.default, + # setting this to everywhere catches one extra logic check for Amon's Fall without missing any + spear_of_adun_passive_presence: int = options.SpearOfAdunPassiveAbilityPresence.option_everywhere, + ) -> TestWorld: + test_world = TestWorld() + test_world.options.required_tactics.value = required_tactics + test_world.options.all_in_map.value = all_in_map + test_world.options.take_over_ai_allies.value = take_over_ai_allies + test_world.options.kerrigan_presence.value = kerrigan_presence + test_world.options.spear_of_adun_passive_ability_presence.value = spear_of_adun_passive_presence + test_world.logic = SC2Logic(test_world) # type: ignore + return test_world + + def test_items_in_rules_are_progression(self): + test_inventory = TestInventory() + for option in self.required_tactics_values: + test_world = self._get_world(required_tactics=option) + location_data = locations.get_locations(test_world) + for location in location_data: + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_all_in_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.all_in_map_values): + test_world = self._get_world(required_tactics=test_options[0], all_in_map=test_options[1]) + for location in locations.get_locations(test_world): + if 'All-In' not in location.region: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_kerriganless_missions_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.kerrigan_presence_values): + test_world = self._get_world(required_tactics=test_options[0], kerrigan_presence=test_options[1]) + for location in locations.get_locations(test_world): + mission = lookup_name_to_mission[location.region] + if MissionFlag.Kerrigan not in mission.flags: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_ai_takeover_missions_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.take_over_ai_allies_values): + test_world = self._get_world(required_tactics=test_options[0], take_over_ai_allies=test_options[1]) + for location in locations.get_locations(test_world): + mission = lookup_name_to_mission[location.region] + if MissionFlag.AiAlly not in mission.flags: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_hard_rules_are_progression(self): + test_inventory = TestInventory() + test_world = TestWorld() + test_world.options.required_tactics.value = options.RequiredTactics.option_any_units + test_world.logic = SC2Logic(test_world) + location_data = locations.get_locations(test_world) + for location in location_data: + if location.hard_rule is not None: + for _ in range(10): + location.hard_rule(test_inventory) + + def test_items_in_any_units_rules_are_progression(self): + test_inventory = TestInventory() + test_world = TestWorld() + test_world.options.required_tactics.value = options.RequiredTactics.option_any_units + logic = SC2Logic(test_world) + test_world.logic = logic + for race in (SC2Race.TERRAN, SC2Race.PROTOSS, SC2Race.ZERG): + for target in range(1, 5): + rule = logic.has_race_units(target, race) + for _ in range(10): + rule(test_inventory) + + diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py new file mode 100644 index 00000000..a87d1766 --- /dev/null +++ b/worlds/sc2/test/test_usecases.py @@ -0,0 +1,492 @@ +""" +Unit tests for yaml usecases we want to support +""" + +from .test_base import Sc2SetupTestBase +from .. import get_all_missions, mission_tables, options +from ..item import item_groups, item_tables, item_names +from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag +from ..options import EnabledCampaigns, MasteryLocations + + +class TestSupportedUseCases(Sc2SetupTestBase): + def test_vanilla_all_campaigns_generates(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_vanilla, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions if region.name != "Menu"] + + self.assertEqual(len(world_regions), 83, "Unexpected number of missions for vanilla mission order") + + def test_terran_with_nco_units_only_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_UNITS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.NCO_UNITS: 0, + }, + 'max_number_of_upgrades': 2, + } + + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertIn(item_names.MARINE, world_item_names) + self.assertIn(item_names.RAVEN, world_item_names) + self.assertIn(item_names.LIBERATOR, world_item_names) + self.assertIn(item_names.BATTLECRUISER, world_item_names) + self.assertNotIn(item_names.DIAMONDBACK, world_item_names) + self.assertNotIn(item_names.DIAMONDBACK_BURST_CAPACITORS, world_item_names) + self.assertNotIn(item_names.VIKING, world_item_names) + + def test_nco_with_nobuilds_excluded_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.NCO.campaign_name + }, + 'shuffle_no_build': options.ShuffleNoBuild.option_false, + 'mission_order': options.MissionOrder.option_mini_campaign, + } + + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + missions = get_all_missions(self.world.custom_mission_order) + + self.assertNotIn(mission_tables.SC2Mission.THE_ESCAPE, missions) + self.assertNotIn(mission_tables.SC2Mission.IN_THE_ENEMY_S_SHADOW, missions) + for mission in missions: + self.assertEqual(mission_tables.SC2Campaign.NCO, mission.campaign) + + def test_terran_with_nco_upgrades_units_only_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'mission_order': options.MissionOrder.option_vanilla_shuffled, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_ITEMS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.NCO_MAX_PROGRESSIVE_ITEMS: 0, + item_groups.ItemGroupNames.NCO_MIN_PROGRESSIVE_ITEMS: 1, + }, + 'excluded_missions': [ + # These missions have trouble fulfilling Terran Power Rating under these terms + SC2Mission.SUPERNOVA.mission_name, + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + ], + 'mastery_locations': MasteryLocations.option_disabled, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool + self.multiworld.precollected_items[1]] + self.assertTrue(world_item_names) + missions = get_all_missions(self.world.custom_mission_order) + + for mission in missions: + self.assertIn(mission_tables.MissionFlag.Terran, mission.flags) + self.assertIn(item_names.MARINE, world_item_names) + self.assertIn(item_names.MARAUDER, world_item_names) + self.assertIn(item_names.BUNKER, world_item_names) + self.assertIn(item_names.BANSHEE, world_item_names) + self.assertIn(item_names.BATTLECRUISER_ATX_LASER_BATTERY, world_item_names) + self.assertIn(item_names.NOVA_C20A_CANISTER_RIFLE, world_item_names) + self.assertGreaterEqual(world_item_names.count(item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS), 2) + self.assertGreaterEqual(world_item_names.count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON), 3) + self.assertNotIn(item_names.MEDIC, world_item_names) + self.assertNotIn(item_names.PSI_DISRUPTER, world_item_names) + self.assertNotIn(item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, world_item_names) + self.assertNotIn(item_names.HELLION_INFERNAL_PLATING, world_item_names) + self.assertNotIn(item_names.CELLULAR_REACTOR, world_item_names) + self.assertNotIn(item_names.TECH_REACTOR, world_item_names) + + def test_nco_and_2_wol_missions_only_can_generate_with_vanilla_items_only(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission.campaign == mission_tables.SC2Campaign.WOL + and mission.mission_name not in (mission_tables.SC2Mission.LIBERATION_DAY.mission_name, mission_tables.SC2Mission.THE_OUTLAWS.mission_name) + ], + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'vanilla_items_only': True, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertTrue(item_names) + self.assertNotIn(item_names.LIBERATOR, world_item_names) + self.assertNotIn(item_names.MARAUDER_PROGRESSIVE_STIMPACK, world_item_names) + self.assertNotIn(item_names.HELLION_HELLBAT, world_item_names) + self.assertNotIn(item_names.BATTLECRUISER_CLOAK, world_item_names) + + def test_free_protoss_only_generates(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.PROLOGUE.campaign_name + }, + # todo(mm): Currently, these settings don't generate on grid because there are not enough EASY missions + 'mission_order': options.MissionOrder.option_vanilla_shuffled, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + self.assertTrue(world_item_names) + missions = get_all_missions(self.world.custom_mission_order) + + self.assertEqual(len(missions), 7, "Wrong number of missions in free protoss seed") + for mission in missions: + self.assertIn(mission.campaign, (mission_tables.SC2Campaign.PROLOGUE, mission_tables.SC2Campaign.PROPHECY)) + for item_name in world_item_names: + self.assertIn(item_tables.item_table[item_name].race, (mission_tables.SC2Race.ANY, mission_tables.SC2Race.PROTOSS)) + + def test_resource_filler_items_may_be_put_in_start_inventory(self) -> None: + NUM_RESOURCE_ITEMS = 10 + world_options = { + 'start_inventory': { + item_names.STARTING_MINERALS: NUM_RESOURCE_ITEMS, + item_names.STARTING_VESPENE: NUM_RESOURCE_ITEMS, + item_names.STARTING_SUPPLY: NUM_RESOURCE_ITEMS, + }, + } + + self.generate_world(world_options) + start_item_names = [item.name for item in self.multiworld.precollected_items[self.player]] + + self.assertEqual(start_item_names.count(item_names.STARTING_MINERALS), NUM_RESOURCE_ITEMS, "Wrong number of starting minerals in starting inventory") + self.assertEqual(start_item_names.count(item_names.STARTING_VESPENE), NUM_RESOURCE_ITEMS, "Wrong number of starting vespene in starting inventory") + self.assertEqual(start_item_names.count(item_names.STARTING_SUPPLY), NUM_RESOURCE_ITEMS, "Wrong number of starting supply in starting inventory") + + def test_excluding_protoss_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + }, + 'enabled_campaigns': options.EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.PROTOSS, f"{item_name} is a PROTOSS item!") + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + (mission_tables.SC2Campaign.LOTV, mission_tables.SC2Campaign.PROPHECY, mission_tables.SC2Campaign.PROLOGUE), + f"{region} is a PROTOSS mission!") + + def test_excluding_terran_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.ZERG.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.TERRAN, + f"{item_name} is a TERRAN item!") + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + (mission_tables.SC2Campaign.WOL, mission_tables.SC2Campaign.NCO), + f"{region} is a TERRAN mission!") + + def test_excluding_zerg_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [ + SC2Mission.THE_INFINITE_CYCLE.mission_name + ] + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.ZERG, + f"{item_name} is a ZERG item!") + # have to manually exclude the only non-zerg HotS mission... + for region in filter(lambda region: region != "With Friends Like These", world_regions): + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + ([mission_tables.SC2Campaign.HOTS]), + f"{region} is a ZERG mission!") + + def test_excluding_faction_on_vanilla_order_excludes_epilogue(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_vanilla, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + ([mission_tables.SC2Campaign.EPILOGUE]), + f"{region} is an epilogue mission!") + + def test_race_swap_pick_one_has_correct_length_and_includes_swaps(self) -> None: + world_options = { + 'selected_races': options.SelectRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_pick_one, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [mission_tables.SC2Mission.ZERO_HOUR.mission_name], + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + NUM_WOL_MISSIONS = len([mission for mission in SC2Mission if mission.campaign == SC2Campaign.WOL and MissionFlag.RaceSwap not in mission.flags]) + races = set(mission_tables.lookup_name_to_mission[mission].race for mission in world_regions) + + self.assertEqual(len(world_regions), NUM_WOL_MISSIONS) + self.assertTrue(SC2Race.ZERG in races or SC2Race.PROTOSS in races) + + def test_start_inventory_upgrade_level_includes_only_correct_bundle(self) -> None: + world_options = { + 'start_inventory': { + item_groups.ItemGroupNames.TERRAN_GENERIC_UPGRADES: 1, + }, + 'locked_items': { + # One unit of each class to guarantee upgrades are available + item_names.MARINE: 1, + item_names.VULTURE: 1, + item_names.BANSHEE: 1, + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_unit_class, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_disabled, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_item_names = [item.name for item in self.multiworld.itempool] + start_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + + # Start inventory + self.assertIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, start_inventory) + self.assertIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, start_inventory) + self.assertIn(item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, start_inventory) + + # Additional items in pool -- standard tactics will require additional levels + self.assertIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, world_item_names) + self.assertIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, world_item_names) + self.assertIn(item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, world_item_names) + + def test_kerrigan_max_active_abilities(self): + target_number: int = 8 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'kerrigan_max_active_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + kerrigan_actives = [item_name for item_name in world_item_names if item_name in item_groups.kerrigan_active_abilities] + + self.assertLessEqual(len(kerrigan_actives), target_number) + + def test_kerrigan_max_passive_abilities(self): + target_number: int = 3 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'kerrigan_max_passive_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + kerrigan_passives = [item_name for item_name in world_item_names if item_name in item_groups.kerrigan_passives] + + self.assertLessEqual(len(kerrigan_passives), target_number) + + def test_spear_of_adun_max_active_abilities(self): + target_number: int = 8 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.PROTOSS.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'spear_of_adun_max_active_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + spear_of_adun_actives = [item_name for item_name in world_item_names if item_name in item_tables.spear_of_adun_calldowns] + + self.assertLessEqual(len(spear_of_adun_actives), target_number) + + + def test_spear_of_adun_max_autocasts(self): + target_number: int = 2 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.PROTOSS.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'spear_of_adun_max_passive_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + spear_of_adun_autocasts = [item_name for item_name in world_item_names if item_name in item_tables.spear_of_adun_castable_passives] + + self.assertLessEqual(len(spear_of_adun_autocasts), target_number) + + + def test_nova_max_weapons(self): + target_number: int = 3 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'nova_max_weapons': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + nova_weapons = [item_name for item_name in world_item_names if item_name in item_groups.nova_weapons] + + self.assertLessEqual(len(nova_weapons), target_number) + + + def test_nova_max_gadgets(self): + target_number: int = 3 + world_options = { + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'nova_max_gadgets': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + nova_gadgets = [item_name for item_name in world_item_names if item_name in item_groups.nova_gadgets] + + self.assertLessEqual(len(nova_gadgets), target_number) + + def test_mercs_only(self) -> None: + world_options = { + 'selected_races': [ + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + ], + 'required_tactics': options.RequiredTactics.option_any_units, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_UNITS: 0, + item_groups.ItemGroupNames.ZERG_UNITS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.TERRAN_MERCENARIES: 0, + item_groups.ItemGroupNames.ZERG_MERCENARIES: 0, + }, + 'start_inventory': { + item_names.PROGRESSIVE_FAST_DELIVERY: 1, + item_names.ROGUE_FORCES: 1, + item_names.UNRESTRICTED_MUTATION: 1, + item_names.EVOLUTIONARY_LEAP: 1, + }, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [ + SC2Mission.ENEMY_WITHIN.mission_name, # Requires a unit for Niadra to build + ], + } + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + terran_nonmerc_units = tuple( + item_name + for item_name in world_item_names + if item_name in item_groups.terran_units and item_name not in item_groups.terran_mercenaries + ) + zerg_nonmerc_units = tuple( + item_name + for item_name in world_item_names + if item_name in item_groups.zerg_units and item_name not in item_groups.zerg_mercenaries + ) + + self.assertTupleEqual(terran_nonmerc_units, ()) + self.assertTupleEqual(zerg_nonmerc_units, ()) diff --git a/worlds/sc2/transfer_data.py b/worlds/sc2/transfer_data.py new file mode 100644 index 00000000..0718c350 --- /dev/null +++ b/worlds/sc2/transfer_data.py @@ -0,0 +1,38 @@ +from typing import Dict, List + +""" +This file is for handling SC2 data read via the bot +""" + +normalized_unit_types: Dict[str, str] = { + # Thor morphs + "AP_ThorAP": "AP_Thor", + "AP_MercThorAP": "AP_MercThor", + "AP_ThorMengskSieged": "AP_ThorMengsk", + "AP_ThorMengskAP": "AP_ThorMengsk", + # Siege Tank morphs + "AP_SiegeTankSiegedTransportable": "AP_SiegeTank", + "AP_SiegeTankMengskSiegedTransportable": "AP_SiegeTankMengsk", + "AP_SiegeBreakerSiegedTransportable": "AP_SiegeBreaker", + "AP_InfestedSiegeBreakerSiegedTransportable": "AP_InfestedSiegeBreaker", + "AP_StukovInfestedSiegeTank": "AP_StukovInfestedSiegeTankUprooted", + # Cargo size upgrades + "AP_FirebatOptimizedLogistics": "AP_Firebat", + "AP_DevilDogOptimizedLogistics": "AP_DevilDog", + "AP_GhostResourceEfficiency": "AP_Ghost", + "AP_GhostMengskResourceEfficiency": "AP_GhostMengsk", + "AP_SpectreResourceEfficiency": "AP_Spectre", + "AP_UltraliskResourceEfficiency": "AP_Ultralisk", + "AP_MercUltraliskResourceEfficiency": "AP_MercUltralisk", + "AP_ReaperResourceEfficiency": "AP_Reaper", + "AP_MercReaperResourceEfficiency": "AP_MercReaper", +} + +worker_units: List[str] = [ + "AP_SCV", + "AP_MULE", # Mules can't currently build (or be traded due to timed life), this is future proofing just in case + "AP_Drone", + "AP_SISCV", # Infested SCV + "AP_Probe", + "AP_ElderProbe", +] From a9f594d6b260a9f5b1b4ee0835933442069e0687 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Tue, 2 Sep 2025 23:50:29 +0200 Subject: [PATCH 038/204] SC2: Remove Starcraft2Client.py as Launcher.py got upgraded to work under Python 3.13 (#5406) --- Starcraft2Client.py | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 Starcraft2Client.py diff --git a/Starcraft2Client.py b/Starcraft2Client.py deleted file mode 100644 index 14e18320..00000000 --- a/Starcraft2Client.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import annotations - -import ModuleUpdate -ModuleUpdate.update() - -from worlds.sc2.client import launch -import Utils - -# This is deprecated, replaced with the client hooked from the Launcher -# Will be removed in a following release -if __name__ == "__main__": - Utils.init_logging("Starcraft2Client", exception_logger="Client") - launch() From 7a1311984f6110ff010703f82cc7f3639a85369e Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 3 Sep 2025 14:00:36 -0500 Subject: [PATCH 039/204] Docs: Update max py version to 3.13 #5410 --- docs/running from source.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/running from source.md b/docs/running from source.md index 36bff8c8..efe6e243 100644 --- a/docs/running from source.md +++ b/docs/running from source.md @@ -10,7 +10,7 @@ What you'll need: * [Python 3.11.9 or newer](https://www.python.org/downloads/), not the Windows Store version * On Windows, please consider only using the latest supported version in production environments since security updates for older versions are not easily available. - * Python 3.12.x is currently the newest supported version + * Python 3.13.x is currently the newest supported version * pip: included in downloads from python.org, separate in many Linux distributions * Matching C compiler * possibly optional, read operating system specific sections From 8f88152532bba4e6e2dc620bb4a324037eff2feb Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 3 Sep 2025 14:01:56 -0500 Subject: [PATCH 040/204] MultiServer: Validate CreateHints status arg #5408 --- MultiServer.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/MultiServer.py b/MultiServer.py index 11a9e394..2b58b340 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1961,6 +1961,16 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): if not locations: await ctx.send_msgs(client, [{"cmd": "InvalidPacket", "type": "arguments", "text": "CreateHints: No locations specified.", "original_cmd": cmd}]) + return + + try: + status = HintStatus(status) + except ValueError as err: + await ctx.send_msgs(client, + [{"cmd": "InvalidPacket", "type": "arguments", + "text": f"Unknown Status: {err}", + "original_cmd": cmd}]) + return hints = [] From 3c28db0800ba2b09d806d57841bb5dd122766a1f Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Wed, 3 Sep 2025 15:02:32 -0400 Subject: [PATCH 041/204] LADX: Drop a marin text option that makes patching fail #5398 --- worlds/ladx/LADXR/patches/marin.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/ladx/LADXR/patches/marin.txt b/worlds/ladx/LADXR/patches/marin.txt index 782f4129..e287833a 100644 --- a/worlds/ladx/LADXR/patches/marin.txt +++ b/worlds/ladx/LADXR/patches/marin.txt @@ -424,7 +424,6 @@ Oh, look at that. Link's Awakened.\nYou did it, you beat the game. Excellent armaments, #####. Please return - \nCOVERED IN BLOOD -\n...safe and sound. Pray return to the Link's Awakening Sands. This Marin dialogue was inspired by The Witness's audiologs. -You're awake!\n....\nYou were warned.\nI'm now going to say every word beginning with Z!\nZA\nZABAGLIONE\nZABAGLIONES\nZABAIONE\nZABAIONES\nZABAJONE\nZABAJONES\nZABETA\nZABETAS\nZABRA\nZABRAS\nZABTIEH\nZABTIEHS\nZACATON\nZACATONS\nZACK\nZACKS\nZADDICK\nZADDIK\nZADDIKIM\nZADDIKS\nZAFFAR\nzAFFARS\nZAFFER\nZAFFERS\nZAFFIR\n....\n....\n....\nI'll let you off easy.\nThis time. Leave me alone, I'm Marinating. praise be to the tungsten cube If you play multiple seeds in a row, you can pretend that each run is the dream you awaken from in the next. From e342a20fde278f58c0655a976c86fdd7433a9717 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Wed, 3 Sep 2025 21:50:59 -0400 Subject: [PATCH 042/204] Celeste (Open World): Post-merge Logic Fix (#5415) * APWorld Skeleton * Hair Color Rando and first items * All interactable items * Checkpoint Items and Locations * First pass sample intermediate data * Bulk of Region/location code * JSON Data Parser * New items and Level Item mapping * Data Parsing fixes and most of 1a data * 1a complete data and region/location/item creation fixes * Add Key Location type and ID output * Add options to slot data * 1B Level Data * Added Location logging * Add Goal Area Options * 1c Level Data * Old Site A B C level data * Key/Binosanity and Hair Length options * Key Item/Location and Clutter Event handling * Remove generic 'keys' item * 3a level data * 3b and 3c level data * Chapter 4 level data * Chapter 5 Logic Data * Chapter 5 level data * Trap Support * Add TrapLink Support * Chapter 6 A/B/C Level Data * Add active_levels to slot_data * Item and Location Name Groups + style cleanups * Chapter 7 Level Data and Items, Gemsanity option * Goal Area and victory handling * Fix slot_data * Add Core Level Data * Carsanity * Farewell Level Data and ID Range Update * Farewell level data and handling * Music Shuffle * Require Cassettes * Change default trap expiration action to Deaths * Handle Poetry * Mod versioning * Rename folder, general cleanup * Additional Cleanup * Handle Farewell Golden Goal when Include Goldens is off * Better handling of Farewell Golden * Update Docs * Beta test bug fixes * Bump to v1.0.0 * Update Changelog * Several Logic tweaks * Update APWorld Version * Add Celeste (Open World) to README * Peer review changes * Logic Fixes: * Adjust Mirror Temple B Key logic * Increment APWorld version * Fix several logic bugs * Add missing link * Add Item Name Groups for common alternative item names * Account for Madeline's post-Celeste hair-dying activities * Account for ignored member variable and hardcoded color in Celeste codebase * Add Blue Clouds to the logic of reaching Farewell - intro-02-launch * Type checking workaround * Bump version number * Adjust Setup Guide * Minor typing fixes * Logic and PR fixes * Increment APWorld Version * Use more world helpers * Core review * CODEOWNERS * Minor logic fix and insert APWorld version into spoiler * Fix merge error --- worlds/celeste_open_world/__init__.py | 12 +++++++++++- worlds/celeste_open_world/data/CelesteLevelData.json | 8 ++++---- worlds/celeste_open_world/data/CelesteLevelData.py | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/worlds/celeste_open_world/__init__.py b/worlds/celeste_open_world/__init__.py index 38c3778e..c0661b55 100644 --- a/worlds/celeste_open_world/__init__.py +++ b/worlds/celeste_open_world/__init__.py @@ -1,5 +1,6 @@ from copy import deepcopy import math +from typing import TextIO from BaseClasses import ItemClassification, Location, MultiWorld, Region, Tutorial from Utils import visualize_regions @@ -41,6 +42,8 @@ class CelesteOpenWorld(World): options_dataclass = CelesteOptions options: CelesteOptions + apworld_version = 10005 + level_data: dict[str, Level] = load_logic_data() location_name_to_id: dict[str, int] = location_data_table @@ -251,7 +254,7 @@ class CelesteOpenWorld(World): def fill_slot_data(self): return { - "apworld_version": 10004, + "apworld_version": self.apworld_version, "min_mod_version": 10000, "death_link": self.options.death_link.value, @@ -292,6 +295,13 @@ class CelesteOpenWorld(World): "chosen_poem": self.random.randint(0, 119), } + @classmethod + def stage_write_spoiler_header(cls, multiworld: MultiWorld, spoiler_handle: TextIO): + major: int = cls.apworld_version // 10000 + minor: int = (cls.apworld_version % 10000) // 100 + bugfix: int = (cls.apworld_version % 100) + spoiler_handle.write(f"\nCeleste (Open World) APWorld v{major}.{minor}.{bugfix}\n") + def output_active_traps(self) -> dict[int, int]: trap_data = {} diff --git a/worlds/celeste_open_world/data/CelesteLevelData.json b/worlds/celeste_open_world/data/CelesteLevelData.json index 5b4edd9b..9d636960 100644 --- a/worlds/celeste_open_world/data/CelesteLevelData.json +++ b/worlds/celeste_open_world/data/CelesteLevelData.json @@ -37055,6 +37055,10 @@ { "dest": "north-west", "rule": [ [ "double_dash_refills", "springs", "dash_switches" ] ] + }, + { + "dest": "south-east-door", + "rule": [] } ] }, @@ -37082,10 +37086,6 @@ "dest": "north-east-door", "rule": [] }, - { - "dest": "south-east-door", - "rule": [] - }, { "dest": "south-west-door", "rule": [] diff --git a/worlds/celeste_open_world/data/CelesteLevelData.py b/worlds/celeste_open_world/data/CelesteLevelData.py index f4c492dd..6ba43fc3 100644 --- a/worlds/celeste_open_world/data/CelesteLevelData.py +++ b/worlds/celeste_open_world/data/CelesteLevelData.py @@ -4771,11 +4771,11 @@ all_region_connections: dict[str, RegionConnection] = { "10a_d-00_north---10a_d-00_south": RegionConnection("10a_d-00_north", "10a_d-00_south", [["Farewell - Power Source Key 5", ], ]), "10a_d-00_south-east---10a_d-00_south": RegionConnection("10a_d-00_south-east", "10a_d-00_south", [[ItemName.double_dash_refills, ItemName.dash_switches, ], ]), "10a_d-00_south-east---10a_d-00_north-west": RegionConnection("10a_d-00_south-east", "10a_d-00_north-west", [[ItemName.double_dash_refills, ItemName.springs, ItemName.dash_switches, ], ]), + "10a_d-00_south-east---10a_d-00_south-east-door": RegionConnection("10a_d-00_south-east", "10a_d-00_south-east-door", []), "10a_d-00_north-west---10a_d-00_south": RegionConnection("10a_d-00_north-west", "10a_d-00_south", [[ItemName.jellyfish, ItemName.dash_switches, ], ]), "10a_d-00_north-west---10a_d-00_breaker": RegionConnection("10a_d-00_north-west", "10a_d-00_breaker", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ItemName.breaker_boxes, ], ]), "10a_d-00_breaker---10a_d-00_south": RegionConnection("10a_d-00_breaker", "10a_d-00_south", []), "10a_d-00_breaker---10a_d-00_north-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-east-door", []), - "10a_d-00_breaker---10a_d-00_south-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-east-door", []), "10a_d-00_breaker---10a_d-00_south-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-west-door", []), "10a_d-00_breaker---10a_d-00_west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_west-door", []), "10a_d-00_breaker---10a_d-00_north-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-west-door", []), From 03992c43d981a3ec5d276a586f76d87766f2e328 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 4 Sep 2025 09:58:24 -0500 Subject: [PATCH 043/204] Docs: update mac install instructions to reflect 3.13 support (#5411) --- worlds/generic/docs/mac_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/generic/docs/mac_en.md b/worlds/generic/docs/mac_en.md index 72f7d1a8..b06593f5 100644 --- a/worlds/generic/docs/mac_en.md +++ b/worlds/generic/docs/mac_en.md @@ -3,7 +3,7 @@ Archipelago does not have a compiled release on macOS. However, it is possible t ## Prerequisite Software Here is a list of software to install and source code to download. 1. Python 3.11 "universal2" or newer from the [macOS Python downloads page](https://www.python.org/downloads/macos/). - **Python 3.13 is not supported yet.** + **Python 3.14 is not supported yet.** 2. Xcode from the [macOS App Store](https://apps.apple.com/us/app/xcode/id497799835). 3. The source code from the [Archipelago releases page](https://github.com/ArchipelagoMW/Archipelago/releases). 4. The asset with darwin in the name from the [SNI Github releases page](https://github.com/alttpo/sni/releases). From 42ace29db46f0fed3e2557ea77e84954d28c6042 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:53:55 -0400 Subject: [PATCH 044/204] Celeste 64: Logic Fixes #5417 --- worlds/celeste64/Locations.py | 2 +- worlds/celeste64/Rules.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/celeste64/Locations.py b/worlds/celeste64/Locations.py index 9e202eca..ed4521ec 100644 --- a/worlds/celeste64/Locations.py +++ b/worlds/celeste64/Locations.py @@ -27,7 +27,7 @@ strawberry_location_data_table: Dict[str, Celeste64LocationData] = { LocationName.strawberry_8: Celeste64LocationData(RegionName.nw_girders_island, celeste_64_base_id + 0x07), LocationName.strawberry_9: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x08), LocationName.strawberry_10: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x09), - LocationName.strawberry_11: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x0A), + LocationName.strawberry_11: Celeste64LocationData(RegionName.highway_island, celeste_64_base_id + 0x0A), LocationName.strawberry_12: Celeste64LocationData(RegionName.badeline_tower_lower, celeste_64_base_id + 0x0B), LocationName.strawberry_13: Celeste64LocationData(RegionName.highway_island, celeste_64_base_id + 0x0C), LocationName.strawberry_14: Celeste64LocationData(RegionName.ne_feathers_island, celeste_64_base_id + 0x0D), diff --git a/worlds/celeste64/Rules.py b/worlds/celeste64/Rules.py index 3365a7cf..732e643b 100644 --- a/worlds/celeste64/Rules.py +++ b/worlds/celeste64/Rules.py @@ -82,12 +82,10 @@ location_hard_moves_logic: Dict[str, List[List[str]]] = { [ItemName.double_dash_refill, ItemName.air_dash]], LocationName.strawberry_15: [[ItemName.feather], [ItemName.ground_dash, ItemName.air_dash]], - LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.traffic_block]], + LocationName.strawberry_17: [[ItemName.double_dash_refill]], LocationName.strawberry_18: [[ItemName.air_dash, ItemName.climb], [ItemName.double_dash_refill, ItemName.air_dash]], - LocationName.strawberry_19: [[ItemName.air_dash, ItemName.skid_jump], - [ItemName.double_dash_refill, ItemName.spring, ItemName.air_dash], - [ItemName.spring, ItemName.ground_dash, ItemName.air_dash]], + LocationName.strawberry_19: [[ItemName.air_dash]], LocationName.strawberry_20: [[ItemName.breakables, ItemName.air_dash]], LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]], From b0b3e3668f08d69ab909f0af50a7b0816c6e9cdf Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Thu, 4 Sep 2025 18:44:32 -0400 Subject: [PATCH 045/204] TUNIC: The Big Refactor (#5195) * Make it actually return false if it gets to the backup lists and fails them * Fix stuff after merge * Add outlet regions, create new regions as needed for them * Put together part of decoupled and direction pairs * make direction pairs work * Make decoupled work * Make fixed shop work again * Fix a few minor bugs * Fix a few minor bugs * Fix plando * god i love programming * Reorder portal list * Update portal sorter for variable shops * Add missing parameter * Some cleanup of prints and functions * Fix typo * it's aliiiiiive * Make seed groups not sync decoupled * Add test with full-shop plando * Fix bug with vanilla portals * Handle plando connections and direction pair errors * Update plando checking for decoupled * Fix typo * Fix exception text to be shorter * Add some more comments * Add todo note * Remove unused safety thing * Remove extra plando connections definition in options * Make seed groups in decoupled with overlapping but not fully overlapped plando connections interact nicely without messing with what the entrances look like in the spoiler log * Fix weird edge case that is technically user error * Add note to fixed shop * Fix parsing shop names in UT * Remove debug print * Actually make UT work * multiworld. to world. * Fix typo from merge * Make it so the shops show up in the entrance hints * Fix bug in ladder storage rules * Remove blank line * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py # worlds/tunic/rules.py # worlds/tunic/test/test_access.py * Fix issues after merge * Update plando connections stuff in docs * Make early bushes only contain grass * Fix library mistake * Backport changes to grass rando (#20) * Backport changes to grass rando * add_rule instead of set_rule for the special cases, add special cases for back of swamp laurels area cause I should've made a new region for the swamp upper entrance * Remove item name group for grass * Update grass rando option descriptions - Also ignore grass fill for single player games * Ignore grass fill option for solo rando * Update er_rules.py * Fix pre fill issue * Remove duplicate option * Add excluded grass locations back * Hide grass fill option from simple ui options page * Check for start with sword before setting grass rules * Update worlds/tunic/options.py Co-authored-by: Scipio Wright * has_stick -> has_melee * has_stick -> has_melee * Add a failsafe for direction pairing * Fix playthrough crash bug * Remove init from logicmixin * Updates per code review (thanks hesto) * has_stick to has_melee in newer update * has_stick to has_melee in newer update * Exclude grass from get_filler_item_name - non-grass rando games were accidentally seeing grass items get shuffled in as filler, which is funny but probably shouldn't happen * Update worlds/tunic/__init__.py Co-authored-by: Scipio Wright * Apply suggestions from code review Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: Scipio Wright * change the rest of grass_fill to local_fill * Filter out grass from filler_items * remove -> discard * Update worlds/tunic/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Starting out * Rules for breakable regions * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/combat_logic.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py * Cleanup more stuff after merge * Revert "Cleanup more stuff after merge" This reverts commit a6ee9a93da8f2fcc4413de6df6927b246017889d. * Revert "# Conflicts:" This reverts commit c74ccd74a45b6ad6b9abe6e339d115a0c98baf30. * Cleanup more stuff after merge * change has_stick to has_melee * Update grass list with combat logic regions * More fixes from combat logic merge * Fix some dumb stuff (#21) * Reorganize pre fill for grass * make the rest of it work, it's pr ready, boom * Make it work in not pot shuffle * Merge grass rando * multiworld -> world get_location, use has_any * Swap out region for West Garden Before Terry grass * Adjust west garden rules to add west combat region * Adjust grass regions for south checkpoint grass * Adjust grass regions for after terry grass * Adjust grass regions for west combat grass * Adjust grass regions for dagger house grass * Adjust grass regions for south checkpoint grass, adjust regions and rules for some related locations * Finish the remainder of the west garden grass, reformat ruined atoll a little * More hex quest updates - Implement page ability shuffle for hex quest - Fix keys behind bosses if hex goal is less than 3 - Added check to fix conflicting hex quest options - Add option to slot data * Change option comparison * Change option checking and fix some stuff - also keep prayer first on low hex counts * Update option defaulting * Update option checking * Fix option assignment again * Merge in hex hunt * Merge in changes * Clean up imports * Add ability type to UT stuff * merge it all * Make local fill work across pot and grass (to be adjusted later) * Make separate pools for the grass and non-grass fills * Fix id overlap * Update option description * Fix default * Reorder localfill option desc * Load the purgatory ones in * Adjustments after merge * Fully remove logicrules * Fix UT support with fixed shop option * Add breakable shuffle to the ut stuff * Make it load in a specific number of locations * Add Silent's spoiler log ability thing * Fix for groups * Fix for groups * Fix typo * Fix hex quest UT support * Use .get * UT fixes, classification fixes * Rename some locations * Adjust guard house names * Adjust guard house names * Rework create_item * Fix for plando connections * Rename, add new breakables * Rename more stuff * Time to rename them again * Fix issue with fixed shop + decoupled * Put in an exception to catch that error in the future * Update create_item to match main * Update spoiler log lines for hex abilities * Burn the signs down * Bring over the combat logic fix * Merge in combat logic fix * Silly static method thing * Move a few areas to before well instead of east forest * Add an all_random hidden option for dev stuff * Port over changes from main * Fix west courtyard pot regions * Remove debug prints * Fix fortress courtyard and beneath the fortress loc groups again * Add exception handling to deal with duplicate apworlds * Fix typo * More missing loc group conversions * Initial fuse shuffle stuff * Fix gun missing from combat_items, add new for combat logic cache, very slight refactor of check_combat_reqs to let it do the changeover in a less complicated fashion, fix area being a boss area rather than non-boss area for a check * Add fuse shuffle logic * reorder atoll statue rule * Update traversal reqs * Remove fuse shuffle from temple door * Combine rules and option checking * Add bell shuffle; fix fuse location groups * Fix portal rules not requiring prayer * Merge the grass laurels exit grass PR * Merge in fortress bridge PR * Do a little clean up * Fix a regression * Update after merge * Some more stuff * More Silent changes * Update more info section in game info page * Fix rules for atoll and swamp fuses * Precollect cathedral fuse in ER * actually just make the fuse useful instead of progression * Add it to the swamp and cath rules too * Fix cath fuse name * Minor fixes and edits * Some UT stuff * Fix a couple more groups * Move a bunch of UT stuff to its own file * Fix up a couple UT things * Couple minor ER fixes * Formatting change * UT poptracker stuff enabled since it's optional in one of the releases * Add author string to world class * Adjust local fill option name * Update ut_stuff to match the PR * Add exception handling for UT with old apworld * Fix missing tracker_world * Remove extra entrance from cath main -> elevator Entry <-> Elev exists, Entry <-> Main exists So no connection is needed between Main and Elev * Fix so that decoupled doesn't incorrectly use get_portal_info and get_paired_portal * Fix so that decoupled doesn't incorrectly use get_portal_info and get_paired_portal * Update for breakables poptracker * Backup and warnings instead * Update typing * Delete old regions and rules, move stuff to logic_helpers and constants * Delete now much less useful tests * Fix breakables map tracking * Add more comments to init * Add todo to grass.py * Fix up tests * Pull out fuse and bell shuffle * Pull out fuse and bell shuffle * Update worlds/tunic/options.py Co-authored-by: qwint * Update worlds/tunic/logic_helpers.py Co-authored-by: qwint * {} -> () in state functions * {} -> () in state functions * Change {} -> () in state functions, use constant for gun * Remove floating constants in er_data * Finish hard deprecating FixedShop * Finish hard deprecating FixedShop * Fix zig skip showing up in decoupled fixed shop --------- Co-authored-by: silent-destroyer Co-authored-by: Silent <110704408+silent-destroyer@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: qwint --- worlds/tunic/__init__.py | 241 ++++++++++------- worlds/tunic/breakables.py | 19 +- worlds/tunic/combat_logic.py | 46 ++-- worlds/tunic/constants.py | 51 ++++ worlds/tunic/er_data.py | 48 ++-- worlds/tunic/er_rules.py | 399 +++++++++++++-------------- worlds/tunic/er_scripts.py | 122 ++++++--- worlds/tunic/fuses.py | 30 +++ worlds/tunic/grass.py | 20 +- worlds/tunic/items.py | 23 +- worlds/tunic/ladder_storage_data.py | 20 +- worlds/tunic/locations.py | 26 +- worlds/tunic/logic_helpers.py | 98 +++++++ worlds/tunic/options.py | 76 ++---- worlds/tunic/regions.py | 25 -- worlds/tunic/rules.py | 402 ---------------------------- worlds/tunic/test/test_access.py | 21 +- 17 files changed, 749 insertions(+), 918 deletions(-) create mode 100644 worlds/tunic/constants.py create mode 100644 worlds/tunic/fuses.py create mode 100644 worlds/tunic/logic_helpers.py delete mode 100644 worlds/tunic/regions.py delete mode 100644 worlds/tunic/rules.py diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 84f1338a..db0357da 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -1,25 +1,28 @@ from dataclasses import fields -from typing import Dict, List, Any, Tuple, TypedDict, ClassVar, Union, Set, TextIO from logging import warning -from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +from typing import Any, TypedDict, ClassVar, TextIO + +from BaseClasses import Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +from Options import PlandoConnection, OptionError, PerGameCommonOptions, Range, Removed +from settings import Group, Bool, FilePath +from worlds.AutoWorld import WebWorld, World + +# from .bells import bell_location_groups, bell_location_name_to_id +from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table +from .combat_logic import area_data, CombatState +from .er_data import portal_mapping, RegionInfo, tunic_er_regions +from .er_rules import set_er_location_rules +from .er_scripts import create_er_regions, verify_plando_directions +# from .fuses import fuse_location_name_to_id, fuse_location_groups +from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations from .items import (item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names, combat_items) from .locations import location_table, location_name_groups, standard_location_name_to_id, hexagon_locations -from .rules import set_location_rules, set_region_rules, randomize_ability_unlocks, gold_hexagon -from .er_rules import set_er_location_rules -from .regions import tunic_regions -from .er_scripts import create_er_regions, verify_plando_directions -from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations -from .er_data import portal_mapping, RegionInfo, tunic_er_regions +from .logic_helpers import randomize_ability_unlocks, gold_hexagon from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_option_presets, TunicPlandoConnections, - LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage, check_options, - get_hexagons_in_pool, HexagonQuestAbilityUnlockType, EntranceLayout) -from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table -from .combat_logic import area_data, CombatState + LaurelsLocation, LaurelsZips, IceGrappling, LadderStorage, EntranceLayout, + check_options, LocalFill, get_hexagons_in_pool, HexagonQuestAbilityUnlockType) from . import ut_stuff -from worlds.AutoWorld import WebWorld, World -from Options import PlandoConnection, OptionError, PerGameCommonOptions, Removed, Range -from settings import Group, Bool, FilePath class TunicSettings(Group): @@ -28,15 +31,15 @@ class TunicSettings(Group): class LimitGrassRando(Bool): """Limits the impact of Grass Randomizer on the multiworld by disallowing local_fill percentages below 95.""" - + class UTPoptrackerPath(FilePath): """Path to the user's TUNIC Poptracker Pack.""" description = "TUNIC Poptracker Pack zip file" required = False - disable_local_spoiler: Union[DisableLocalSpoiler, bool] = False - limit_grass_rando: Union[LimitGrassRando, bool] = True - ut_poptracker_path: Union[UTPoptrackerPath, str] = UTPoptrackerPath() + disable_local_spoiler: DisableLocalSpoiler | bool = False + limit_grass_rando: LimitGrassRando | bool = True + ut_poptracker_path: UTPoptrackerPath | str = UTPoptrackerPath() class TunicWeb(WebWorld): @@ -68,10 +71,10 @@ class SeedGroup(TypedDict): laurels_zips: bool # laurels_zips value ice_grappling: int # ice_grappling value ladder_storage: int # ls value - laurels_at_10_fairies: bool # laurels location value + laurels_at_10_fairies: bool # whether laurels location is set to 10 fairies entrance_layout: int # entrance layout value has_decoupled_enabled: bool # for checking that players don't have conflicting options - plando: List[PlandoConnection] # consolidated plando connections for the seed group + plando: list[PlandoConnection] # consolidated plando connections for the seed group class TunicWorld(World): @@ -82,54 +85,66 @@ class TunicWorld(World): """ game = "TUNIC" web = TunicWeb() + author: str = "SilentSR & ScipioWright" options: TunicOptions options_dataclass = TunicOptions settings: ClassVar[TunicSettings] item_name_groups = item_name_groups + # grass, breakables, fuses, and bells are separated out into their own files + # this makes for easier organization, at the cost of stuff like what's directly below here location_name_groups = location_name_groups for group_name, members in grass_location_name_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) for group_name, members in breakable_location_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) + # for group_name, members in fuse_location_groups.items(): + # location_name_groups.setdefault(group_name, set()).update(members) + # for group_name, members in bell_location_groups.items(): + # location_name_groups.setdefault(group_name, set()).update(members) item_name_to_id = item_name_to_id location_name_to_id = standard_location_name_to_id.copy() location_name_to_id.update(grass_location_name_to_id) location_name_to_id.update(breakable_location_name_to_id) + # location_name_to_id.update(fuse_location_name_to_id) + # location_name_to_id.update(bell_location_name_to_id) - player_location_table: Dict[str, int] - ability_unlocks: Dict[str, int] - slot_data_items: List[TunicItem] - tunic_portal_pairs: Dict[str, str] - er_portal_hints: Dict[int, str] - seed_groups: Dict[str, SeedGroup] = {} - used_shop_numbers: Set[int] - er_regions: Dict[str, RegionInfo] # absolutely needed so outlet regions work + player_location_table: dict[str, int] + ability_unlocks: dict[str, int] + slot_data_items: list[TunicItem] + tunic_portal_pairs: dict[str, str] + er_portal_hints: dict[int, str] + seed_groups: dict[str, SeedGroup] = {} + used_shop_numbers: set[int] + er_regions: dict[str, RegionInfo] # absolutely needed so outlet regions work # for the local_fill option - fill_items: List[TunicItem] - fill_locations: List[Location] + fill_items: list[TunicItem] + fill_locations: list[Location] + backup_locations: list[Location] amount_to_local_fill: int # so we only loop the multiworld locations once # if these are locations instead of their info, it gives a memory leak error - item_link_locations: Dict[int, Dict[str, List[Tuple[int, str]]]] = {} - player_item_link_locations: Dict[str, List[Location]] + item_link_locations: dict[int, dict[str, list[tuple[int, str]]]] = {} + player_item_link_locations: dict[str, list[Location]] using_ut: bool # so we can check if we're using UT only once - passthrough: Dict[str, Any] + passthrough: dict[str, Any] ut_can_gen_without_yaml = True # class var that tells it to ignore the player yaml tracker_world: ClassVar = ut_stuff.tracker_world def generate_early(self) -> None: + # if you have multiple APWorlds, we want it to fail here instead of at the end of gen try: int(self.settings.disable_local_spoiler) except AttributeError: raise Exception("You have a TUNIC APWorld in your lib/worlds folder and custom_worlds folder.\n" "This would cause an error at the end of generation.\n" "Please remove one of them, most likely the one in lib/worlds.") - + + # hidden option for me to do multi-slot test gens with random options more easily if self.options.all_random: for option_name in (attr.name for attr in fields(TunicOptions) if attr not in fields(PerGameCommonOptions)): @@ -145,10 +160,11 @@ class TunicWorld(World): option.value = self.random.choice(list(option.name_lookup)) check_options(self) - self.er_regions = tunic_er_regions.copy() + # empty plando connections if ER is off if self.options.plando_connections and not self.options.entrance_rando: self.options.plando_connections.value = () + # modify direction and order of plando connections for more consistency later on if self.options.plando_connections: def replace_connection(old_cxn: PlandoConnection, new_cxn: PlandoConnection, index: int) -> None: self.options.plando_connections.value.remove(old_cxn) @@ -180,6 +196,7 @@ class TunicWorld(World): self.player_location_table = standard_location_name_to_id.copy() + # setup our defaults for the local_fill option if self.options.local_fill == -1: if self.options.grass_randomizer: if self.options.breakable_shuffle: @@ -206,9 +223,15 @@ class TunicWorld(World): self.player_location_table.update({name: num for name, num in breakable_location_name_to_id.items() if not name.startswith("Purgatory")}) + # if self.options.shuffle_fuses: + # self.player_location_table.update(fuse_location_name_to_id) + # + # if self.options.shuffle_bells: + # self.player_location_table.update(bell_location_name_to_id) + @classmethod def stage_generate_early(cls, multiworld: MultiWorld) -> None: - tunic_worlds: Tuple[TunicWorld] = multiworld.get_game_worlds("TUNIC") + tunic_worlds: tuple[TunicWorld] = multiworld.get_game_worlds("TUNIC") for tunic in tunic_worlds: # setting up state combat logic stuff, see has_combat_reqs for its use # and this is magic so pycharm doesn't like it, unfortunately @@ -314,10 +337,10 @@ class TunicWorld(World): return TunicItem(name, itemclass, self.item_name_to_id[name], self.player) def create_items(self) -> None: - tunic_items: List[TunicItem] = [] + tunic_items: list[TunicItem] = [] self.slot_data_items = [] - items_to_create: Dict[str, int] = {item: data.quantity_in_item_pool for item, data in item_table.items()} + items_to_create: dict[str, int] = {item: data.quantity_in_item_pool for item, data in item_table.items()} # Calculate number of hexagons in item pool if self.options.hexagon_quest: @@ -377,7 +400,7 @@ class TunicWorld(World): items_to_create[rgb_hexagon] = 0 # Filler items in the item pool - available_filler: List[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and + available_filler: list[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and item_table[filler].classification == ItemClassification.filler] # Remove filler to make room for other items @@ -457,8 +480,8 @@ class TunicWorld(World): # discard grass from non_local if it's meant to be limited if self.settings.limit_grass_rando: self.options.non_local_items.value.discard("Grass") - all_filler: List[TunicItem] = [] - non_filler: List[TunicItem] = [] + all_filler: list[TunicItem] = [] + non_filler: list[TunicItem] = [] for tunic_item in tunic_items: if (tunic_item.excludable and tunic_item.name not in self.options.local_items @@ -477,7 +500,7 @@ class TunicWorld(World): if self.options.local_fill > 0 and self.multiworld.players > 1: # we need to reserve a couple locations so that we don't fill up every sphere 1 location sphere_one_locs = self.multiworld.get_reachable_locations(CollectionState(self.multiworld), self.player) - reserved_locations: Set[Location] = set(self.random.sample(sphere_one_locs, 2)) + reserved_locations: set[Location] = set(self.random.sample(sphere_one_locs, 2)) viable_locations = [loc for loc in self.multiworld.get_unfilled_locations(self.player) if loc not in reserved_locations and loc.name not in self.options.priority_locations.value] @@ -487,34 +510,91 @@ class TunicWorld(World): f"This is likely due to excess plando or priority locations.") self.random.shuffle(viable_locations) self.fill_locations = viable_locations[:self.amount_to_local_fill] + self.backup_locations = viable_locations[self.amount_to_local_fill:] @classmethod def stage_pre_fill(cls, multiworld: MultiWorld) -> None: - tunic_fill_worlds: List[TunicWorld] = [world for world in multiworld.get_game_worlds("TUNIC") + tunic_fill_worlds: list[TunicWorld] = [world for world in multiworld.get_game_worlds("TUNIC") if world.options.local_fill.value > 0] if tunic_fill_worlds and multiworld.players > 1: - grass_fill: List[TunicItem] = [] - non_grass_fill: List[TunicItem] = [] - grass_fill_locations: List[Location] = [] - non_grass_fill_locations: List[Location] = [] + grass_fill: list[TunicItem] = [] + non_grass_fill: list[TunicItem] = [] + grass_fill_locations: list[Location] = [] + non_grass_fill_locations: list[Location] = [] + backup_grass_locations: list[Location] = [] + backup_non_grass_locations: list[Location] = [] for world in tunic_fill_worlds: if world.options.grass_randomizer: grass_fill.extend(world.fill_items) grass_fill_locations.extend(world.fill_locations) + backup_grass_locations.extend(world.backup_locations) else: non_grass_fill.extend(world.fill_items) non_grass_fill_locations.extend(world.fill_locations) + backup_non_grass_locations.extend(world.backup_locations) multiworld.random.shuffle(grass_fill) multiworld.random.shuffle(non_grass_fill) multiworld.random.shuffle(grass_fill_locations) multiworld.random.shuffle(non_grass_fill_locations) + multiworld.random.shuffle(backup_grass_locations) + multiworld.random.shuffle(backup_non_grass_locations) + + # these are slots that filled in TUNIC locations during pre_fill + out_of_spec_worlds = set() for filler_item in grass_fill: - grass_fill_locations.pop().place_locked_item(filler_item) + loc_to_fill = grass_fill_locations.pop() + try: + loc_to_fill.place_locked_item(filler_item) + except Exception: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + for loc in backup_grass_locations: + if not loc.item: + loc.place_locked_item(filler_item) + break + else: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + else: + raise Exception("TUNIC: Could not fulfill local_filler option. This issue is caused by another " + "world filling TUNIC locations during pre_fill.\n" + "Archipelago does not allow us to place items into the item pool after " + "create_items, so we cannot recover from this issue.\n" + f"This is likely caused by the following world(s): {out_of_spec_worlds}.\n" + f"Please let the world dev(s) for the listed world(s) know that there is an " + f"issue there.\n" + "As a workaround, you can try setting the local_filler option lower for " + "TUNIC slots with Breakable Shuffle or Grass Rando enabled. You may be able to " + "try generating again, as it may not happen every generation.") for filler_item in non_grass_fill: - non_grass_fill_locations.pop().place_locked_item(filler_item) + loc_to_fill = non_grass_fill_locations.pop() + try: + loc_to_fill.place_locked_item(filler_item) + except Exception: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + for loc in backup_non_grass_locations: + if not loc.item: + loc.place_locked_item(filler_item) + break + else: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + else: + raise Exception("TUNIC: Could not fulfill local_filler option. This issue is caused by another " + "world filling TUNIC locations during pre_fill.\n" + "Archipelago does not allow us to place items into the item pool after " + "create_items, so we cannot recover from this issue.\n" + f"This is likely caused by the following world(s): {out_of_spec_worlds}.\n" + f"Please let the world dev(s) for the listed world(s) know that there is an " + f"issue there.\n" + "As a workaround, you can try setting the local_filler option lower for " + "TUNIC slots with Breakable Shuffle or Grass Rando enabled. You may be able to " + "try generating again, as it may not happen every generation.") + if out_of_spec_worlds: + warning("TUNIC: At least one other world has filled TUNIC locations during pre_fill. This may " + "cause issues for games that rely on placing items in their own world during pre_fill.\n" + f"This is likely being caused by the following world(s): {out_of_spec_worlds}.\n" + "Please let the world dev(s) for the listed world(s) know that there is an issue there.") def create_regions(self) -> None: self.tunic_portal_pairs = {} @@ -522,48 +602,19 @@ class TunicWorld(World): self.ability_unlocks = randomize_ability_unlocks(self) # stuff for universal tracker support, can be ignored for standard gen - if self.using_ut: + if self.using_ut and self.options.hexagon_quest_ability_type == "hexagons": self.ability_unlocks["Pages 24-25 (Prayer)"] = self.passthrough["Hexagon Quest Prayer"] self.ability_unlocks["Pages 42-43 (Holy Cross)"] = self.passthrough["Hexagon Quest Holy Cross"] self.ability_unlocks["Pages 52-53 (Icebolt)"] = self.passthrough["Hexagon Quest Icebolt"] - # Most non-standard options use ER regions - if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer or self.options.breakable_shuffle): - portal_pairs = create_er_regions(self) - if self.options.entrance_rando: - # these get interpreted by the game to tell it which entrances to connect - for portal1, portal2 in portal_pairs.items(): - self.tunic_portal_pairs[portal1.scene_destination()] = portal2.scene_destination() - else: - # uses the original rules, easier to navigate and reference - for region_name in tunic_regions: - region = Region(region_name, self.player, self.multiworld) - self.multiworld.regions.append(region) - - for region_name, exits in tunic_regions.items(): - region = self.get_region(region_name) - region.add_exits(exits) - - for location_name, location_id in self.player_location_table.items(): - region = self.get_region(location_table[location_name].region) - location = TunicLocation(self.player, location_name, location_id, region) - region.locations.append(location) - - victory_region = self.get_region("Spirit Arena") - victory_location = TunicLocation(self.player, "The Heir", None, victory_region) - victory_location.place_locked_item(TunicItem("Victory", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) - victory_region.locations.append(victory_location) + portal_pairs = create_er_regions(self) + if self.options.entrance_rando: + # these get interpreted by the game to tell it which entrances to connect + for portal1, portal2 in portal_pairs.items(): + self.tunic_portal_pairs[portal1.scene_destination()] = portal2.scene_destination() def set_rules(self) -> None: - # same reason as in create_regions - if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer or self.options.breakable_shuffle): - set_er_location_rules(self) - else: - set_region_rules(self) - set_location_rules(self) + set_er_location_rules(self) def get_filler_item_name(self) -> str: return self.random.choice(filler_items) @@ -582,14 +633,14 @@ class TunicWorld(World): return change def write_spoiler_header(self, spoiler_handle: TextIO): - if self.options.hexagon_quest and self.options.ability_shuffling\ - and self.options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + if (self.options.hexagon_quest and self.options.ability_shuffling + and self.options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons): spoiler_handle.write("\nAbility Unlocks (Hexagon Quest):\n") for ability in self.ability_unlocks: # Remove parentheses for better readability spoiler_handle.write(f'{ability[ability.find("(")+1:ability.find(")")]}: {self.ability_unlocks[ability]} Gold Questagons\n') - def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]) -> None: + def extend_hint_information(self, hint_data: dict[int, dict[int, str]]) -> None: if self.options.entrance_rando: hint_data.update({self.player: {}}) # all state seems to have efficient paths @@ -626,7 +677,7 @@ class TunicWorld(World): if hint_text: hint_data[self.player][location.address] = hint_text - def get_real_location(self, location: Location) -> Tuple[str, int]: + def get_real_location(self, location: Location) -> tuple[str, int]: # if it's not in a group, it's not in an item link if location.player not in self.multiworld.groups or not location.item: return location.name, location.player @@ -638,8 +689,8 @@ class TunicWorld(World): f"Using a potentially incorrect location name instead.") return location.name, location.player - def fill_slot_data(self) -> Dict[str, Any]: - slot_data: Dict[str, Any] = { + def fill_slot_data(self) -> dict[str, Any]: + slot_data: dict[str, Any] = { "seed": self.random.randint(0, 2147483647), "start_with_sword": self.options.start_with_sword.value, "keys_behind_bosses": self.options.keys_behind_bosses.value, @@ -657,6 +708,8 @@ class TunicWorld(World): "entrance_rando": int(bool(self.options.entrance_rando.value)), "decoupled": self.options.decoupled.value if self.options.entrance_rando else 0, "shuffle_ladders": self.options.shuffle_ladders.value, + # "shuffle_fuses": self.options.shuffle_fuses.value, + # "shuffle_bells": self.options.shuffle_bells.value, "grass_randomizer": self.options.grass_randomizer.value, "combat_logic": self.options.combat_logic.value, "Hexagon Quest Prayer": self.ability_unlocks["Pages 24-25 (Prayer)"], @@ -674,7 +727,7 @@ class TunicWorld(World): # checking if groups so that this doesn't run if the player isn't in a group if groups: if not self.item_link_locations: - tunic_worlds: Tuple[TunicWorld] = self.multiworld.get_game_worlds("TUNIC") + tunic_worlds: tuple[TunicWorld] = self.multiworld.get_game_worlds("TUNIC") # figure out our groups and the items in them for tunic in tunic_worlds: for group in self.multiworld.get_player_groups(tunic.player): @@ -710,7 +763,7 @@ class TunicWorld(World): # for the universal tracker, doesn't get called in standard gen # docs: https://github.com/FarisTheAncient/Archipelago/blob/tracker/worlds/tracker/docs/re-gen-passthrough.md @staticmethod - def interpret_slot_data(slot_data: Dict[str, Any]) -> Dict[str, Any]: + def interpret_slot_data(slot_data: dict[str, Any]) -> dict[str, Any]: # returning slot_data so it regens, giving it back in multiworld.re_gen_passthrough # we are using re_gen_passthrough over modifying the world here due to complexities with ER return slot_data diff --git a/worlds/tunic/breakables.py b/worlds/tunic/breakables.py index 156bece7..b9af437c 100644 --- a/worlds/tunic/breakables.py +++ b/worlds/tunic/breakables.py @@ -1,18 +1,18 @@ +from enum import IntEnum from typing import TYPE_CHECKING, NamedTuple -from enum import IntEnum from BaseClasses import CollectionState, Region from worlds.generic.Rules import set_rule -from .rules import has_sword, has_melee + +from .constants import base_id from .er_rules import can_shop +from .logic_helpers import has_sword, has_melee + + if TYPE_CHECKING: from . import TunicWorld -# just getting an id that is a decent chunk ahead of the grass ones -breakable_base_id = 509342400 + 8000 - - class BreakableType(IntEnum): pot = 1 fire_pot = 2 @@ -341,6 +341,7 @@ breakable_location_table: dict[str, TunicLocationData] = { } +breakable_base_id = base_id + 8000 breakable_location_name_to_id: dict[str, int] = {name: breakable_base_id + index for index, name in enumerate(breakable_location_table)} @@ -358,6 +359,7 @@ loc_group_convert: dict[str, str] = { "Beneath the Well Main": "Beneath the Well", "Well Boss": "Dark Tomb Checkpoint", "Dark Tomb Main": "Dark Tomb", + "Magic Dagger House": "West Garden House", "Fortress Courtyard Upper": "Fortress Courtyard", "Fortress Courtyard Upper pot": "Fortress Courtyard", "Fortress Courtyard west pots": "Fortress Courtyard", @@ -370,13 +372,16 @@ loc_group_convert: dict[str, str] = { "Fortress Grave Path westmost pot": "Fortress Grave Path", "Fortress Grave Path pots": "Fortress Grave Path", "Dusty": "Fortress Leaf Piles", - "Frog Stairs Upper": "Frog Stairs", + "Frog Stairs Upper": "Frog Stairway", + "Frog's Domain Front": "Frog's Domain", + "Frog's Domain Main": "Frog's Domain", "Quarry Monastery Entry": "Quarry", "Quarry Back": "Quarry", "Lower Quarry": "Quarry", "Lower Quarry upper pots": "Quarry", "Even Lower Quarry": "Quarry", "Monastery Back": "Monastery", + "Cathedral Main": "Cathedral", } diff --git a/worlds/tunic/combat_logic.py b/worlds/tunic/combat_logic.py index dbf1e864..d12450fb 100644 --- a/worlds/tunic/combat_logic.py +++ b/worlds/tunic/combat_logic.py @@ -1,10 +1,12 @@ -from typing import Dict, List, NamedTuple, Tuple, Optional -from enum import IntEnum from collections import defaultdict +from enum import IntEnum +from typing import NamedTuple + from BaseClasses import CollectionState -from .rules import has_sword, has_melee from worlds.AutoWorld import LogicMixin +from .logic_helpers import has_sword, has_melee + # the vanilla stats you are expected to have to get through an area, based on where they are in vanilla class AreaStats(NamedTuple): @@ -16,12 +18,12 @@ class AreaStats(NamedTuple): sp_level: int mp_level: int potion_count: int - equipment: List[str] = [] + equipment: list[str] = [] is_boss: bool = False # the vanilla upgrades/equipment you would have -area_data: Dict[str, AreaStats] = { +area_data: dict[str, AreaStats] = { # The upgrade page is right by the Well entrance. Upper Overworld by the chest in the top right might need something "Overworld": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Stick"]), "East Forest": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Sword"]), @@ -52,9 +54,9 @@ area_data: Dict[str, AreaStats] = { # these are used for caching which areas can currently be reached in state # Gauntlet does not have exclusively higher stat requirements, so it will be checked separately -boss_areas: List[str] = [name for name, data in area_data.items() if data.is_boss and name != "Gauntlet"] +boss_areas: list[str] = [name for name, data in area_data.items() if data.is_boss and name != "Gauntlet"] # Swamp does not have exclusively higher stat requirements, so it will be checked separately -non_boss_areas: List[str] = [name for name, data in area_data.items() if not data.is_boss and name != "Swamp"] +non_boss_areas: list[str] = [name for name, data in area_data.items() if not data.is_boss and name != "Swamp"] class CombatState(IntEnum): @@ -114,7 +116,7 @@ def has_combat_reqs(area_name: str, state: CollectionState, player: int) -> bool return met_combat_reqs -def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_data: Optional[AreaStats] = None) -> bool: +def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_data: AreaStats | None = None) -> bool: data = alt_data or area_data[area_name] extra_att_needed = 0 extra_def_needed = 0 @@ -303,7 +305,7 @@ def has_required_stats(data: AreaStats, state: CollectionState, player: int) -> # returns a tuple of your max attack level, the number of attack offerings -def get_att_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_att_level(state: CollectionState, player: int) -> tuple[int, int]: att_offerings = state.count("ATT Offering", player) att_upgrades = state.count("Hero Relic - ATT", player) sword_level = state.count("Sword Upgrade", player) @@ -315,44 +317,44 @@ def get_att_level(state: CollectionState, player: int) -> Tuple[int, int]: # returns a tuple of your max defense level, the number of defense offerings -def get_def_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_def_level(state: CollectionState, player: int) -> tuple[int, int]: def_offerings = state.count("DEF Offering", player) # defense falls off, can just cap it at 8 for simplicity return (min(8, 1 + def_offerings - + state.count_from_list({"Hero Relic - DEF", "Secret Legend", "Phonomath"}, player)) + + state.count_from_list(("Hero Relic - DEF", "Secret Legend", "Phonomath"), player)) + (2 if state.has("Shield", player) else 0) + (2 if state.has("Hero's Laurels", player) else 0), def_offerings) # returns a tuple of your max potion level, the number of potion offerings -def get_potion_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_potion_level(state: CollectionState, player: int) -> tuple[int, int]: potion_offerings = min(2, state.count("Potion Offering", player)) # your third potion upgrade (from offerings) costs 1,000 money, reasonable to assume you won't do that return (1 + potion_offerings - + state.count_from_list({"Hero Relic - POTION", "Just Some Pals", "Spring Falls", "Back To Work"}, player), + + state.count_from_list(("Hero Relic - POTION", "Just Some Pals", "Spring Falls", "Back To Work"), player), potion_offerings) # returns a tuple of your max hp level, the number of hp offerings -def get_hp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_hp_level(state: CollectionState, player: int) -> tuple[int, int]: hp_offerings = state.count("HP Offering", player) return 1 + hp_offerings + state.count("Hero Relic - HP", player), hp_offerings # returns a tuple of your max sp level, the number of sp offerings -def get_sp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_sp_level(state: CollectionState, player: int) -> tuple[int, int]: sp_offerings = state.count("SP Offering", player) return (1 + sp_offerings - + state.count_from_list({"Hero Relic - SP", "Mr Mayor", "Power Up", - "Regal Weasel", "Forever Friend"}, player), + + state.count_from_list(("Hero Relic - SP", "Mr Mayor", "Power Up", + "Regal Weasel", "Forever Friend"), player), sp_offerings) -def get_mp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_mp_level(state: CollectionState, player: int) -> tuple[int, int]: mp_offerings = state.count("MP Offering", player) return (1 + mp_offerings - + state.count_from_list({"Hero Relic - MP", "Sacred Geometry", "Vintage", "Dusty"}, player), + + state.count_from_list(("Hero Relic - MP", "Sacred Geometry", "Vintage", "Dusty"), player), mp_offerings) @@ -426,9 +428,9 @@ def calc_def_sp_cost(def_upgrades: int, sp_upgrades: int) -> int: class TunicState(LogicMixin): - tunic_need_to_reset_combat_from_collect: Dict[int, bool] - tunic_need_to_reset_combat_from_remove: Dict[int, bool] - tunic_area_combat_state: Dict[int, Dict[str, int]] + tunic_need_to_reset_combat_from_collect: dict[int, bool] + tunic_need_to_reset_combat_from_remove: dict[int, bool] + tunic_area_combat_state: dict[int, dict[str, int]] def init_mixin(self, _): # the per-player need to reset the combat state when collecting a combat item diff --git a/worlds/tunic/constants.py b/worlds/tunic/constants.py new file mode 100644 index 00000000..2543fd3c --- /dev/null +++ b/worlds/tunic/constants.py @@ -0,0 +1,51 @@ +base_id = 509342400 + +laurels = "Hero's Laurels" +grapple = "Magic Orb" +ice_dagger = "Magic Dagger" +fire_wand = "Magic Wand" +gun = "Gun" +lantern = "Lantern" +fairies = "Fairy" +coins = "Golden Coin" +prayer = "Pages 24-25 (Prayer)" +holy_cross = "Pages 42-43 (Holy Cross)" +icebolt = "Pages 52-53 (Icebolt)" +shield = "Shield" +key = "Key" +house_key = "Old House Key" +vault_key = "Fortress Vault Key" +mask = "Scavenger Mask" +red_hexagon = "Red Questagon" +green_hexagon = "Green Questagon" +blue_hexagon = "Blue Questagon" +gold_hexagon = "Gold Questagon" + +swamp_fuse_1 = "Swamp Fuse 1" +swamp_fuse_2 = "Swamp Fuse 2" +swamp_fuse_3 = "Swamp Fuse 3" +cathedral_elevator_fuse = "Cathedral Elevator Fuse" +quarry_fuse_1 = "Quarry Fuse 1" +quarry_fuse_2 = "Quarry Fuse 2" +ziggurat_miniboss_fuse = "Ziggurat Miniboss Fuse" +ziggurat_teleporter_fuse = "Ziggurat Teleporter Fuse" +fortress_exterior_fuse_1 = "Fortress Exterior Fuse 1" +fortress_exterior_fuse_2 = "Fortress Exterior Fuse 2" +fortress_courtyard_upper_fuse = "Fortress Courtyard Upper Fuse" +fortress_courtyard_lower_fuse = "Fortress Courtyard Fuse" +beneath_the_vault_fuse = "Beneath the Vault Fuse" # event needs to be renamed probably +fortress_candles_fuse = "Fortress Candles Fuse" +fortress_door_left_fuse = "Fortress Door Left Fuse" +fortress_door_right_fuse = "Fortress Door Right Fuse" +west_furnace_fuse = "West Furnace Fuse" +west_garden_fuse = "West Garden Fuse" +atoll_northeast_fuse = "Atoll Northeast Fuse" +atoll_northwest_fuse = "Atoll Northwest Fuse" +atoll_southeast_fuse = "Atoll Southeast Fuse" +atoll_southwest_fuse = "Atoll Southwest Fuse" +library_lab_fuse = "Library Lab Fuse" + +# "Quarry - [East] Bombable Wall" is excluded from this list since it has slightly different rules +bomb_walls = ["East Forest - Bombable Wall", "Eastern Vault Fortress - [East Wing] Bombable Wall", + "Overworld - [Central] Bombable Wall", "Overworld - [Southwest] Bombable Wall Near Fountain", + "Quarry - [West] Upper Area Bombable Wall", "Ruined Atoll - [Northwest] Bombable Wall"] diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index 744326aa..cfa215a3 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -1,5 +1,5 @@ -from typing import Dict, NamedTuple, List, Optional, TYPE_CHECKING from enum import IntEnum +from typing import NamedTuple, TYPE_CHECKING if TYPE_CHECKING: from . import TunicWorld @@ -36,7 +36,7 @@ class Portal(NamedTuple): return self.destination + ", " + self.scene() + self.tag -portal_mapping: List[Portal] = [ +portal_mapping: list[Portal] = [ Portal(name="Stick House Entrance", region="Overworld", destination="Sword Cave", tag="_", direction=Direction.north), Portal(name="Windmill Entrance", region="Overworld", @@ -535,7 +535,7 @@ portal_mapping: List[Portal] = [ class RegionInfo(NamedTuple): game_scene: str # the name of the scene in the actual game dead_end: int = 0 # if a region has only one exit - outlet_region: Optional[str] = None + outlet_region: str | None = None is_fake_region: bool = False @@ -553,7 +553,7 @@ class DeadEnd(IntEnum): # key is the AP region name. "Fake" in region info just means the mod won't receive that info at all -tunic_er_regions: Dict[str, RegionInfo] = { +tunic_er_regions: dict[str, RegionInfo] = { "Menu": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), "Overworld": RegionInfo("Overworld Redux"), # main overworld, the central area "Overworld Holy Cross": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), # main overworld holy cross checks @@ -735,6 +735,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Rooted Ziggurat Lower Entry": RegionInfo("ziggurat2020_3"), # the vanilla entry point side "Rooted Ziggurat Lower Front": RegionInfo("ziggurat2020_3"), # the front for combat logic "Rooted Ziggurat Lower Mid Checkpoint": RegionInfo("ziggurat2020_3"), # the mid-checkpoint before double admin + "Rooted Ziggurat Lower Miniboss Platform": RegionInfo("ziggurat2020_3"), # the double admin platform "Rooted Ziggurat Lower Back": RegionInfo("ziggurat2020_3"), # the boss side "Zig Skip Exit": RegionInfo("ziggurat2020_3", dead_end=DeadEnd.special, outlet_region="Rooted Ziggurat Lower Entry", is_fake_region=True), # for use with fixed shop on "Rooted Ziggurat Portal Room Entrance": RegionInfo("ziggurat2020_3", outlet_region="Rooted Ziggurat Lower Back"), # the door itself on the zig 3 side @@ -775,7 +776,6 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Spirit Arena Victory": RegionInfo("Spirit Arena", dead_end=DeadEnd.all_cats, is_fake_region=True), } - # this is essentially a pared down version of the region connections in rules.py, with some minor differences # the main purpose of this is to make it so that you can access every region # most items are excluded from the rules here, since we can assume Archipelago will properly place them @@ -786,7 +786,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { # LS# refers to ladder storage difficulties # LS rules are used for region connections here regardless of whether you have being knocked out of the air in logic # this is because it just means you can reach the entrances in that region via ladder storage -traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { +traversal_requirements: dict[str, dict[str, list[list[str]]]] = { "Overworld": { "Overworld Beach": [], @@ -801,7 +801,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Overworld Swamp Lower Entry": [], "Overworld Special Shop Entry": - [["Hyperdash"], ["LS1"]], + [["LS1"]], "Overworld Well Entry Area": [], "Overworld Ruined Passage Door": @@ -823,7 +823,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Overworld Tunnel Turret": [["IG1"], ["LS1"], ["Hyperdash"]], "Overworld Temple Door": - [["IG2"], ["LS3"], ["Forest Belltower Upper", "Overworld Belltower"]], + [["Bell Shuffle"], ["IG2"], ["LS3"], ["Forest Belltower Upper", "Overworld Belltower"]], "Overworld Southeast Cross Door": [], "Overworld Fountain Cross Door": @@ -1229,7 +1229,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { }, "West Garden by Portal": { "West Garden Portal": - [["West Garden South Checkpoint"]], + [["Fuse Shuffle"], ["West Garden South Checkpoint"]], "West Garden Portal Item": [["Hyperdash"]], }, @@ -1468,7 +1468,8 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Eastern Vault Fortress": { "Eastern Vault Fortress Gold Door": - [["IG2"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Fortress Courtyard Upper"]], + [["IG2"], ["Fuse Shuffle"], + ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Fortress Courtyard Upper"]], }, "Eastern Vault Fortress Gold Door": { "Eastern Vault Fortress": @@ -1514,7 +1515,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Fortress Arena": { "Fortress Arena Portal": - [["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], + [["Fuse Shuffle"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], }, "Fortress Arena Portal": { "Fortress Arena": @@ -1547,7 +1548,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Quarry Entry": { "Quarry Portal": - [["Quarry Connector"]], + [["Fuse Shuffle"], ["Quarry Connector"]], "Quarry": [], "Monastery Rope": @@ -1593,7 +1594,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Even Lower Quarry": [], "Lower Quarry Zig Door": - [["Quarry", "Quarry Connector"], ["IG3"]], + [["Fuse Shuffle"], ["Quarry", "Quarry Connector"], ["IG3"]], }, "Monastery Rope": { "Quarry Back": @@ -1636,13 +1637,19 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { [["Hyperdash"]], "Rooted Ziggurat Lower Front": [], - "Rooted Ziggurat Lower Back": + "Rooted Ziggurat Lower Miniboss Platform": [], }, + "Rooted Ziggurat Lower Miniboss Platform": { + "Rooted Ziggurat Lower Mid Checkpoint": + [], + "Rooted Ziggurat Lower Back": + [] + }, "Rooted Ziggurat Lower Back": { "Rooted Ziggurat Lower Entry": [["LS2"]], - "Rooted Ziggurat Lower Mid Checkpoint": + "Rooted Ziggurat Lower Miniboss Platform": [["Hyperdash"], ["IG1"]], "Rooted Ziggurat Portal Room Entrance": [], @@ -1658,7 +1665,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { }, "Rooted Ziggurat Portal Room": { "Rooted Ziggurat Portal Room Exit": - [["Rooted Ziggurat Lower Back"]], + [["Fuse Shuffle"], ["Rooted Ziggurat Lower Back"]], "Rooted Ziggurat Portal": [], }, @@ -1742,7 +1749,6 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Cathedral Main": [], }, - "Cathedral Gauntlet Checkpoint": { "Cathedral Gauntlet": [], @@ -1762,13 +1768,13 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Far Shore to East Forest Region": [["Hyperdash"]], "Far Shore to Quarry Region": - [["Quarry Connector", "Quarry"]], + [["Fuse Shuffle"], ["Quarry Connector", "Quarry"]], "Far Shore to Library Region": - [["Library Lab"]], + [["Fuse Shuffle"], ["Library Lab"]], "Far Shore to West Garden Region": - [["West Garden South Checkpoint"]], + [["Fuse Shuffle"], ["West Garden South Checkpoint"]], "Far Shore to Fortress Region": - [["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], + [["Fuse Shuffle"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], }, "Far Shore to Spawn Region": { "Far Shore": diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index edd6021c..6d238693 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -1,58 +1,32 @@ -from typing import Dict, FrozenSet, Tuple, TYPE_CHECKING +from typing import FrozenSet, TYPE_CHECKING + +from BaseClasses import Region from worlds.generic.Rules import set_rule, add_rule, forbid_item -from BaseClasses import Region, CollectionState -from .options import IceGrappling, LadderStorage, CombatLogic -from .rules import (has_ability, has_sword, has_melee, has_ice_grapple_logic, has_lantern, has_mask, can_ladder_storage, - laurels_zip, bomb_walls) -from .er_data import Portal, get_portal_outlet_region -from .ladder_storage_data import ow_ladder_groups, region_ladders, easy_ls, medium_ls, hard_ls + +# from .bells import set_bell_location_rules from .combat_logic import has_combat_reqs +from .constants import * +from .er_data import Portal, get_portal_outlet_region +# from .fuses import set_fuse_location_rules, has_fuses from .grass import set_grass_location_rules +from .ladder_storage_data import ow_ladder_groups, region_ladders, easy_ls, medium_ls, hard_ls +from .logic_helpers import (has_ability, has_ladder, has_melee, has_sword, has_lantern, has_mask, has_fuses, + can_shop, can_get_past_bushes, laurels_zip, has_ice_grapple_logic, can_ladder_storage) +from .options import IceGrappling, LadderStorage, CombatLogic if TYPE_CHECKING: from . import TunicWorld -laurels = "Hero's Laurels" -grapple = "Magic Orb" -ice_dagger = "Magic Dagger" -fire_wand = "Magic Wand" -gun = "Gun" -lantern = "Lantern" -fairies = "Fairy" -coins = "Golden Coin" -prayer = "Pages 24-25 (Prayer)" -holy_cross = "Pages 42-43 (Holy Cross)" -icebolt = "Pages 52-53 (Icebolt)" -key = "Key" -house_key = "Old House Key" -vault_key = "Fortress Vault Key" -mask = "Scavenger Mask" -red_hexagon = "Red Questagon" -green_hexagon = "Green Questagon" -blue_hexagon = "Blue Questagon" -gold_hexagon = "Gold Questagon" +fuses_option = False # replace with options.shuffle_fuses when fuse shuffle is in +bells_option = False # replace with options.shuffle_bells when bell shuffle is in -def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: - return not world.options.shuffle_ladders or state.has(ladder, world.player) - - -def can_shop(state: CollectionState, world: "TunicWorld") -> bool: - return has_sword(state, world.player) and state.can_reach_region("Shop", world.player) - - -# for the ones that are not early bushes where ER can screw you over a bit -def can_get_past_bushes(state: CollectionState, world: "TunicWorld") -> bool: - # add in glass cannon + stick for grass rando - return has_sword(state, world.player) or state.has_any((fire_wand, laurels, gun), world.player) - - -def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_pairs: Dict[Portal, Portal]) -> None: +def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_pairs: dict[Portal, Portal]) -> None: player = world.player options = world.options # input scene destination tag, returns portal's name and paired portal's outlet region or region - def get_portal_info(portal_sd: str) -> Tuple[str, str]: + def get_portal_info(portal_sd: str) -> tuple[str, str]: for portal1, portal2 in portal_pairs.items(): if portal1.scene_destination() == portal_sd: return portal1.name, get_portal_outlet_region(portal2, world) @@ -61,7 +35,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ raise Exception(f"No matches found in get_portal_info for {portal_sd}") # input scene destination tag, returns paired portal's name and region - def get_paired_portal(portal_sd: str) -> Tuple[str, str]: + def get_paired_portal(portal_sd: str) -> tuple[str, str]: for portal1, portal2 in portal_pairs.items(): if portal1.scene_destination() == portal_sd: return portal2.name, portal2.region @@ -81,7 +55,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld Beach"], rule=lambda state: has_ladder("Ladders in Overworld Town", state, world) - or state.has_any({laurels, grapple}, player)) + or state.has_any((laurels, grapple), player)) # regions["Overworld Beach"].connect( # connecting_region=regions["Overworld"], # rule=lambda state: has_ladder("Ladders in Overworld Town", state, world) @@ -114,14 +88,14 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ rule=lambda state: state.has(laurels, player)) regions["Overworld to Atoll Upper"].connect( connecting_region=regions["Overworld"], - rule=lambda state: state.has_any({laurels, grapple}, player)) + rule=lambda state: state.has_any((laurels, grapple), player)) regions["Overworld"].connect( connecting_region=regions["Overworld Belltower"], rule=lambda state: state.has(laurels, player) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Belltower"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Belltower"].connect( + # connecting_region=regions["Overworld"]) # ice grapple rudeling across rubble, drop bridge, ice grapple rudeling down regions["Overworld Belltower"].connect( @@ -146,17 +120,17 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld Ruined Passage Door"], rule=lambda state: state.has(key, player, 2) or laurels_zip(state, world)) - regions["Overworld Ruined Passage Door"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: laurels_zip(state, world)) + # regions["Overworld Ruined Passage Door"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: laurels_zip(state, world)) regions["Overworld"].connect( connecting_region=regions["After Ruined Passage"], rule=lambda state: has_ladder("Ladders near Weathervane", state, world) or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - regions["After Ruined Passage"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) + # regions["After Ruined Passage"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) # for the hard ice grapple, get to the chest after the bomb wall, grab a slime, and grapple push down # you can ice grapple through the bomb wall, so no need for shop logic checking @@ -165,10 +139,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ rule=lambda state: has_ladder("Ladders near Weathervane", state, world) or state.has(laurels, player) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Above Ruined Passage"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world) - or state.has(laurels, player)) + # regions["Above Ruined Passage"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Weathervane", state, world) + # or state.has(laurels, player)) regions["After Ruined Passage"].connect( connecting_region=regions["Above Ruined Passage"], @@ -183,8 +157,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) regions["East Overworld"].connect( connecting_region=regions["Above Ruined Passage"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world) - or state.has(laurels, player)) + rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) # nmg: ice grapple the slimes, works both ways consistently regions["East Overworld"].connect( @@ -198,9 +171,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["East Overworld"], rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world) or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - regions["East Overworld"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) + # regions["East Overworld"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld at Patrol Cave"]) @@ -220,9 +193,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld above Patrol Cave"], rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world) or state.has(grapple, player)) - regions["Overworld above Patrol Cave"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) + # regions["Overworld above Patrol Cave"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld above Patrol Cave"], @@ -243,10 +216,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Upper Overworld"].connect( connecting_region=regions["Overworld above Quarry Entrance"], - rule=lambda state: state.has_any({grapple, laurels}, player)) + rule=lambda state: state.has_any((grapple, laurels), player)) regions["Overworld above Quarry Entrance"].connect( connecting_region=regions["Upper Overworld"], - rule=lambda state: state.has_any({grapple, laurels}, player)) + rule=lambda state: state.has_any((grapple, laurels), player)) # ice grapple push guard captain down the ledge regions["Upper Overworld"].connect( @@ -267,11 +240,11 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld after Envoy"], - rule=lambda state: state.has_any({laurels, grapple, gun}, player) + rule=lambda state: state.has_any((laurels, grapple, gun), player) or state.has("Sword Upgrade", player, 4)) regions["Overworld after Envoy"].connect( connecting_region=regions["Overworld"], - rule=lambda state: state.has_any({laurels, grapple, gun}, player) + rule=lambda state: state.has_any((laurels, grapple, gun), player) or state.has("Sword Upgrade", player, 4)) regions["Overworld after Envoy"].connect( @@ -285,24 +258,24 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld Quarry Entry"], rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Quarry Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + # regions["Overworld Quarry Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) regions["Overworld"].connect( connecting_region=regions["Overworld Swamp Upper Entry"], rule=lambda state: state.has(laurels, player)) - regions["Overworld Swamp Upper Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: state.has(laurels, player)) + # regions["Overworld Swamp Upper Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: state.has(laurels, player)) regions["Overworld"].connect( connecting_region=regions["Overworld Swamp Lower Entry"], rule=lambda state: has_ladder("Ladder to Swamp", state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Overworld Swamp Lower Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladder to Swamp", state, world)) + # regions["Overworld Swamp Lower Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladder to Swamp", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld Special Shop Entry"], @@ -335,33 +308,34 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld Southeast Cross Door"], rule=lambda state: has_ability(holy_cross, state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Overworld Southeast Cross Door"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ability(holy_cross, state, world)) + # regions["Overworld Southeast Cross Door"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ability(holy_cross, state, world)) regions["Overworld"].connect( connecting_region=regions["Overworld Fountain Cross Door"], rule=lambda state: has_ability(holy_cross, state, world) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Fountain Cross Door"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Fountain Cross Door"].connect( + # connecting_region=regions["Overworld"]) ow_to_town_portal = regions["Overworld"].connect( connecting_region=regions["Overworld Town Portal"], rule=lambda state: has_ability(prayer, state, world)) - regions["Overworld Town Portal"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Town Portal"].connect( + # connecting_region=regions["Overworld"]) regions["Overworld"].connect( connecting_region=regions["Overworld Spawn Portal"], rule=lambda state: has_ability(prayer, state, world)) - regions["Overworld Spawn Portal"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Spawn Portal"].connect( + # connecting_region=regions["Overworld"]) # nmg: ice grapple through temple door regions["Overworld"].connect( connecting_region=regions["Overworld Temple Door"], - rule=lambda state: state.has_all({"Ring Eastern Bell", "Ring Western Bell"}, player) + rule=lambda state: (state.has_all(("Ring Eastern Bell", "Ring Western Bell"), player) and not bells_option) + or (state.has_all(("East Bell", "West Bell"), player) and bells_option) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) regions["Overworld Temple Door"].connect( @@ -637,7 +611,8 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["West Garden by Portal"]) regions["West Garden by Portal"].connect( connecting_region=regions["West Garden Portal"], - rule=lambda state: has_ability(prayer, state, world) and state.has("Activate West Garden Fuse", player)) + rule=lambda state: has_ability(prayer, state, world) + and has_fuses("Activate West Garden Fuse", state, world)) regions["West Garden by Portal"].connect( connecting_region=regions["West Garden Portal Item"], @@ -691,12 +666,16 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ atoll_statue = regions["Ruined Atoll"].connect( connecting_region=regions["Ruined Atoll Statue"], rule=lambda state: has_ability(prayer, state, world) - and ((has_ladder("Ladders in South Atoll", state, world) - and state.has_any((laurels, grapple), player) - and (has_sword(state, player) or state.has_any((fire_wand, gun), player))) - # shoot fuse and have the shot hit you mid-LS - or (can_ladder_storage(state, world) and state.has(fire_wand, player) - and options.ladder_storage >= LadderStorage.option_hard))) + and (((((has_ladder("Ladders in South Atoll", state, world) + and state.has_any((laurels, grapple), player) + and (has_sword(state, player) or state.has_any((gun, fire_wand), player))) + # shoot fuse and have the shot hit you mid-LS + or (can_ladder_storage(state, world) and state.has(fire_wand, player) + and options.ladder_storage >= LadderStorage.option_hard))) and not fuses_option) + or (state.has_all((atoll_northwest_fuse, atoll_northeast_fuse, atoll_southwest_fuse, atoll_southeast_fuse), player) + and fuses_option)) + ) + regions["Ruined Atoll Statue"].connect( connecting_region=regions["Ruined Atoll"]) @@ -742,7 +721,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Exterior by Tree"].connect( connecting_region=regions["Library Exterior Ladder Region"], - rule=lambda state: state.has_any({grapple, laurels}, player) + rule=lambda state: state.has_any((grapple, laurels), player) and has_ladder("Ladders in Library", state, world)) regions["Library Exterior Ladder Region"].connect( connecting_region=regions["Library Exterior by Tree"], @@ -785,7 +764,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Lab Lower"].connect( connecting_region=regions["Library Lab"], - rule=lambda state: state.has_any({grapple, laurels}, player) + rule=lambda state: state.has_any((grapple, laurels), player) and has_ladder("Ladders in Library", state, world)) regions["Library Lab"].connect( connecting_region=regions["Library Lab Lower"], @@ -802,7 +781,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Lab on Portal Pad"].connect( connecting_region=regions["Library Portal"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Library Fuse", state, world)) regions["Library Portal"].connect( connecting_region=regions["Library Lab on Portal Pad"]) @@ -823,10 +802,14 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Fortress Exterior near cave"].connect( connecting_region=regions["Fortress Exterior from Overworld"], - rule=lambda state: state.has(laurels, player)) + rule=lambda state: state.has(laurels, player) + or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) + and fuses_option)) regions["Fortress Exterior from Overworld"].connect( connecting_region=regions["Fortress Exterior near cave"], - rule=lambda state: state.has(laurels, player) or has_ability(prayer, state, world)) + rule=lambda state: state.has(laurels, player) + or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) + if fuses_option else has_ability(prayer, state, world))) # shoot far fire pot, enemy gets aggro'd regions["Fortress Exterior near cave"].connect( @@ -889,12 +872,15 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Eastern Vault Fortress"].connect( connecting_region=regions["Eastern Vault Fortress Gold Door"], - rule=lambda state: state.has_all({"Activate Eastern Vault West Fuses", - "Activate Eastern Vault East Fuse"}, player) + rule=lambda state: (has_fuses("Activate Eastern Vault West Fuses", state, world) + and has_fuses("Activate Eastern Vault East Fuse", state, world)) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) regions["Eastern Vault Fortress Gold Door"].connect( connecting_region=regions["Eastern Vault Fortress"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) + or (has_fuses("Activate Eastern Vault West Fuses", state, world) + and has_fuses("Activate Eastern Vault East Fuse", state, world) + and fuses_option)) fort_grave_entry_to_combat = regions["Fortress Grave Path Entry"].connect( connecting_region=regions["Fortress Grave Path Combat"]) @@ -925,7 +911,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Fortress Arena"].connect( connecting_region=regions["Fortress Arena Portal"], - rule=lambda state: state.has("Activate Eastern Vault West Fuses", player)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Eastern Vault West Fuses", state, world)) regions["Fortress Arena Portal"].connect( connecting_region=regions["Fortress Arena"]) @@ -939,7 +925,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Quarry Entry"].connect( connecting_region=regions["Quarry Portal"], - rule=lambda state: state.has("Activate Quarry Fuse", player)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Quarry Fuse", state, world)) regions["Quarry Portal"].connect( connecting_region=regions["Quarry Entry"]) @@ -990,7 +976,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Even Lower Quarry Isolated Chest"].connect( connecting_region=regions["Lower Quarry Zig Door"], - rule=lambda state: state.has("Activate Quarry Fuse", player) + rule=lambda state: has_fuses("Activate Quarry Fuse", state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) # don't need the mask for this either, please don't complain about not needing a mask here, you know what you did @@ -1037,21 +1023,26 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ zig_low_mid_to_front = regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( connecting_region=regions["Rooted Ziggurat Lower Front"]) - zig_low_mid_to_back = regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( - connecting_region=regions["Rooted Ziggurat Lower Back"], - rule=lambda state: state.has(laurels, player) - or (has_sword(state, player) and has_ability(prayer, state, world))) - # can ice grapple to the voidlings to get to the double admin fight, still need to pray at the fuse - zig_low_back_to_mid = regions["Rooted Ziggurat Lower Back"].connect( + regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( + connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"]) + zig_low_miniboss_to_mid = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( connecting_region=regions["Rooted Ziggurat Lower Mid Checkpoint"], - rule=lambda state: (state.has(laurels, player) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - and has_ability(prayer, state, world) - and has_sword(state, player)) + rule=lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + else (has_sword(state, player) and has_ability(prayer, state, world))) + # can ice grapple to the voidlings to get to the double admin fight, still need to pray at the fuse + zig_low_miniboss_to_back = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( + connecting_region=regions["Rooted Ziggurat Lower Back"], + rule=lambda state: state.has(laurels, player) or (state.has(ziggurat_miniboss_fuse, player) and fuses_option) + or (has_sword(state, player) and has_ability(prayer, state, world) and not fuses_option)) + regions["Rooted Ziggurat Lower Back"].connect( + connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"], + rule=lambda state: state.has(laurels, player) + or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) + or (state.has(ziggurat_miniboss_fuse, player) and fuses_option)) regions["Rooted Ziggurat Lower Back"].connect( connecting_region=regions["Rooted Ziggurat Portal Room Entrance"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world)) regions["Rooted Ziggurat Portal Room Entrance"].connect( connecting_region=regions["Rooted Ziggurat Lower Back"]) @@ -1059,11 +1050,11 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Rooted Ziggurat Portal Room"]) regions["Rooted Ziggurat Portal Room"].connect( connecting_region=regions["Rooted Ziggurat Portal"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world) and has_ability(prayer, state, world)) regions["Rooted Ziggurat Portal Room"].connect( connecting_region=regions["Rooted Ziggurat Portal Room Exit"], - rule=lambda state: state.has("Activate Ziggurat Fuse", player)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world)) regions["Rooted Ziggurat Portal Room Exit"].connect( connecting_region=regions["Rooted Ziggurat Portal Room"]) @@ -1082,19 +1073,21 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ swamp_mid_to_cath = regions["Swamp Mid"].connect( connecting_region=regions["Swamp to Cathedral Main Entrance Region"], rule=lambda state: (has_ability(prayer, state, world) - and (has_sword(state, player)) + and has_sword(state, player) and (state.has(laurels, player) # blam yourself in the face with a wand shot off the fuse or (can_ladder_storage(state, world) and state.has(fire_wand, player) and options.ladder_storage >= LadderStorage.option_hard and (not options.shuffle_ladders - or state.has_any({"Ladders in Overworld Town", + or state.has_any(("Ladders in Overworld Town", "Ladder to Swamp", - "Ladders near Weathervane"}, player) + "Ladders near Weathervane"), player) or (state.has("Ladder to Ruined Atoll", player) and state.can_reach_region("Overworld Beach", player))))) and (not options.combat_logic - or has_combat_reqs("Swamp", state, player))) + or has_combat_reqs("Swamp", state, player)) + and not fuses_option) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and fuses_option) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) if options.ladder_storage >= LadderStorage.option_hard and options.shuffle_ladders: @@ -1102,7 +1095,8 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Swamp to Cathedral Main Entrance Region"].connect( connecting_region=regions["Swamp Mid"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and fuses_option)) # grapple push the enemy by the door down, then grapple to it. Really jank regions["Swamp Mid"].connect( @@ -1148,7 +1142,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ cath_entry_to_elev = regions["Cathedral Entry"].connect( connecting_region=regions["Cathedral to Gauntlet"], - rule=lambda state: (has_ability(prayer, state, world) + rule=lambda state: ((state.has(cathedral_elevator_fuse, player) if fuses_option else has_ability(prayer, state, world)) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) or options.entrance_rando) # elevator is always there in ER regions["Cathedral to Gauntlet"].connect( @@ -1159,11 +1153,6 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Cathedral Main"].connect( connecting_region=regions["Cathedral Entry"]) - cath_elev_to_main = regions["Cathedral to Gauntlet"].connect( - connecting_region=regions["Cathedral Main"]) - regions["Cathedral Main"].connect( - connecting_region=regions["Cathedral to Gauntlet"]) - regions["Cathedral Gauntlet Checkpoint"].connect( connecting_region=regions["Cathedral Gauntlet"]) @@ -1191,25 +1180,25 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Far Shore"].connect( connecting_region=regions["Far Shore to West Garden Region"], - rule=lambda state: state.has("Activate West Garden Fuse", player)) + rule=lambda state: has_fuses("Activate West Garden Fuse", state, world)) regions["Far Shore to West Garden Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Quarry Region"], - rule=lambda state: state.has("Activate Quarry Fuse", player)) + rule=lambda state: has_fuses("Activate Quarry Fuse", state, world)) regions["Far Shore to Quarry Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Fortress Region"], - rule=lambda state: state.has("Activate Eastern Vault West Fuses", player)) + rule=lambda state: has_fuses("Activate Eastern Vault West Fuses", state, world)) regions["Far Shore to Fortress Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Library Region"], - rule=lambda state: state.has("Activate Library Fuse", player)) + rule=lambda state: has_fuses("Activate Library Fuse", state, world)) regions["Far Shore to Library Region"].connect( connecting_region=regions["Far Shore"]) @@ -1239,7 +1228,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ non_ow_ls_list.extend(hard_ls) # create the ls elevation regions - ladder_regions: Dict[str, Region] = {} + ladder_regions: dict[str, Region] = {} for name in ow_ladder_groups.keys(): ladder_regions[name] = Region(name, player, world.multiworld) @@ -1409,10 +1398,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ lambda state: has_combat_reqs("Dark Tomb", state, player)) set_rule(wg_before_to_after_terry, - lambda state: state.has_any({laurels, ice_dagger}, player) + lambda state: state.has_any((laurels, ice_dagger), player) or has_combat_reqs("West Garden", state, player)) set_rule(wg_after_to_before_terry, - lambda state: state.has_any({laurels, ice_dagger}, player) + lambda state: state.has_any((laurels, ice_dagger), player) or has_combat_reqs("West Garden", state, player)) set_rule(wg_after_terry_to_west_combat, @@ -1453,25 +1442,23 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ lambda state: has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(zig_low_mid_to_front, lambda state: has_combat_reqs("Rooted Ziggurat", state, player)) - set_rule(zig_low_mid_to_back, + set_rule(zig_low_miniboss_to_back, lambda state: state.has(laurels, player) - or (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) - set_rule(zig_low_back_to_mid, - lambda state: (state.has(laurels, player) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - and has_ability(prayer, state, world) - and has_combat_reqs("Rooted Ziggurat", state, player)) + or (state.has(ziggurat_miniboss_fuse, player) if fuses_option + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)))) + set_rule(zig_low_miniboss_to_mid, + lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) # only activating the fuse requires combat logic set_rule(cath_entry_to_elev, lambda state: options.entrance_rando or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player))) + or (state.has(cathedral_elevator_fuse, player) if fuses_option + else (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player)))) set_rule(cath_entry_to_main, lambda state: has_combat_reqs("Swamp", state, player)) - set_rule(cath_elev_to_main, - lambda state: has_combat_reqs("Swamp", state, player)) # for spots where you can go into and come out of an entrance to reset enemy aggro if world.options.entrance_rando: @@ -1543,10 +1530,17 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ def set_er_location_rules(world: "TunicWorld") -> None: player = world.player + options = world.options - if world.options.grass_randomizer: + if options.grass_randomizer: set_grass_location_rules(world) + # if options.shuffle_fuses: + # set_fuse_location_rules(world) + # + # if options.shuffle_bells: + # set_bell_location_rules(world) + forbid_item(world.get_location("Secret Gathering Place - 20 Fairy Reward"), fairies, player) # Ability Shuffle Exclusive Rules @@ -1557,7 +1551,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("East Forest - Golden Obelisk Holy Cross"), lambda state: has_ability(holy_cross, state, world)) set_rule(world.get_location("Beneath the Well - [Powered Secret Room] Chest"), - lambda state: state.has("Activate Furnace Fuse", player)) + lambda state: has_fuses("Activate Furnace Fuse", state, world)) set_rule(world.get_location("West Garden - [North] Behind Holy Cross Door"), lambda state: has_ability(holy_cross, state, world)) set_rule(world.get_location("Library Hall - Holy Cross Chest"), @@ -1583,9 +1577,9 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Overworld set_rule(world.get_location("Overworld - [Southwest] Grapple Chest Over Walkway"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Overworld - [Southwest] West Beach Guarded By Turret 2"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Overworld - [Southwest] From West Garden"), lambda state: state.has(laurels, player)) set_rule(world.get_location("Overworld - [Southeast] Page on Pillar by Swamp"), @@ -1635,9 +1629,9 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("East Forest - Lower Grapple Chest"), lambda state: state.has(grapple, player)) set_rule(world.get_location("East Forest - Lower Dash Chest"), - lambda state: state.has_all({grapple, laurels}, player)) + lambda state: state.has_all((grapple, laurels), player)) set_rule(world.get_location("East Forest - Ice Rod Grapple Chest"), lambda state: ( - state.has_all({grapple, ice_dagger, fire_wand}, player) and has_ability(icebolt, state, world))) + state.has_all((grapple, ice_dagger, fire_wand), player) and has_ability(icebolt, state, world))) # Dark Tomb # added to make combat logic smoother @@ -1669,11 +1663,11 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Frog's Domain set_rule(world.get_location("Frog's Domain - Side Room Grapple Secret"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Frog's Domain - Grapple Above Hot Tub"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Frog's Domain - Escape Chest"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) # Library Lab set_rule(world.get_location("Library Lab - Page 1"), @@ -1695,7 +1689,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Beneath the Vault set_rule(world.get_location("Beneath the Fortress - Bridge"), lambda state: has_lantern(state, world) and - (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) + (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) # Quarry set_rule(world.get_location("Quarry - [Central] Above Ladder Dash Chest"), @@ -1706,9 +1700,10 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("Rooted Ziggurat Upper - Near Bridge Switch"), lambda state: has_sword(state, player) or (state.has(fire_wand, player) and (state.has(laurels, player) - or world.options.entrance_rando))) + or options.entrance_rando))) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: has_sword(state, player) and has_ability(prayer, state, world)) + lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + else has_sword(state, player) and has_ability(prayer, state, world)) # Bosses set_rule(world.get_location("Fortress Arena - Siege Engine/Vault Key Pickup"), @@ -1750,34 +1745,36 @@ def set_er_location_rules(world: "TunicWorld") -> None: lambda state: state.has(laurels, player)) # Events - set_rule(world.get_location("Eastern Bell"), - lambda state: (has_melee(state, player) or state.has(fire_wand, player))) - set_rule(world.get_location("Western Bell"), - lambda state: (has_melee(state, player) or state.has(fire_wand, player))) - set_rule(world.get_location("Furnace Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("South and West Fortress Exterior Fuses"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Upper and Central Fortress Exterior Fuses"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Beneath the Vault Fuse"), - lambda state: state.has("Activate South and West Fortress Exterior Fuses", player)) - set_rule(world.get_location("Eastern Vault West Fuses"), - lambda state: state.has("Activate Beneath the Vault Fuse", player)) - set_rule(world.get_location("Eastern Vault East Fuse"), - lambda state: state.has_all({"Activate Upper and Central Fortress Exterior Fuses", - "Activate South and West Fortress Exterior Fuses"}, player)) - set_rule(world.get_location("Quarry Connector Fuse"), - lambda state: has_ability(prayer, state, world) and state.has(grapple, player)) - set_rule(world.get_location("Quarry Fuse"), - lambda state: state.has("Activate Quarry Connector Fuse", player)) - set_rule(world.get_location("Ziggurat Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("West Garden Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Library Fuse"), - lambda state: has_ability(prayer, state, world) and has_ladder("Ladders in Library", state, world)) - if not world.options.hexagon_quest: + if not bells_option: + set_rule(world.get_location("Eastern Bell"), + lambda state: (has_melee(state, player) or state.has(fire_wand, player))) + set_rule(world.get_location("Western Bell"), + lambda state: (has_melee(state, player) or state.has(fire_wand, player))) + if not fuses_option: + set_rule(world.get_location("Furnace Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("South and West Fortress Exterior Fuses"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Upper and Central Fortress Exterior Fuses"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Beneath the Vault Fuse"), + lambda state: state.has("Activate South and West Fortress Exterior Fuses", player)) + set_rule(world.get_location("Eastern Vault West Fuses"), + lambda state: state.has("Activate Beneath the Vault Fuse", player)) + set_rule(world.get_location("Eastern Vault East Fuse"), + lambda state: state.has_all(("Activate Upper and Central Fortress Exterior Fuses", + "Activate South and West Fortress Exterior Fuses"), player)) + set_rule(world.get_location("Quarry Connector Fuse"), + lambda state: has_ability(prayer, state, world) and state.has(grapple, player)) + set_rule(world.get_location("Quarry Fuse"), + lambda state: state.has("Activate Quarry Connector Fuse", player)) + set_rule(world.get_location("Ziggurat Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Garden Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Library Fuse"), + lambda state: has_ability(prayer, state, world) and has_ladder("Ladders in Library", state, world)) + if not options.hexagon_quest: set_rule(world.get_location("Place Questagons"), lambda state: state.has_all((red_hexagon, blue_hexagon, green_hexagon), player)) @@ -1868,7 +1865,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: # laurels past the enemies, then use the wand or gun to take care of the fairies that chased you add_rule(world.get_location("West Garden - [West Lowlands] Tree Holy Cross Chest"), - lambda state: state.has_any({fire_wand, "Gun"}, player)) + lambda state: state.has_any((fire_wand, gun), player)) combat_logic_to_loc("West Garden - [Central Lowlands] Chest Beneath Faeries", "West Garden") combat_logic_to_loc("West Garden - [Central Lowlands] Chest Beneath Save Point", "West Garden") combat_logic_to_loc("West Garden - [West Highlands] Upper Left Walkway", "West Garden") @@ -1880,13 +1877,14 @@ def set_er_location_rules(world: "TunicWorld") -> None: # could just do the last two, but this outputs better in the spoiler log # dagger is maybe viable here, but it's sketchy -- activate ladder switch, save to reset enemies, climb up - combat_logic_to_loc("Upper and Central Fortress Exterior Fuses", "Eastern Vault Fortress") - combat_logic_to_loc("Beneath the Vault Fuse", "Beneath the Vault") - combat_logic_to_loc("Eastern Vault West Fuses", "Eastern Vault Fortress") + if not fuses_option: + combat_logic_to_loc("Upper and Central Fortress Exterior Fuses", "Eastern Vault Fortress") + combat_logic_to_loc("Beneath the Vault Fuse", "Beneath the Vault") + combat_logic_to_loc("Eastern Vault West Fuses", "Eastern Vault Fortress") # if you come in from the left, you only need to fight small crabs add_rule(world.get_location("Ruined Atoll - [South] Near Birds"), - lambda state: has_melee(state, player) or state.has_any({laurels, "Gun"}, player)) + lambda state: has_melee(state, player) or state.has_any((laurels, gun), player)) # can get this one without fighting if you have laurels add_rule(world.get_location("Frog's Domain - Above Vault"), @@ -1898,8 +1896,21 @@ def set_er_location_rules(world: "TunicWorld") -> None: and (state.has(laurels, player) or world.options.entrance_rando)) or has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: has_ability(prayer, state, world) - and has_combat_reqs("Rooted Ziggurat", state, player)) + lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) + + if fuses_option: + set_rule(world.get_location("Rooted Ziggurat Lower - [Miniboss] Activate Fuse"), + lambda state: has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)) + combat_logic_to_loc("Beneath the Fortress - Activate Fuse", "Beneath the Vault") + combat_logic_to_loc("Fortress Courtyard - [Upper] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Fortress Courtyard - [Central] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Candle Room] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Left of Door] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Right of Door] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Ruined Atoll - [Northwest] Activate Fuse", "Ruined Atoll") + combat_logic_to_loc("Ruined Atoll - [Southwest] Activate Fuse", "Ruined Atoll") + combat_logic_to_loc("Swamp - [Central] Activate Fuse", "Swamp") # replace the sword rule with this one combat_logic_to_loc("Swamp - [South Graveyard] 4 Orange Skulls", "Swamp", set_instead=True) diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index 9fc44d84..81fb90d8 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -1,14 +1,16 @@ -from typing import Dict, List, Set, Tuple, TYPE_CHECKING +from copy import deepcopy +from random import Random +from typing import TYPE_CHECKING + from BaseClasses import Region, ItemClassification, Item, Location -from .locations import all_locations +from Options import PlandoConnection + +from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules from .er_data import (Portal, portal_mapping, traversal_requirements, DeadEnd, Direction, RegionInfo, get_portal_outlet_region) from .er_rules import set_er_region_rules -from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules -from Options import PlandoConnection +from .locations import all_locations from .options import EntranceRando, EntranceLayout -from random import Random -from copy import deepcopy if TYPE_CHECKING: from . import TunicWorld @@ -22,8 +24,8 @@ class TunicERLocation(Location): game: str = "TUNIC" -def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: - regions: Dict[str, Region] = {} +def create_er_regions(world: "TunicWorld") -> dict[Portal, Portal]: + regions: dict[str, Region] = {} world.used_shop_numbers = set() for region_name, region_data in world.er_regions.items(): @@ -83,7 +85,7 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: # keys are event names, values are event regions -tunic_events: Dict[str, str] = { +tunic_events: dict[str, str] = { "Eastern Bell": "Forest Belltower Upper", "Western Bell": "Overworld Belltower at Bell", "Furnace Fuse": "Furnace Fuse", @@ -101,7 +103,7 @@ tunic_events: Dict[str, str] = { } -def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: +def place_event_items(world: "TunicWorld", regions: dict[str, Region]) -> None: for event_name, region_name in tunic_events.items(): region = regions[region_name] location = TunicERLocation(world.player, event_name, None, region) @@ -111,9 +113,13 @@ def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: location.place_locked_item( TunicERItem("Unseal the Heir", ItemClassification.progression, None, world.player)) elif event_name.endswith("Bell"): + # if world.options.shuffle_bells: + # continue location.place_locked_item( TunicERItem("Ring " + event_name, ItemClassification.progression, None, world.player)) - else: + elif event_name.endswith("Fuse") or event_name.endswith("Fuses"): + # if world.options.shuffle_fuses: + # continue location.place_locked_item( TunicERItem("Activate " + event_name, ItemClassification.progression, None, world.player)) region.locations.append(location) @@ -135,7 +141,7 @@ def get_shop_num(world: "TunicWorld") -> int: # all shops are the same shop. however, you cannot get to all shops from the same shop entrance. # so, we need a bunch of shop regions that connect to the actual shop, but the actual shop cannot connect back -def create_shop_region(world: "TunicWorld", regions: Dict[str, Region], portal_num) -> None: +def create_shop_region(world: "TunicWorld", regions: dict[str, Region], portal_num) -> None: new_shop_name = f"Shop {portal_num}" world.er_regions[new_shop_name] = RegionInfo("Shop", dead_end=DeadEnd.all_cats) new_shop_region = Region(new_shop_name, world.player, world.multiworld) @@ -144,8 +150,8 @@ def create_shop_region(world: "TunicWorld", regions: Dict[str, Region], portal_n # for non-ER that uses the ER rules, we create a vanilla set of portal pairs -def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: - portal_pairs: Dict[Portal, Portal] = {} +def vanilla_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal, Portal]: + portal_pairs: dict[Portal, Portal] = {} # we don't want the zig skip exit for vanilla portals, since it shouldn't be considered for logic here portal_map = [portal for portal in portal_mapping if portal.name not in ["Ziggurat Lower Falling Entrance", "Purgatory Bottom Exit", "Purgatory Top Exit"]] @@ -182,10 +188,10 @@ def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Por # repeat this phase until all regions are reachable # second phase: randomly pair dead ends to random two_plus # third phase: randomly pair the remaining two_plus to each other -def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: - portal_pairs: Dict[Portal, Portal] = {} - dead_ends: List[Portal] = [] - two_plus: List[Portal] = [] +def pair_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal, Portal]: + portal_pairs: dict[Portal, Portal] = {} + dead_ends: list[Portal] = [] + two_plus: list[Portal] = [] player_name = world.player_name portal_map = portal_mapping.copy() laurels_zips = world.options.laurels_zips.value @@ -194,6 +200,10 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal entrance_layout = world.options.entrance_layout laurels_location = world.options.laurels_location decoupled = world.options.decoupled + # shuffle_fuses = bool(world.options.shuffle_fuses.value) + # shuffle_bells = bool(world.options.shuffle_bells.value) + shuffle_fuses = False + shuffle_bells = False traversal_reqs = deepcopy(traversal_requirements) has_laurels = True waterfall_plando = False @@ -207,7 +217,7 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal entrance_layout = seed_group["entrance_layout"] laurels_location = "10_fairies" if seed_group["laurels_at_10_fairies"] is True else False - logic_tricks: Tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) + logic_tricks: tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) # marking that you don't immediately have laurels if laurels_location == "10_fairies" and not world.using_ut: @@ -215,8 +225,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # for the direction pairs option with decoupled off # tracks how many portals are in each direction in each list - two_plus_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} - dead_end_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} + two_plus_direction_tracker: dict[int, int] = {direction: 0 for direction in range(8)} + dead_end_direction_tracker: dict[int, int] = {direction: 0 for direction in range(8)} # for ensuring we have enough entrances in directions left that we don't leave dead ends without any def too_few_portals_for_direction_pairs(direction: int, offset: int) -> bool: @@ -226,10 +236,6 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal return False return True - # If using Universal Tracker, restore portal_map. Could be cleaner, but it does not matter for UT even a little bit - if world.using_ut: - portal_map = portal_mapping.copy() - # create separate lists for dead ends and non-dead ends for portal in portal_map: dead_end_status = world.er_regions[portal.region].dead_end @@ -291,11 +297,12 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal dead_ends.append(shop_portal) dead_end_direction_tracker[shop_portal.direction] += 1 - connected_regions: Set[str] = set() + connected_regions: set[str] = set() # make better start region stuff when/if implementing random start start_region = "Overworld" connected_regions.add(start_region) - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) if world.options.entrance_rando.value in EntranceRando.options.values(): plando_connections = world.options.plando_connections.value @@ -371,8 +378,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal else: modified_plando_connections = plando_connections - connected_shop_portal1s: Set[int] = set() - connected_shop_portal2s: Set[int] = set() + connected_shop_portal1s: set[int] = set() + connected_shop_portal2s: set[int] = set() for connection in modified_plando_connections: p_entrance = connection.entrance p_exit = connection.exit @@ -419,7 +426,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal break else: if p_entrance.startswith("Shop Portal "): - portal_num = int(p_entrance.split("Shop Portal ")[-1]) + try: + portal_num = int(p_entrance.split("Shop Portal ")[-1]) + except ValueError: + if "Previous Region" in p_entrance: + raise Exception("TUNIC: APWorld used for generation is incompatible with newer APWorld. " + "Please use the APWorld from Archipelago 0.6.1 instead.") + else: + raise Exception("TUNIC: Unknown error occurred in UT entrance setup, please contact " + "the TUNIC APWorld devs.") # shops 1-6 are south, 7 and 8 are east, and after that it just breaks direction pairs if portal_num <= 6: pdir = Direction.south @@ -452,7 +467,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal else: if not portal2: if p_exit.startswith("Shop Portal "): - portal_num = int(p_exit.split("Shop Portal ")[-1]) + try: + portal_num = int(p_exit.split("Shop Portal ")[-1]) + except ValueError: + if "Previous Region" in p_exit: + raise Exception("TUNIC: APWorld used for generation is incompatible with newer APWorld. " + "Please use the APWorld from Archipelago 0.6.1 instead.") + else: + raise Exception("TUNIC: Unknown error occurred in UT entrance setup, please contact " + "the TUNIC APWorld devs.") if portal_num <= 6: pdir = Direction.south elif portal_num in [7, 8]: @@ -510,13 +533,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal dead_end_direction_tracker[portal1.direction] -= 1 else: two_plus_direction_tracker[portal1.direction] -= 1 + if portal2_dead_end: dead_end_direction_tracker[portal2.direction] -= 1 else: two_plus_direction_tracker[portal2.direction] -= 1 # if we have plando connections, our connected regions may change somewhat - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) # if there are an odd number of shops after plando, add another one, except in decoupled where it doesn't matter if not decoupled and len(world.used_shop_numbers) % 2 == 1: @@ -599,7 +624,6 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal connected_regions = backup_connected_regions.copy() rare_failure_count += 1 fail_count = 0 - if rare_failure_count > 100: raise Exception(f"Failed to pair regions due to rare pairing issues for {player_name}. " f"Unconnected regions: {non_dead_end_regions - connected_regions}.\n" @@ -633,7 +657,9 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal if waterfall_plando: cr = connected_regions.copy() cr.add(portal.region) - if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, logic_tricks): + if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, + logic_tricks, shuffle_fuses, + shuffle_bells): continue # if not waterfall_plando, then we just want to pair secret gathering place now elif portal.region != "Secret Gathering Place": @@ -682,8 +708,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # once we have both portals, connect them and add the new region(s) to connected_regions if not has_laurels and "Secret Gathering Place" in connected_regions: has_laurels = True - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) - + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) portal_pairs[portal1] = portal2 two_plus_direction_tracker[portal1.direction] -= 1 two_plus_direction_tracker[portal2.direction] -= 1 @@ -745,7 +771,7 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # loop through our list of paired portals and make two-way connections -def create_randomized_entrances(world: "TunicWorld", portal_pairs: Dict[Portal, Portal], regions: Dict[str, Region]) -> None: +def create_randomized_entrances(world: "TunicWorld", portal_pairs: dict[Portal, Portal], regions: dict[str, Region]) -> None: for portal1, portal2 in portal_pairs.items(): # connect to the outlet region if there is one, if not connect to the actual region regions[portal1.region].connect( @@ -757,8 +783,9 @@ def create_randomized_entrances(world: "TunicWorld", portal_pairs: Dict[Portal, name=portal2.name) -def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[str, Dict[str, List[List[str]]]], - has_laurels: bool, logic: Tuple[bool, int, int]) -> Set[str]: +def update_reachable_regions(connected_regions: set[str], traversal_reqs: dict[str, dict[str, list[list[str]]]], + has_laurels: bool, logic: tuple[bool, int, int], shuffle_fuses: bool, + shuffle_bells: bool) -> set[str]: zips, ice_grapples, ls = logic # starting count, so we can run it again if this changes region_count = len(connected_regions) @@ -790,6 +817,12 @@ def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[s break elif req not in connected_regions: break + elif req == "Fuse Shuffle": + if not shuffle_fuses: + break + elif req == "Bell Shuffle": + if not shuffle_bells: + break else: met_traversal_reqs = True break @@ -798,13 +831,14 @@ def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[s # if the length of connected_regions changed, we got new regions, so we want to check those new origins if region_count != len(connected_regions): - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic, + shuffle_fuses, shuffle_bells) return connected_regions # which directions are opposites -direction_pairs: Dict[int, int] = { +direction_pairs: dict[int, int] = { Direction.north: Direction.south, Direction.south: Direction.north, Direction.east: Direction.west, @@ -848,9 +882,9 @@ def verify_plando_directions(connection: PlandoConnection) -> bool: # sort the portal dict by the name of the first portal, referring to the portal order in the master portal list -def sort_portals(portal_pairs: Dict[Portal, Portal], world: "TunicWorld") -> Dict[str, str]: - sorted_pairs: Dict[str, str] = {} - reference_list: List[str] = [portal.name for portal in portal_mapping] +def sort_portals(portal_pairs: dict[Portal, Portal], world: "TunicWorld") -> dict[str, str]: + sorted_pairs: dict[str, str] = {} + reference_list: list[str] = [portal.name for portal in portal_mapping] # due to plando, there can be a variable number of shops largest_shop_number = max(world.used_shop_numbers) diff --git a/worlds/tunic/fuses.py b/worlds/tunic/fuses.py new file mode 100644 index 00000000..4f223582 --- /dev/null +++ b/worlds/tunic/fuses.py @@ -0,0 +1,30 @@ +from .constants import * + +# for fuse locations and reusing event names to simplify er_rules +fuse_activation_reqs: dict[str, list[str]] = { + swamp_fuse_2: [swamp_fuse_1], + swamp_fuse_3: [swamp_fuse_1, swamp_fuse_2], + fortress_exterior_fuse_2: [fortress_exterior_fuse_1], + beneath_the_vault_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + fortress_candles_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + fortress_door_left_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse], + fortress_courtyard_upper_fuse: [fortress_exterior_fuse_1], + fortress_courtyard_lower_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse], + fortress_door_right_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, fortress_courtyard_lower_fuse], + quarry_fuse_2: [quarry_fuse_1], + "Activate Furnace Fuse": [west_furnace_fuse], + "Activate South and West Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + "Activate Upper and Central Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse], + "Activate Beneath the Vault Fuse": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + "Activate Eastern Vault West Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse, fortress_door_left_fuse], + "Activate Eastern Vault East Fuse": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse, fortress_door_right_fuse], + "Activate Quarry Connector Fuse": [quarry_fuse_1], + "Activate Quarry Fuse": [quarry_fuse_1, quarry_fuse_2], + "Activate Ziggurat Fuse": [ziggurat_teleporter_fuse], + "Activate West Garden Fuse": [west_garden_fuse], + "Activate Library Fuse": [library_lab_fuse], +} diff --git a/worlds/tunic/grass.py b/worlds/tunic/grass.py index 971ac4c0..f2aea40f 100644 --- a/worlds/tunic/grass.py +++ b/worlds/tunic/grass.py @@ -1,8 +1,11 @@ -from typing import Dict, NamedTuple, Optional, TYPE_CHECKING, Set +from typing import NamedTuple, TYPE_CHECKING from BaseClasses import CollectionState from worlds.generic.Rules import set_rule, add_rule -from .rules import has_sword, has_melee + +from .constants import base_id +from .logic_helpers import has_sword, has_melee + if TYPE_CHECKING: from . import TunicWorld @@ -10,12 +13,12 @@ if TYPE_CHECKING: class TunicLocationData(NamedTuple): region: str er_region: str # entrance rando region - location_group: Optional[str] = None + location_group: str | None = None -location_base_id = 509342400 - -grass_location_table: Dict[str, TunicLocationData] = { +# todo: remove region, make all of these regions append grass to the name +# and then set the rules on the region entrances instead of the locations directly +grass_location_table: dict[str, TunicLocationData] = { "Overworld - Overworld Grass (576) (7.0, 4.0, -223.0)": TunicLocationData("Overworld", "Overworld"), "Overworld - Overworld Grass (572) (6.0, 4.0, -223.0)": TunicLocationData("Overworld", "Overworld"), "Overworld - Overworld Grass (574) (7.0, 4.0, -224.0)": TunicLocationData("Overworld", "Overworld"), @@ -7763,9 +7766,10 @@ excluded_grass_locations = { "Overworld - East Overworld Bush (64) (56.0, 44.0, -107.0)", } -grass_location_name_to_id: Dict[str, int] = {name: location_base_id + 302 + index for index, name in enumerate(grass_location_table)} +grass_base_id = base_id + 302 +grass_location_name_to_id: dict[str, int] = {name: grass_base_id + index for index, name in enumerate(grass_location_table)} -grass_location_name_groups: Dict[str, Set[str]] = {} +grass_location_name_groups: dict[str, set[str]] = {} for loc_name, loc_data in grass_location_table.items(): area_name = loc_name.split(" - ", 1)[0] # adding it to the normal location group and a grass-only one diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index a2b4140a..fe1e33e9 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -1,7 +1,10 @@ from itertools import groupby -from typing import Dict, List, Set, NamedTuple, Optional +from typing import NamedTuple + from BaseClasses import ItemClassification as IC +from .constants import base_id + class TunicItemData(NamedTuple): classification: IC @@ -9,12 +12,10 @@ class TunicItemData(NamedTuple): item_id_offset: int item_group: str = "" # classification if combat logic is on - combat_ic: Optional[IC] = None + combat_ic: None | IC = None -item_base_id = 509342400 - -item_table: Dict[str, TunicItemData] = { +item_table: dict[str, TunicItemData] = { "Firecracker x2": TunicItemData(IC.filler, 3, 0, "Bombs"), "Firecracker x3": TunicItemData(IC.filler, 3, 1, "Bombs"), "Firecracker x4": TunicItemData(IC.filler, 3, 2, "Bombs"), @@ -175,7 +176,7 @@ item_table: Dict[str, TunicItemData] = { } # items to be replaced by fool traps -fool_tiers: List[List[str]] = [ +fool_tiers: list[list[str]] = [ [], ["Money x1", "Money x10", "Money x15", "Money x16"], ["Money x1", "Money x10", "Money x15", "Money x16", "Money x20"], @@ -214,25 +215,25 @@ slot_data_item_names = [ "Gold Questagon", ] -combat_items: List[str] = [name for name, data in item_table.items() +combat_items: list[str] = [name for name, data in item_table.items() if data.combat_ic and IC.progression in data.combat_ic] combat_items.extend(["Stick", "Sword", "Sword Upgrade", "Magic Wand", "Hero's Laurels", "Gun"]) -item_name_to_id: Dict[str, int] = {name: item_base_id + data.item_id_offset for name, data in item_table.items()} +item_name_to_id: dict[str, int] = {name: base_id + data.item_id_offset for name, data in item_table.items()} -filler_items: List[str] = [name for name, data in item_table.items() if data.classification == IC.filler and name != "Grass"] +filler_items: list[str] = [name for name, data in item_table.items() if data.classification == IC.filler and name != "Grass"] def get_item_group(item_name: str) -> str: return item_table[item_name].item_group -item_name_groups: Dict[str, Set[str]] = { +item_name_groups: dict[str, set[str]] = { group: set(item_names) for group, item_names in groupby(sorted(item_table, key=get_item_group), get_item_group) if group != "" } # extra groups for the purpose of aliasing items -extra_groups: Dict[str, Set[str]] = { +extra_groups: dict[str, set[str]] = { "Laurels": {"Hero's Laurels"}, "Orb": {"Magic Orb"}, "Dagger": {"Magic Dagger"}, diff --git a/worlds/tunic/ladder_storage_data.py b/worlds/tunic/ladder_storage_data.py index f2d4b944..99a51b40 100644 --- a/worlds/tunic/ladder_storage_data.py +++ b/worlds/tunic/ladder_storage_data.py @@ -1,15 +1,15 @@ -from typing import Dict, List, Set, NamedTuple, Optional +from typing import NamedTuple # ladders in overworld, since it is the most complex area for ladder storage class OWLadderInfo(NamedTuple): - ladders: Set[str] # ladders where the top or bottom is at the same elevation - portals: List[str] # portals at the same elevation, only those without doors - regions: List[str] # regions where a melee enemy can hit you out of ladder storage + ladders: set[str] # ladders where the top or bottom is at the same elevation + portals: list[str] # portals at the same elevation, only those without doors + regions: list[str] # regions where a melee enemy can hit you out of ladder storage # groups for ladders at the same elevation, for use in determing whether you can ls to entrances in diff rulesets -ow_ladder_groups: Dict[str, OWLadderInfo] = { +ow_ladder_groups: dict[str, OWLadderInfo] = { # lowest elevation "LS Elev 0": OWLadderInfo({"Ladders in Overworld Town", "Ladder to Ruined Atoll", "Ladder to Swamp"}, ["Swamp Redux 2_conduit", "Overworld Cave_", "Atoll Redux_lower", "Maze Room_", @@ -49,7 +49,7 @@ ow_ladder_groups: Dict[str, OWLadderInfo] = { # ladders accessible within different regions of overworld, only those that are relevant # other scenes will just have them hardcoded since this type of structure is not necessary there -region_ladders: Dict[str, Set[str]] = { +region_ladders: dict[str, set[str]] = { "Overworld": {"Ladders near Weathervane", "Ladders near Overworld Checkpoint", "Ladders near Dark Tomb", "Ladders in Overworld Town", "Ladder to Swamp", "Ladders in Well"}, "Overworld Beach": {"Ladder to Ruined Atoll"}, @@ -63,11 +63,11 @@ region_ladders: Dict[str, Set[str]] = { class LadderInfo(NamedTuple): origin: str # origin region destination: str # destination portal - ladders_req: Optional[str] = None # ladders required to do this + ladders_req: str | None = None # ladders required to do this dest_is_region: bool = False # whether it is a region that you are going to -easy_ls: List[LadderInfo] = [ +easy_ls: list[LadderInfo] = [ # In the furnace # Furnace ladder to the fuse entrance LadderInfo("Furnace Ladder Area", "Furnace, Overworld Redux_gyro_upper_north"), @@ -128,7 +128,7 @@ easy_ls: List[LadderInfo] = [ ] # if we can gain elevation or get knocked down, add the harder ones -medium_ls: List[LadderInfo] = [ +medium_ls: list[LadderInfo] = [ # region-destination versions of easy ls spots LadderInfo("East Forest", "East Forest Dance Fox Spot", dest_is_region=True), # fortress courtyard knockdowns are never logically relevant, the fuse requires upper @@ -169,7 +169,7 @@ medium_ls: List[LadderInfo] = [ LadderInfo("Back of Swamp", "Swamp Redux 2, Overworld Redux_wall"), ] -hard_ls: List[LadderInfo] = [ +hard_ls: list[LadderInfo] = [ # lower ladder, go into the waterfall then above the bonfire, up a ramp, then through the right wall LadderInfo("Beneath the Well Front", "Sewer, Sewer_Boss_", "Ladders in Well"), LadderInfo("Beneath the Well Front", "Sewer, Overworld Redux_west_aqueduct", "Ladders in Well"), diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index ced3d223..93c6164b 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -1,17 +1,19 @@ -from typing import Dict, NamedTuple, Set, Optional, List -from .grass import grass_location_table +from typing import NamedTuple + +# from .bells import bell_location_table from .breakables import breakable_location_table +from .constants import base_id +# from .fuses import fuse_location_table +from .grass import grass_location_table class TunicLocationData(NamedTuple): region: str er_region: str # entrance rando region - location_group: Optional[str] = None + location_group: str | None = None -location_base_id = 509342400 - -location_table: Dict[str, TunicLocationData] = { +location_table: dict[str, TunicLocationData] = { "Beneath the Well - [Powered Secret Room] Chest": TunicLocationData("Beneath the Well", "Beneath the Well Back"), "Beneath the Well - [Entryway] Chest": TunicLocationData("Beneath the Well", "Beneath the Well Main"), "Beneath the Well - [Third Room] Beneath Platform Chest": TunicLocationData("Beneath the Well", "Beneath the Well Main"), @@ -243,7 +245,7 @@ location_table: Dict[str, TunicLocationData] = { "Rooted Ziggurat Lower - Near Corpses": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Entry"), "Rooted Ziggurat Lower - Spider Ambush": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Entry"), "Rooted Ziggurat Lower - Left Of Checkpoint Before Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), - "Rooted Ziggurat Lower - After Guarded Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), + "Rooted Ziggurat Lower - After Guarded Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Miniboss Platform"), "Rooted Ziggurat Lower - Guarded By Double Turrets": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Front"), "Rooted Ziggurat Lower - After 2nd Double Turret Chest": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), "Rooted Ziggurat Lower - Guarded By Double Turrets 2": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Front"), @@ -307,7 +309,7 @@ location_table: Dict[str, TunicLocationData] = { "West Garden - [Central Lowlands] Chest Near Shortcut Bridge": TunicLocationData("West Garden", "West Garden after Terry"), "West Garden - [West Highlands] Upper Left Walkway": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [Central Lowlands] Chest Beneath Save Point": TunicLocationData("West Garden", "West Garden South Checkpoint"), - "West Garden - [Central Highlands] Behind Guard Captain": TunicLocationData("West Garden", "West Garden before Boss"), + "West Garden - [Central Highlands] Behind Guard Captain": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [Central Highlands] After Garden Knight": TunicLocationData("Overworld", "West Garden after Boss", location_group="Bosses"), "West Garden - [South Highlands] Secret Chest Beneath Fuse": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [East Lowlands] Page Behind Ice Dagger House": TunicLocationData("West Garden", "West Garden Portal Item"), @@ -316,19 +318,21 @@ location_table: Dict[str, TunicLocationData] = { "Hero's Grave - Effigy Relic": TunicLocationData("West Garden", "Hero Relic - West Garden"), } -hexagon_locations: Dict[str, str] = { +hexagon_locations: dict[str, str] = { "Red Questagon": "Fortress Arena - Siege Engine/Vault Key Pickup", "Green Questagon": "Librarian - Hexagon Green", "Blue Questagon": "Rooted Ziggurat Lower - Hexagon Blue", } -standard_location_name_to_id: Dict[str, int] = {name: location_base_id + index for index, name in enumerate(location_table)} +standard_location_name_to_id: dict[str, int] = {name: base_id + index for index, name in enumerate(location_table)} all_locations = location_table.copy() all_locations.update(grass_location_table) all_locations.update(breakable_location_table) +# all_locations.update(fuse_location_table) +# all_locations.update(bell_location_table) -location_name_groups: Dict[str, Set[str]] = {} +location_name_groups: dict[str, set[str]] = {} for loc_name, loc_data in location_table.items(): loc_group_name = loc_name.split(" - ", 1)[0] location_name_groups.setdefault(loc_group_name, set()).add(loc_name) diff --git a/worlds/tunic/logic_helpers.py b/worlds/tunic/logic_helpers.py new file mode 100644 index 00000000..1752bf8e --- /dev/null +++ b/worlds/tunic/logic_helpers.py @@ -0,0 +1,98 @@ +from typing import TYPE_CHECKING + +from BaseClasses import CollectionState + +from .constants import * +from .fuses import fuse_activation_reqs +from .options import HexagonQuestAbilityUnlockType, IceGrappling + +if TYPE_CHECKING: + from . import TunicWorld + + +def randomize_ability_unlocks(world: "TunicWorld") -> dict[str, int]: + options = world.options + + abilities = [prayer, holy_cross, icebolt] + ability_requirement = [1, 1, 1] + world.random.shuffle(abilities) + + if options.hexagon_quest.value and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + hexagon_goal = options.hexagon_goal.value + # Set ability unlocks to 25, 50, and 75% of goal amount + ability_requirement = [hexagon_goal // 4, hexagon_goal // 2, hexagon_goal * 3 // 4] + if any(req == 0 for req in ability_requirement): + ability_requirement = [1, 2, 3] + + return dict(zip(abilities, ability_requirement)) + + +def has_ability(ability: str, state: CollectionState, world: "TunicWorld") -> bool: + options = world.options + ability_unlocks = world.ability_unlocks + if not options.ability_shuffling: + return True + if options.hexagon_quest and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + return state.has(gold_hexagon, world.player, ability_unlocks[ability]) + return state.has(ability, world.player) + + +# a check to see if you can whack things in melee at all +def has_melee(state: CollectionState, player: int) -> bool: + return state.has_any(("Stick", "Sword", "Sword Upgrade"), player) + + +def has_sword(state: CollectionState, player: int) -> bool: + return state.has("Sword", player) or state.has("Sword Upgrade", player, 2) + + +def laurels_zip(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.laurels_zips and state.has(laurels, world.player) + + +def has_ice_grapple_logic(long_range: bool, difficulty: IceGrappling, state: CollectionState, world: "TunicWorld") -> bool: + if world.options.ice_grappling < difficulty: + return False + if not long_range: + return state.has_all((ice_dagger, grapple), world.player) + else: + return state.has_all((ice_dagger, fire_wand, grapple), world.player) and has_ability(icebolt, state, world) + + +def can_ladder_storage(state: CollectionState, world: "TunicWorld") -> bool: + if not world.options.ladder_storage: + return False + if world.options.ladder_storage_without_items: + return True + return has_melee(state, world.player) or state.has_any((grapple, shield), world.player) + + +def has_mask(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.maskless or state.has(mask, world.player) + + +def has_lantern(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.lanternless or state.has(lantern, world.player) + + +def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: + return not world.options.shuffle_ladders or state.has(ladder, world.player) + + +def can_shop(state: CollectionState, world: "TunicWorld") -> bool: + return has_sword(state, world.player) and state.can_reach_region("Shop", world.player) + + +# for the ones that are not early bushes where ER can screw you over a bit +def can_get_past_bushes(state: CollectionState, world: "TunicWorld") -> bool: + # add in glass cannon + stick for grass rando + return has_sword(state, world.player) or state.has_any((fire_wand, laurels, gun), world.player) + + +def has_fuses(fuse_event: str, state: CollectionState, world: "TunicWorld") -> bool: + player = world.player + fuses_option = False # replace fuses_option with world.options.shuffle_fuses when fuse shuffle is in + if fuses_option: + return state.has_all(fuse_activation_reqs[fuse_event], player) + + return state.has(fuse_event, player) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index 09e2d1d6..79bb033b 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -1,12 +1,13 @@ -import logging from dataclasses import dataclass -from typing import Dict, Any, TYPE_CHECKING - from decimal import Decimal, ROUND_HALF_UP +import logging +from typing import Any, TYPE_CHECKING from Options import (DefaultOnToggle, Toggle, StartInventoryPool, Choice, Range, TextChoice, PlandoConnections, PerGameCommonOptions, OptionGroup, Removed, Visibility, NamedRange) + from .er_data import portal_mapping + if TYPE_CHECKING: from . import TunicWorld @@ -145,17 +146,6 @@ class EntranceRando(TextChoice): default = 0 -class FixedShop(Toggle): - """ - This option has been superseded by the Entrance Layout option. - If enabled, it will override the Entrance Layout option. - This is kept to keep older yamls working, and will be removed at a later date. - """ - visibility = Visibility.none - internal_name = "fixed_shop" - display_name = "Fewer Shops in Entrance Rando" - - class EntranceLayout(Choice): """ Decide how the Entrance Randomizer chooses how to pair the entrances. @@ -219,8 +209,8 @@ class GrassRandomizer(Toggle): class LocalFill(NamedRange): """ Choose the percentage of your filler/trap items that will be kept local or distributed to other TUNIC players with this option enabled. + This option defaults to 95% if you have Grass Randomizer enabled, 40% if you have Breakable Shuffle enabled, 96% if you have both, and 0% otherwise. If you have Grass Randomizer enabled, this option must be set to 95% or higher to avoid flooding the item pool. The host can remove this restriction by turning off the limit_grass_rando setting in host.yaml. - This option defaults to 95% if you have Grass Randomizer enabled, and to 0% otherwise. This option ignores items placed in your local_items or non_local_items. This option does nothing in single player games. """ @@ -332,6 +322,14 @@ class LadderStorageWithoutItems(Toggle): display_name = "Ladder Storage without Items" +class BreakableShuffle(Toggle): + """ + Turns approximately 250 breakable objects in the game into checks. + """ + internal_name = "breakable_shuffle" + display_name = "Breakable Shuffle" + + class HiddenAllRandom(Toggle): """ Sets all options that can be random to random. @@ -342,36 +340,9 @@ class HiddenAllRandom(Toggle): visibility = Visibility.none -class LogicRules(Choice): - """ - This option has been superseded by the individual trick options. - If set to nmg, it will set Ice Grappling to medium and Laurels Zips on. - If set to ur, it will do nmg as well as set Ladder Storage to medium. - It is here to avoid breaking old yamls, and will be removed at a later date. - """ - visibility = Visibility.none - internal_name = "logic_rules" - display_name = "Logic Rules" - option_restricted = 0 - option_no_major_glitches = 1 - alias_nmg = 1 - option_unrestricted = 2 - alias_ur = 2 - default = 0 - - -class BreakableShuffle(Toggle): - """ - Turns approximately 250 breakable objects in the game into checks. - """ - internal_name = "breakable_shuffle" - display_name = "Breakable Shuffle" - - @dataclass class TunicOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool - sword_progression: SwordProgression start_with_sword: StartWithSword keys_behind_bosses: KeysBehindBosses @@ -386,6 +357,8 @@ class TunicOptions(PerGameCommonOptions): hexagon_quest_ability_type: HexagonQuestAbilityUnlockType shuffle_ladders: ShuffleLadders + # shuffle_fuses: ShuffleFuses + # shuffle_bells: ShuffleBells grass_randomizer: GrassRandomizer breakable_shuffle: BreakableShuffle local_fill: LocalFill @@ -393,7 +366,6 @@ class TunicOptions(PerGameCommonOptions): entrance_rando: EntranceRando entrance_layout: EntranceLayout decoupled: Decoupled - plando_connections: TunicPlandoConnections combat_logic: CombatLogic lanternless: Lanternless @@ -402,11 +374,13 @@ class TunicOptions(PerGameCommonOptions): ice_grappling: IceGrappling ladder_storage: LadderStorage ladder_storage_without_items: LadderStorageWithoutItems - + + plando_connections: TunicPlandoConnections + all_random: HiddenAllRandom - fixed_shop: FixedShop # will be removed at a later date - logic_rules: Removed # fully removed in the direction pairs update + fixed_shop: Removed + logic_rules: Removed tunic_option_groups = [ @@ -433,7 +407,7 @@ tunic_option_groups = [ ]), ] -tunic_option_presets: Dict[str, Dict[str, Any]] = { +tunic_option_presets: dict[str, dict[str, Any]] = { "Sync": { "ability_shuffling": True, }, @@ -460,14 +434,16 @@ tunic_option_presets: Dict[str, Dict[str, Any]] = { def check_options(world: "TunicWorld"): options = world.options - if options.hexagon_quest and options.ability_shuffling and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + if (options.hexagon_quest and options.ability_shuffling + and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons): total_hexes = get_hexagons_in_pool(world) min_hexes = 3 if options.keys_behind_bosses: min_hexes = 15 if total_hexes < min_hexes: - logging.warning(f"TUNIC: Not enough Gold Hexagons in {world.player_name}'s item pool for Hexagon Ability Shuffle with the selected options. Ability Shuffle mode will be switched to Pages.") + logging.warning(f"TUNIC: Not enough Gold Hexagons in {world.player_name}'s item pool for Hexagon Ability " + "Shuffle with the selected options. Ability Shuffle mode will be switched to Pages.") options.hexagon_quest_ability_type.value = HexagonQuestAbilityUnlockType.option_pages @@ -475,4 +451,4 @@ def get_hexagons_in_pool(world: "TunicWorld"): # Calculate number of hexagons in item pool options = world.options return min(int((Decimal(100 + options.extra_hexagon_percentage) / 100 * options.hexagon_goal) - .to_integral_value(rounding=ROUND_HALF_UP)), 100) + .to_integral_value(rounding=ROUND_HALF_UP)), 100) diff --git a/worlds/tunic/regions.py b/worlds/tunic/regions.py deleted file mode 100644 index f21af11e..00000000 --- a/worlds/tunic/regions.py +++ /dev/null @@ -1,25 +0,0 @@ -tunic_regions: dict[str, tuple[str]] = { - "Menu": ("Overworld",), - "Overworld": ("Overworld Holy Cross", "East Forest", "Dark Tomb", "Beneath the Well", "West Garden", - "Ruined Atoll", "Eastern Vault Fortress", "Beneath the Vault", "Quarry Back", "Quarry", "Swamp", - "Spirit Arena"), - "Overworld Holy Cross": tuple(), - "East Forest": tuple(), - "Dark Tomb": ("West Garden",), - "Beneath the Well": tuple(), - "West Garden": tuple(), - "Ruined Atoll": ("Frog's Domain", "Library"), - "Frog's Domain": tuple(), - "Library": tuple(), - "Eastern Vault Fortress": ("Beneath the Vault",), - "Beneath the Vault": ("Eastern Vault Fortress",), - "Quarry Back": ("Quarry", "Monastery"), - "Quarry": ("Monastery", "Lower Quarry"), - "Monastery": ("Monastery Back",), - "Monastery Back": tuple(), - "Lower Quarry": ("Rooted Ziggurat",), - "Rooted Ziggurat": tuple(), - "Swamp": ("Cathedral",), - "Cathedral": tuple(), - "Spirit Arena": tuple() -} diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py deleted file mode 100644 index 52d5c42e..00000000 --- a/worlds/tunic/rules.py +++ /dev/null @@ -1,402 +0,0 @@ -from typing import Dict, TYPE_CHECKING - -from worlds.generic.Rules import set_rule, forbid_item, add_rule -from BaseClasses import CollectionState -from .options import LadderStorage, IceGrappling, HexagonQuestAbilityUnlockType -if TYPE_CHECKING: - from . import TunicWorld - -laurels = "Hero's Laurels" -grapple = "Magic Orb" -ice_dagger = "Magic Dagger" -fire_wand = "Magic Wand" -gun = "Gun" -lantern = "Lantern" -fairies = "Fairy" -coins = "Golden Coin" -prayer = "Pages 24-25 (Prayer)" -holy_cross = "Pages 42-43 (Holy Cross)" -icebolt = "Pages 52-53 (Icebolt)" -shield = "Shield" -key = "Key" -house_key = "Old House Key" -vault_key = "Fortress Vault Key" -mask = "Scavenger Mask" -red_hexagon = "Red Questagon" -green_hexagon = "Green Questagon" -blue_hexagon = "Blue Questagon" -gold_hexagon = "Gold Questagon" - -# "Quarry - [East] Bombable Wall" is excluded from this list since it has slightly different rules -bomb_walls = ["East Forest - Bombable Wall", "Eastern Vault Fortress - [East Wing] Bombable Wall", - "Overworld - [Central] Bombable Wall", "Overworld - [Southwest] Bombable Wall Near Fountain", - "Quarry - [West] Upper Area Bombable Wall", "Ruined Atoll - [Northwest] Bombable Wall"] - - -def randomize_ability_unlocks(world: "TunicWorld") -> Dict[str, int]: - random = world.random - options = world.options - - abilities = [prayer, holy_cross, icebolt] - ability_requirement = [1, 1, 1] - random.shuffle(abilities) - - if options.hexagon_quest.value and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: - hexagon_goal = options.hexagon_goal.value - # Set ability unlocks to 25, 50, and 75% of goal amount - ability_requirement = [hexagon_goal // 4, hexagon_goal // 2, hexagon_goal * 3 // 4] - if any(req == 0 for req in ability_requirement): - ability_requirement = [1, 2, 3] - - return dict(zip(abilities, ability_requirement)) - - -def has_ability(ability: str, state: CollectionState, world: "TunicWorld") -> bool: - options = world.options - ability_unlocks = world.ability_unlocks - if not options.ability_shuffling: - return True - if options.hexagon_quest and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: - return state.has(gold_hexagon, world.player, ability_unlocks[ability]) - return state.has(ability, world.player) - - -# a check to see if you can whack things in melee at all -def has_melee(state: CollectionState, player: int) -> bool: - return state.has_any({"Stick", "Sword", "Sword Upgrade"}, player) - - -def has_sword(state: CollectionState, player: int) -> bool: - return state.has("Sword", player) or state.has("Sword Upgrade", player, 2) - - -def laurels_zip(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.laurels_zips and state.has(laurels, world.player) - - -def has_ice_grapple_logic(long_range: bool, difficulty: IceGrappling, state: CollectionState, world: "TunicWorld") -> bool: - if world.options.ice_grappling < difficulty: - return False - if not long_range: - return state.has_all({ice_dagger, grapple}, world.player) - else: - return state.has_all({ice_dagger, fire_wand, grapple}, world.player) and has_ability(icebolt, state, world) - - -def can_ladder_storage(state: CollectionState, world: "TunicWorld") -> bool: - if not world.options.ladder_storage: - return False - if world.options.ladder_storage_without_items: - return True - return has_melee(state, world.player) or state.has_any((grapple, shield), world.player) - - -def has_mask(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.maskless or state.has(mask, world.player) - - -def has_lantern(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.lanternless or state.has(lantern, world.player) - - -def set_region_rules(world: "TunicWorld") -> None: - player = world.player - options = world.options - - world.get_entrance("Overworld -> Overworld Holy Cross").access_rule = \ - lambda state: has_ability(holy_cross, state, world) - world.get_entrance("Overworld -> Beneath the Well").access_rule = \ - lambda state: has_melee(state, player) or state.has(fire_wand, player) - world.get_entrance("Overworld -> Dark Tomb").access_rule = \ - lambda state: has_lantern(state, world) - # laurels in, ladder storage in through the furnace, or ice grapple down the belltower - world.get_entrance("Overworld -> West Garden").access_rule = \ - lambda state: (state.has(laurels, player) - or can_ladder_storage(state, world) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - world.get_entrance("Overworld -> Eastern Vault Fortress").access_rule = \ - lambda state: state.has(laurels, player) \ - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) \ - or can_ladder_storage(state, world) - # using laurels or ls to get in is covered by the -> Eastern Vault Fortress rules - world.get_entrance("Overworld -> Beneath the Vault").access_rule = \ - lambda state: (has_lantern(state, world) and has_ability(prayer, state, world) - # there's some boxes in the way - and (has_melee(state, player) or state.has_any((gun, grapple, fire_wand), player))) - world.get_entrance("Ruined Atoll -> Library").access_rule = \ - lambda state: (state.has_any({grapple, laurels}, player) and has_ability(prayer, state, world) - and (has_sword(state, player) or state.has_any((fire_wand, gun), player))) - world.get_entrance("Overworld -> Quarry").access_rule = \ - lambda state: (has_sword(state, player) or state.has(fire_wand, player)) \ - and (state.has_any({grapple, laurels, gun}, player) or can_ladder_storage(state, world)) - world.get_entrance("Quarry Back -> Quarry").access_rule = \ - lambda state: has_sword(state, player) or state.has(fire_wand, player) - world.get_entrance("Quarry Back -> Monastery").access_rule = \ - lambda state: state.has(laurels, player) - world.get_entrance("Monastery -> Monastery Back").access_rule = \ - lambda state: (has_sword(state, player) or state.has(fire_wand, player) - or laurels_zip(state, world)) - world.get_entrance("Quarry -> Lower Quarry").access_rule = \ - lambda state: has_mask(state, world) - world.get_entrance("Lower Quarry -> Rooted Ziggurat").access_rule = \ - lambda state: state.has(grapple, player) and has_ability(prayer, state, world) - world.get_entrance("Swamp -> Cathedral").access_rule = \ - lambda state: (state.has(laurels, player) and has_ability(prayer, state, world) and has_sword(state, player)) \ - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - world.get_entrance("Overworld -> Spirit Arena").access_rule = \ - lambda state: ((state.has(gold_hexagon, player, options.hexagon_goal.value) if options.hexagon_quest.value - else state.has_all({red_hexagon, green_hexagon, blue_hexagon}, player) - and state.has_group_unique("Hero Relics", player, 6)) - and has_ability(prayer, state, world) and has_sword(state, player) - and state.has_any({lantern, laurels}, player)) - - world.get_region("Quarry").connect(world.get_region("Rooted Ziggurat"), - rule=lambda state: has_ice_grapple_logic(True, IceGrappling.option_hard, state, world) - and has_ability(prayer, state, world)) - - if options.ladder_storage >= LadderStorage.option_medium: - # ls at any ladder in a safe spot in quarry to get to the monastery rope entrance - add_rule(world.get_entrance(entrance_name="Quarry Back -> Monastery"), - rule=lambda state: can_ladder_storage(state, world)) - - -def set_location_rules(world: "TunicWorld") -> None: - player = world.player - - forbid_item(world.get_location("Secret Gathering Place - 20 Fairy Reward"), fairies, player) - - # Ability Shuffle Exclusive Rules - set_rule(world.get_location("Far Shore - Page Pickup"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Fortress Courtyard - Chest Near Cave"), - lambda state: has_ability(prayer, state, world) - or state.has(laurels, player) - or can_ladder_storage(state, world) - or (has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) - and has_lantern(state, world))) - set_rule(world.get_location("Fortress Courtyard - Page Near Cave"), - lambda state: has_ability(prayer, state, world) or state.has(laurels, player) - or can_ladder_storage(state, world) - or (has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) - and has_lantern(state, world))) - set_rule(world.get_location("East Forest - Dancing Fox Spirit Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Forest Grave Path - Holy Cross Code by Grave"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("East Forest - Golden Obelisk Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Beneath the Well - [Powered Secret Room] Chest"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("West Garden - [North] Behind Holy Cross Door"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Library Hall - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Eastern Vault Fortress - [West Wing] Candles Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("West Garden - [Central Highlands] Holy Cross (Blue Lines)"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Quarry - [Back Entrance] Bushes Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Cathedral - Secret Legend Trophy Chest"), - lambda state: has_ability(holy_cross, state, world)) - - # Overworld - set_rule(world.get_location("Overworld - [Southwest] Fountain Page"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [Southwest] Grapple Chest Over Walkway"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Overworld - [Southwest] West Beach Guarded By Turret 2"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Far Shore - Secret Chest"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Overworld - [Southeast] Page on Pillar by Swamp"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Old House - Normal Chest"), - lambda state: state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world)) - set_rule(world.get_location("Old House - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world) and ( - state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world))) - set_rule(world.get_location("Old House - Shield Pickup"), - lambda state: state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world)) - set_rule(world.get_location("Overworld - [Northwest] Page on Pillar by Dark Tomb"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [Southwest] From West Garden"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [West] Chest After Bell"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and has_sword(state, player)) - or can_ladder_storage(state, world)) - set_rule(world.get_location("Overworld - [Northwest] Chest Beneath Quarry Gate"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Overworld - [East] Grapple Chest"), - lambda state: state.has(grapple, player)) - set_rule(world.get_location("Special Shop - Secret Page Pickup"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Sealed Temple - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world) - and (state.has(laurels, player) or (has_lantern(state, world) and (has_sword(state, player) - or state.has(fire_wand, player))) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Sealed Temple - Page Pickup"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and (has_sword(state, player) or state.has(fire_wand, player))) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("West Furnace - Lantern Pickup"), - lambda state: has_melee(state, player) or state.has_any({fire_wand, laurels}, player)) - - set_rule(world.get_location("Secret Gathering Place - 10 Fairy Reward"), - lambda state: state.has(fairies, player, 10)) - set_rule(world.get_location("Secret Gathering Place - 20 Fairy Reward"), - lambda state: state.has(fairies, player, 20)) - set_rule(world.get_location("Coins in the Well - 3 Coins"), - lambda state: state.has(coins, player, 3)) - set_rule(world.get_location("Coins in the Well - 6 Coins"), - lambda state: state.has(coins, player, 6)) - set_rule(world.get_location("Coins in the Well - 10 Coins"), - lambda state: state.has(coins, player, 10)) - set_rule(world.get_location("Coins in the Well - 15 Coins"), - lambda state: state.has(coins, player, 15)) - - # East Forest - set_rule(world.get_location("East Forest - Lower Grapple Chest"), - lambda state: state.has(grapple, player)) - set_rule(world.get_location("East Forest - Lower Dash Chest"), - lambda state: state.has_all({grapple, laurels}, player)) - set_rule(world.get_location("East Forest - Ice Rod Grapple Chest"), - lambda state: state.has_all({grapple, ice_dagger, fire_wand}, player) - and has_ability(icebolt, state, world)) - - # West Garden - set_rule(world.get_location("West Garden - [North] Across From Page Pickup"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [West] In Flooded Walkway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [West Lowlands] Tree Holy Cross Chest"), - lambda state: state.has(laurels, player) and has_ability(holy_cross, state, world)) - set_rule(world.get_location("West Garden - [East Lowlands] Page Behind Ice Dagger House"), - lambda state: (state.has(laurels, player) and has_ability(prayer, state, world)) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - set_rule(world.get_location("West Garden - [Central Lowlands] Below Left Walkway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [Central Highlands] After Garden Knight"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and has_sword(state, player)) - or can_ladder_storage(state, world)) - - # Ruined Atoll - set_rule(world.get_location("Ruined Atoll - [West] Near Kevin Block"), - lambda state: state.has(laurels, player)) - # ice grapple push a crab through the door - set_rule(world.get_location("Ruined Atoll - [East] Locked Room Lower Chest"), - lambda state: state.has(laurels, player) or state.has(key, player, 2) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("Ruined Atoll - [East] Locked Room Upper Chest"), - lambda state: state.has(laurels, player) or state.has(key, player, 2) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("Librarian - Hexagon Green"), - lambda state: has_sword(state, player)) - - # Frog's Domain - set_rule(world.get_location("Frog's Domain - Side Room Grapple Secret"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Frog's Domain - Grapple Above Hot Tub"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Frog's Domain - Escape Chest"), - lambda state: state.has_any({grapple, laurels}, player)) - - # Library Lab - set_rule(world.get_location("Library Lab - Page 1"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - set_rule(world.get_location("Library Lab - Page 2"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - set_rule(world.get_location("Library Lab - Page 3"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - - # Eastern Vault Fortress - # yes, you can clear the leaves with dagger - # gun isn't included since it can only break one leaf pile at a time, and we don't check how much mana you have - # but really, I expect the player to just throw a bomb at them if they don't have melee - set_rule(world.get_location("Fortress Leaf Piles - Secret Chest"), - lambda state: state.has(laurels, player) and (has_melee(state, player) or state.has(ice_dagger, player))) - set_rule(world.get_location("Fortress Arena - Siege Engine/Vault Key Pickup"), - lambda state: has_sword(state, player) - and (has_ability(prayer, state, world) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Fortress Arena - Hexagon Red"), - lambda state: state.has(vault_key, player) - and (has_ability(prayer, state, world) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - - # Beneath the Vault - set_rule(world.get_location("Beneath the Fortress - Bridge"), - lambda state: has_lantern(state, world) and - (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) - set_rule(world.get_location("Beneath the Fortress - Obscured Behind Waterfall"), - lambda state: has_melee(state, player) and has_lantern(state, world)) - - # Quarry - set_rule(world.get_location("Quarry - [Central] Above Ladder Dash Chest"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Rooted Ziggurat Upper - Near Bridge Switch"), - lambda state: has_sword(state, player) or state.has_all({fire_wand, laurels}, player)) - set_rule(world.get_location("Rooted Ziggurat Lower - Hexagon Blue"), - lambda state: has_sword(state, player)) - - # Swamp - set_rule(world.get_location("Cathedral Gauntlet - Gauntlet Reward"), - lambda state: (state.has(fire_wand, player) and has_sword(state, player)) - and (state.has(laurels, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Swamp - [Entrance] Above Entryway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [South Graveyard] Upper Walkway Dash Chest"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [Outside Cathedral] Obscured Behind Memorial"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [South Graveyard] 4 Orange Skulls"), - lambda state: has_sword(state, player)) - - # Hero's Grave - set_rule(world.get_location("Hero's Grave - Tooth Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Mushroom Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Ash Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Flowers Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Effigy Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Feathers Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - - # Bombable Walls - for location_name in bomb_walls: - # has_sword is there because you can buy bombs in the shop - set_rule(world.get_location(location_name), - lambda state: state.has(gun, player) - or has_sword(state, player) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - add_rule(world.get_location("Cube Cave - Holy Cross Chest"), - lambda state: state.has(gun, player) - or has_sword(state, player) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - # can't ice grapple to this one, not enough space - set_rule(world.get_location("Quarry - [East] Bombable Wall"), - lambda state: state.has(gun, player) or has_sword(state, player)) - - # Shop - set_rule(world.get_location("Shop - Potion 1"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Potion 2"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Coin 1"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Coin 2"), - lambda state: has_sword(state, player)) diff --git a/worlds/tunic/test/test_access.py b/worlds/tunic/test/test_access.py index 1896db5d..f5d429ac 100644 --- a/worlds/tunic/test/test_access.py +++ b/worlds/tunic/test/test_access.py @@ -5,13 +5,6 @@ from .bases import TunicTestBase class TestAccess(TunicTestBase): options = {options.CombatLogic.internal_name: options.CombatLogic.option_off} - # test whether you can get into the temple without laurels - def test_temple_access(self) -> None: - self.collect_all_but(["Hero's Laurels", "Lantern"]) - self.assertFalse(self.can_reach_location("Sealed Temple - Page Pickup")) - self.collect_by_name(["Lantern"]) - self.assertTrue(self.can_reach_location("Sealed Temple - Page Pickup")) - # test that the wells function properly. Since fairies is written the same way, that should succeed too def test_wells(self) -> None: self.collect_all_but(["Golden Coin"]) @@ -50,22 +43,12 @@ class TestHexQuestNoShuffle(TunicTestBase): self.assertTrue(self.can_reach_location("Fountain Cross Door - Page Pickup")) -class TestNormalGoal(TunicTestBase): - options = {options.HexagonQuest.internal_name: options.HexagonQuest.option_false} - - # test that you need the three colored hexes to reach the Heir in standard - def test_normal_goal(self) -> None: - location = ["The Heir"] - items = [["Red Questagon", "Blue Questagon", "Green Questagon"]] - self.assertAccessDependency(location, items) - - class TestER(TunicTestBase): options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true, options.HexagonQuest.internal_name: options.HexagonQuest.option_false, options.CombatLogic.internal_name: options.CombatLogic.option_off, - options.FixedShop.internal_name: options.FixedShop.option_true} + options.EntranceLayout.internal_name: options.EntranceLayout.option_fixed_shop} def test_overworld_hc_chest(self) -> None: # test to see that static connections are working properly -- this chest requires holy cross and is in Overworld @@ -99,7 +82,7 @@ class TestLadderStorage(TunicTestBase): options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true, options.HexagonQuest.internal_name: options.HexagonQuest.option_false, - options.FixedShop.internal_name: options.FixedShop.option_false, + options.EntranceLayout.internal_name: options.EntranceLayout.option_standard, options.LadderStorage.internal_name: options.LadderStorage.option_hard, options.LadderStorageWithoutItems.internal_name: options.LadderStorageWithoutItems.option_false, "plando_connections": [ From ef59a5ee11d63f673da3860e68ec9fcc1fde42ab Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Thu, 4 Sep 2025 19:04:21 -0400 Subject: [PATCH 046/204] TUNIC: Change non_local_items Earlier (#5249) --- worlds/tunic/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index db0357da..9fca0a7d 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -208,6 +208,10 @@ class TunicWorld(World): else: self.options.local_fill.value = 0 + if self.options.local_fill > 0 and self.settings.limit_grass_rando: + # discard grass from non_local if it's meant to be limited + self.options.non_local_items.value.discard("Grass") + if self.options.grass_randomizer: if self.settings.limit_grass_rando and self.options.local_fill < 95 and self.multiworld.players > 1: raise OptionError(f"TUNIC: Player {self.player_name} has their Local Fill option set too low. " @@ -477,9 +481,6 @@ class TunicWorld(World): self.fill_items = [] if self.options.local_fill > 0 and self.multiworld.players > 1: # skip items marked local or non-local, let fill deal with them in its own way - # discard grass from non_local if it's meant to be limited - if self.settings.limit_grass_rando: - self.options.non_local_items.value.discard("Grass") all_filler: list[TunicItem] = [] non_filler: list[TunicItem] = [] for tunic_item in tunic_items: From 5b5e2c356723786b8b2df3ac69eac917cc79251b Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Fri, 5 Sep 2025 07:21:08 -0700 Subject: [PATCH 047/204] SMZ3: Fix distribution of SM prizes (#5303) --- worlds/smz3/TotalSMZ3/WorldState.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/worlds/smz3/TotalSMZ3/WorldState.py b/worlds/smz3/TotalSMZ3/WorldState.py index bbffffa1..8b2b5647 100644 --- a/worlds/smz3/TotalSMZ3/WorldState.py +++ b/worlds/smz3/TotalSMZ3/WorldState.py @@ -1,6 +1,5 @@ from enum import Enum from typing import List -from copy import copy from .Patch import DropPrize from .Region import RewardType @@ -91,7 +90,11 @@ class WorldState: self.Green = 1 if (distribution is not None): - self = copy(distribution) + self.Boss = distribution.Boss + self.Blue = distribution.Blue + self.Red = distribution.Red + self.Pend = distribution.Pend + self.Green = distribution.Green if (boss is not None): self.Boss = boss if (blue is not None): @@ -111,11 +114,11 @@ class WorldState: p -= self.Boss if (p < 0): return (RewardType.AnyBossToken, WorldState.Distribution(self, boss = self.Boss - WorldState.Distribution.factor)) p -= self.Blue - if (p - self.Blue < 0): return (RewardType.CrystalBlue, WorldState.Distribution(self, blue = self.Blue - WorldState.Distribution.factor)) + if (p < 0): return (RewardType.CrystalBlue, WorldState.Distribution(self, blue = self.Blue - WorldState.Distribution.factor)) p -= self.Red - if (p - self.Red < 0): return (RewardType.CrystalRed, WorldState.Distribution(self, red = self.Red - WorldState.Distribution.factor)) + if (p < 0): return (RewardType.CrystalRed, WorldState.Distribution(self, red = self.Red - WorldState.Distribution.factor)) p -= self.Pend - if (p - self.Pend < 0): return (RewardType.PendantNonGreen, WorldState.Distribution(self, pend = self.Pend - 1)) + if (p < 0): return (RewardType.PendantNonGreen, WorldState.Distribution(self, pend = self.Pend - 1)) return (RewardType.PendantGreen, WorldState.Distribution(self, green = self.Green - 1)) def Generate(self, func): From 89be26a33a1209fe1cfdd1ada916e94459070dec Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Fri, 5 Sep 2025 07:22:11 -0700 Subject: [PATCH 048/204] Heretic: Update Steam URL (#5304) --- worlds/heretic/docs/setup_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/heretic/docs/setup_en.md b/worlds/heretic/docs/setup_en.md index 5985dbb0..5475a00f 100644 --- a/worlds/heretic/docs/setup_en.md +++ b/worlds/heretic/docs/setup_en.md @@ -2,7 +2,7 @@ ## Required Software -- [Heretic (e.g. Steam version)](https://store.steampowered.com/app/2390/Heretic_Shadow_of_the_Serpent_Riders/) +- [Heretic (e.g. Steam version)](https://store.steampowered.com/app/3286930/Heretic__Hexen/) - [Archipelago Crispy DOOM](https://github.com/Daivuk/apdoom/releases) (Same download for DOOM 1993, DOOM II and Heretic) ## Optional Software From 64d3c55d6277a5d1f7d051b8b4abd57b3abf406b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:23:25 -0400 Subject: [PATCH 049/204] Stardew Valley: Add money logic to traveling merchant (#5327) * add rule to traveling merchant region * add a test so kaito is happy --- worlds/stardew_valley/rules.py | 2 +- .../test/rules/TestTravelingMerchant.py | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 worlds/stardew_valley/test/rules/TestTravelingMerchant.py diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 2b7eec99..2fb95a98 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -206,7 +206,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_entrance_rule(multiworld, player, Entrance.enter_skull_cavern, logic.received(Wallet.skull_key)) set_entrance_rule(multiworld, player, LogicEntrance.talk_to_mines_dwarf, logic.wallet.can_speak_dwarf() & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron)) - set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days()) + set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days() & logic.money.can_spend(1000)) set_entrance_rule(multiworld, player, LogicEntrance.buy_from_raccoon, logic.quest.has_raccoon_shop()) set_entrance_rule(multiworld, player, LogicEntrance.fish_in_waterfall, logic.skill.has_level(Skill.fishing, 5) & logic.tool.has_fishing_rod(2)) diff --git a/worlds/stardew_valley/test/rules/TestTravelingMerchant.py b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py new file mode 100644 index 00000000..57b88747 --- /dev/null +++ b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py @@ -0,0 +1,23 @@ +from ..bases import SVTestBase +from ...locations import location_table, LocationTags + + +class TestTravelingMerchant(SVTestBase): + + def test_purchase_from_traveling_merchant_requires_money(self): + traveling_merchant_location_names = [l for l in self.get_real_location_names() if LocationTags.TRAVELING_MERCHANT in location_table[l].tags] + + for traveling_merchant_day in ["Traveling Merchant: Sunday", "Traveling Merchant: Monday", "Traveling Merchant: Tuesday", + "Traveling Merchant: Wednesday", "Traveling Merchant: Thursday", "Traveling Merchant: Friday", + "Traveling Merchant: Saturday"]: + self.collect(traveling_merchant_day) + + for location_name in traveling_merchant_location_names: + location = self.multiworld.get_location(location_name, 1) + self.assert_cannot_reach_location(location, self.multiworld.state) + + self.collect("Shipping Bin") + + for location_name in traveling_merchant_location_names: + location = self.multiworld.get_location(location_name, 1) + self.assert_can_reach_location(location, self.multiworld.state) From 7a38e44e648103b92044b008cb027fbb94c07fb9 Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 5 Sep 2025 09:24:20 -0500 Subject: [PATCH 050/204] Test: Deprecate TestBase (#5339) * deprecate TestBase and fix the last use of it in main * actually delete it because test discovery also imports it lmao --- test/TestBase.py | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 test/TestBase.py diff --git a/test/TestBase.py b/test/TestBase.py deleted file mode 100644 index bfd92346..00000000 --- a/test/TestBase.py +++ /dev/null @@ -1,3 +0,0 @@ -from .bases import TestBase, WorldTestBase -from warnings import warn -warn("TestBase was renamed to bases", DeprecationWarning) From e518e41f67766724647b7bfd28791810e87ff9cd Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Fri, 5 Sep 2025 10:34:57 -0400 Subject: [PATCH 051/204] Hollow Knight: Make the connecting header separate from the yaml one (#5353) * Update setup_en.md * Update setup_pt_br.md --- worlds/hk/docs/setup_en.md | 2 +- worlds/hk/docs/setup_pt_br.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index 0375867d..d49a4002 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -42,7 +42,7 @@ See the [basic multiworld setup guide](/tutorial/Archipelago/setup/en) here on t You can use the [game options page for Hollow Knight](/games/Hollow%20Knight/player-options) here on the Archipelago website to generate a YAML using a graphical interface. -### Joining an Archipelago Game in Hollow Knight +## Joining an Archipelago Game in Hollow Knight 1. Start the game after installing all necessary mods. 2. Create a **new save game.** 3. Select the **Archipelago** game mode from the mode selection screen. diff --git a/worlds/hk/docs/setup_pt_br.md b/worlds/hk/docs/setup_pt_br.md index 511ee0d5..14e54db1 100644 --- a/worlds/hk/docs/setup_pt_br.md +++ b/worlds/hk/docs/setup_pt_br.md @@ -36,7 +36,7 @@ Olhe o [guia de configuração básica de um multiworld](/tutorial/Archipelago/s Você pode usar a [página de configurações do jogador para Hollow Knight](/games/Hollow%20Knight/player-options) aqui no site do Archipelago para gerar o YAML usando a interface gráfica. -### Entrando numa partida de Archipelago no Hollow Knight +## Entrando numa partida de Archipelago no Hollow Knight 1. Começe o jogo depois de instalar todos os mods necessários. 2. Crie um **novo jogo salvo.** 3. Selecione o modo de jogo **Archipelago** do menu de seleção. From b9fb5c8b441b50bb843f8d8a3f5c565e60287f5d Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:37:31 -0400 Subject: [PATCH 052/204] Super Mario Land 2: Remove erroneous Coinsanity checks #5364 Co-authored-by: alchav --- worlds/marioland2/locations.py | 2 +- worlds/marioland2/logic.py | 4 ---- worlds/marioland2/options.py | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/worlds/marioland2/locations.py b/worlds/marioland2/locations.py index 02ae1cca..8908b8d3 100644 --- a/worlds/marioland2/locations.py +++ b/worlds/marioland2/locations.py @@ -419,7 +419,7 @@ powerup_coords = { "Tree Zone Secret Course": [(17, 23), (100, 23), (159, 23)], "Tree Zone 3": [(26, 40), (77, 24)], "Tree Zone 4": [(28, 27), (105, 25), (136, 22), (171, 10)], - "Tree Zone 5": [(123, 39), (138, 39), (146, 36)], + "Tree Zone 5": [(23, 41), (116, 42), (123, 39), (138, 39), (146, 36)], "Pumpkin Zone 1": [(23, 12), (72, 27), (98, 4), (189, 6)], "Pumpkin Zone 2": [(144, 23)], "Pumpkin Zone Secret Course 1": [(14, 15)], diff --git a/worlds/marioland2/logic.py b/worlds/marioland2/logic.py index 99345355..5405e828 100644 --- a/worlds/marioland2/logic.py +++ b/worlds/marioland2/logic.py @@ -135,10 +135,6 @@ def tree_zone_5_boss(state, player): def tree_zone_5_coins(state, player, coins): auto_scroll = is_auto_scroll(state, player, "Tree Zone 5") reachable_coins = 0 - # Not actually sure if these platforms can be randomized / can make the coin blocks unreachable from below - if ((not state.multiworld.worlds[player].options.randomize_platforms) - or state.has_any(["Mushroom", "Fire Flower"], player)): - reachable_coins += 2 if state.has_any(["Mushroom", "Fire Flower"], player): reachable_coins += 2 if state.has("Carrot", player): diff --git a/worlds/marioland2/options.py b/worlds/marioland2/options.py index ace8444b..dfe5d6a6 100644 --- a/worlds/marioland2/options.py +++ b/worlds/marioland2/options.py @@ -81,7 +81,7 @@ class CoinsanityChecks(Range): """ display_name = "Coinsanity Checks" range_start = 31 - range_end = 2599 + range_end = 2597 default = 150 From 0d26b6426f0391bc7fd962ff2d5c65b173a9b461 Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 5 Sep 2025 09:42:12 -0500 Subject: [PATCH 053/204] Core: Remove lttp module requirement from generation #5384 --- Generate.py | 37 +++++++++++----------------- Main.py | 2 +- WebHost.py | 2 +- WebHostLib/generate.py | 52 ++++++++++++++++++++------------------- WebHostLib/lttpsprites.py | 2 +- worlds/bumpstik/Items.py | 25 ++++++++++--------- worlds/meritous/Items.py | 17 +++++++------ 7 files changed, 68 insertions(+), 69 deletions(-) diff --git a/Generate.py b/Generate.py index f9607e32..5d65a688 100644 --- a/Generate.py +++ b/Generate.py @@ -166,19 +166,10 @@ def main(args=None) -> tuple[argparse.Namespace, int]: f"A mix is also permitted.") from worlds.AutoWorld import AutoWorldRegister - from worlds.alttp.EntranceRandomizer import parse_arguments - erargs = parse_arguments(['--multi', str(args.multi)]) - erargs.seed = seed - erargs.plando_options = args.plando - erargs.spoiler = args.spoiler - erargs.race = args.race - erargs.outputname = seed_name - erargs.outputpath = args.outputpath - erargs.skip_prog_balancing = args.skip_prog_balancing - erargs.skip_output = args.skip_output - erargs.spoiler_only = args.spoiler_only - erargs.name = {} - erargs.csv_output = args.csv_output + args.outputname = seed_name + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) + args.name = {} settings_cache: dict[str, tuple[argparse.Namespace, ...]] = \ {fname: (tuple(roll_settings(yaml, args.plando) for yaml in yamls) if args.sameoptions else None) @@ -205,7 +196,7 @@ def main(args=None) -> tuple[argparse.Namespace, int]: for player in range(1, args.multi + 1): player_path_cache[player] = player_files.get(player, args.weights_file_path) name_counter = Counter() - erargs.player_options = {} + args.player_options = {} player = 1 while player <= args.multi: @@ -218,21 +209,21 @@ def main(args=None) -> tuple[argparse.Namespace, int]: for k, v in vars(settingsObject).items(): if v is not None: try: - getattr(erargs, k)[player] = v + getattr(args, k)[player] = v except AttributeError: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) except Exception as e: raise Exception(f"Error setting {k} to {v} for player {player}") from e # name was not specified - if player not in erargs.name: + if player not in args.name: if path == args.weights_file_path: # weights file, so we need to make the name unique - erargs.name[player] = f"Player{player}" + args.name[player] = f"Player{player}" else: # use the filename - erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) + args.name[player] = os.path.splitext(os.path.split(path)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) player += 1 except Exception as e: @@ -240,10 +231,10 @@ def main(args=None) -> tuple[argparse.Namespace, int]: else: raise RuntimeError(f'No weights specified for player {player}') - if len(set(name.lower() for name in erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in erargs.name.values())}") + if len(set(name.lower() for name in args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in args.name.values())}") - return erargs, seed + return args, seed def read_weights_yamls(path) -> tuple[Any, ...]: diff --git a/Main.py b/Main.py index bc278757..6d81ff23 100644 --- a/Main.py +++ b/Main.py @@ -37,7 +37,7 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None) logger = logging.getLogger() multiworld.set_seed(seed, args.race, str(args.outputname) if args.outputname else None) - multiworld.plando_options = args.plando_options + multiworld.plando_options = args.plando multiworld.game = args.game.copy() multiworld.player_name = args.name.copy() multiworld.sprite = args.sprite.copy() diff --git a/WebHost.py b/WebHost.py index 946eaa11..fd8daeb3 100644 --- a/WebHost.py +++ b/WebHost.py @@ -99,11 +99,11 @@ if __name__ == "__main__": multiprocessing.set_start_method('spawn') logging.basicConfig(format='[%(asctime)s] %(message)s', level=logging.INFO) - from WebHostLib.lttpsprites import update_sprites_lttp from WebHostLib.autolauncher import autohost, autogen, stop from WebHostLib.options import create as create_options_files try: + from WebHostLib.lttpsprites import update_sprites_lttp update_sprites_lttp() except Exception as e: logging.exception(e) diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index 02f5a037..6ca8c1c8 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -12,12 +12,11 @@ from flask import flash, redirect, render_template, request, session, url_for from pony.orm import commit, db_session from BaseClasses import get_seed, seeddigits -from Generate import PlandoOptions, handle_name +from Generate import PlandoOptions, handle_name, mystery_argparse from Main import main as ERmain from Utils import __version__, restricted_dumps from WebHostLib import app from settings import ServerOptions, GeneratorOptions -from worlds.alttp.EntranceRandomizer import parse_arguments from .check import get_yaml_data, roll_options from .models import Generation, STATE_ERROR, STATE_QUEUED, Seed, UUID from .upload import upload_zip_to_db @@ -129,36 +128,39 @@ def gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, seedname = "W" + (f"{random.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)) - erargs = parse_arguments(['--multi', str(playercount)]) - erargs.seed = seed - erargs.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery - erargs.spoiler = meta["generator_options"].get("spoiler", 0) - erargs.race = race - erargs.outputname = seedname - erargs.outputpath = target.name - erargs.teams = 1 - erargs.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", - {"bosses", "items", "connections", "texts"})) - erargs.skip_prog_balancing = False - erargs.skip_output = False - erargs.spoiler_only = False - erargs.csv_output = False + args = mystery_argparse() + args.multi = playercount + args.seed = seed + args.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery + args.spoiler = meta["generator_options"].get("spoiler", 0) + args.race = race + args.outputname = seedname + args.outputpath = target.name + args.teams = 1 + args.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", + {"bosses", "items", "connections", "texts"})) + args.skip_prog_balancing = False + args.skip_output = False + args.spoiler_only = False + args.csv_output = False + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) name_counter = Counter() for player, (playerfile, settings) in enumerate(gen_options.items(), 1): for k, v in settings.items(): if v is not None: - if hasattr(erargs, k): - getattr(erargs, k)[player] = v + if hasattr(args, k): + getattr(args, k)[player] = v else: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) - if not erargs.name[player]: - erargs.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) - if len(set(erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(erargs.name.values())}") - ERmain(erargs, seed, baked_server_options=meta["server_options"]) + if not args.name[player]: + args.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) + if len(set(args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(args.name.values())}") + ERmain(args, seed, baked_server_options=meta["server_options"]) return upload_to_db(target.name, sid, owner, race) thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=1) diff --git a/WebHostLib/lttpsprites.py b/WebHostLib/lttpsprites.py index 9d780b13..3bf596db 100644 --- a/WebHostLib/lttpsprites.py +++ b/WebHostLib/lttpsprites.py @@ -3,10 +3,10 @@ import threading import json from Utils import local_path, user_path -from worlds.alttp.Rom import Sprite def update_sprites_lttp(): + from worlds.alttp.Rom import Sprite from tkinter import Tk from LttPAdjuster import get_image_for_sprite from LttPAdjuster import BackgroundTaskProgress diff --git a/worlds/bumpstik/Items.py b/worlds/bumpstik/Items.py index c714b743..c78668f7 100644 --- a/worlds/bumpstik/Items.py +++ b/worlds/bumpstik/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class BumpStikLttPText(typing.NamedTuple): @@ -117,13 +116,17 @@ item_table = { item: offset + x for x, item in enumerate(LttPCreditsText.keys()) } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update( - {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update( - {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update( - {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update( - {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update( + {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update( + {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update( + {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update( + {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass diff --git a/worlds/meritous/Items.py b/worlds/meritous/Items.py index 9f28c5d1..030c93dd 100644 --- a/worlds/meritous/Items.py +++ b/worlds/meritous/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class MeritousLttPText(typing.NamedTuple): @@ -206,9 +205,13 @@ item_groups = { "Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"] } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass From 8c2d246a537f09caa9a143a021e37e03773a0a96 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Fri, 5 Sep 2025 16:44:01 +0200 Subject: [PATCH 054/204] SC2: Restrict allow Orphan to missions that already require that (#5405) * Restrict Allow Orphan for items to missions that already require that * Add test for build mission orphan behavior * Update item lists for Allow Orphan flag * Update the unit test to clear that BotB is not in the mission list * Update unit test name --- worlds/sc2/__init__.py | 11 +++++---- worlds/sc2/test/test_generation.py | 36 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 0201ebf6..984c716e 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -654,18 +654,21 @@ def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> None: """Adds the `Allowed_Orphan` flag to items that shouldn't be filtered with their parents, like combat shield""" missions = get_all_missions(world.custom_mission_order) - terran_nobuild_missions = any((MissionFlag.Terran|MissionFlag.NoBuild) in mission.flags and mission.campaign != SC2Campaign.NCO for mission in missions) - if terran_nobuild_missions: + if SC2Mission.PIERCING_OF_THE_SHROUD in missions: for item in item_list: if item.name in ( item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, - item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MEDIC_NANO_PROJECTOR, item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM, ): item.flags |= ItemFilterFlags.AllowedOrphan # These rules only trigger on Standard tactics if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard: for item in item_list: - if item.name in (item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_PROGRESSIVE_STIMPACK): + if item.name in ( + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING, item_names.FIREBAT_PROGRESSIVE_STIMPACK + ): item.flags |= ItemFilterFlags.AllowedOrphan if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard: for item in item_list: diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index faedb19a..67e302fe 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -4,7 +4,8 @@ Unit tests for world generation from typing import * from .test_base import Sc2SetupTestBase -from .. import mission_groups, mission_tables, options, locations, SC2Mission, SC2Campaign, SC2Race, unreleased_items +from .. import mission_groups, mission_tables, options, locations, SC2Mission, SC2Campaign, SC2Race, unreleased_items, \ + RequiredTactics from ..item import item_groups, item_tables, item_names from .. import get_all_missions, get_random_first_mission from ..options import EnabledCampaigns, NovaGhostOfAChanceVariant, MissionOrder, ExcludeOverpoweredItems, \ @@ -1226,3 +1227,36 @@ class TestItemFiltering(Sc2SetupTestBase): # A unit nerf happens due to excluding OP items self.assertNotIn(item_names.MOTHERSHIP_INTEGRATED_POWER, starting_inventory) + + def test_terran_nobuild_sections_get_marine_medic_upgrades_with_units_excluded(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name + }, + 'excluded_items': [item_names.MARINE, item_names.MEDIC], + 'shuffle_no_build': False, + 'required_tactics': RequiredTactics.option_standard + } + mm_logic_upgrades = { + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MEDIC_STABILIZER_MEDPACKS + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + missions = self.multiworld.worlds[self.player].custom_mission_order.get_used_missions() + + # These missions are rolled + self.assertIn(SC2Mission.THE_DIG, missions) + self.assertIn(SC2Mission.ENGINE_OF_DESTRUCTION, missions) + # This is not rolled + self.assertNotIn(SC2Mission.PIERCING_OF_THE_SHROUD, missions) + self.assertNotIn(SC2Mission.BELLY_OF_THE_BEAST, missions) + # These items are excluded and shouldn't appear + self.assertNotIn(item_names.MARINE, itempool) + self.assertNotIn(item_names.MEDIC, itempool) + # An upgrade is requested by logic for The Dig and Engine of Destruction + self.assertGreaterEqual(len(set(itempool).intersection(mm_logic_upgrades)), 1) From 5c6dbdd98f54612bd4491e125bee55bc85b09005 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Fri, 5 Sep 2025 16:44:28 +0200 Subject: [PATCH 055/204] SC2: Update docs for Linux launch script to follow the core client migration (#5407) --- worlds/sc2/docs/setup_en.md | 2 +- worlds/sc2/docs/setup_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/sc2/docs/setup_en.md b/worlds/sc2/docs/setup_en.md index 0ddb9a3b..a8d03d5a 100644 --- a/worlds/sc2/docs/setup_en.md +++ b/worlds/sc2/docs/setup_en.md @@ -247,7 +247,7 @@ PATH_TO_ARCHIPELAGO= ARCHIPELAGO="$(ls ${PATH_TO_ARCHIPELAGO:-$(dirname $0)}/Archipelago_*.AppImage | sort -r | head -1)" # Start the Archipelago client -$ARCHIPELAGO Starcraft2Client +$ARCHIPELAGO "Starcraft 2 Client" ``` For Lutris installs, you can run `lutris -l` to get the numerical ID of your StarCraft II install, then run the command diff --git a/worlds/sc2/docs/setup_fr.md b/worlds/sc2/docs/setup_fr.md index 5ce9b4b9..4e7a9663 100644 --- a/worlds/sc2/docs/setup_fr.md +++ b/worlds/sc2/docs/setup_fr.md @@ -203,7 +203,7 @@ PATH_TO_ARCHIPELAGO= ARCHIPELAGO="$(ls ${PATH_TO_ARCHIPELAGO:-$(dirname $0)}/Archipelago_*.AppImage | sort -r | head -1)" # Lance le client de Archipelago -$ARCHIPELAGO Starcraft2Client +$ARCHIPELAGO "Starcraft 2 Client" ``` Pour une installation via Lutris, vous pouvez exécuter `lutris -l` pour obtenir l'identifiant numérique de votre From 90058ee175ef01bfe96def411b518d9f8f130a15 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 5 Sep 2025 16:48:15 +0200 Subject: [PATCH 056/204] CommonClient: fix /items, /locations and /missing not working if the datapackage is local (#5350) --- CommonClient.py | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index bd7113cb..b1d9aeb1 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -99,17 +99,6 @@ class ClientCommandProcessor(CommandProcessor): self.ctx.on_print_json({"data": parts, "cmd": "PrintJSON"}) return True - def get_current_datapackage(self) -> dict[str, typing.Any]: - """ - Return datapackage for current game if known. - - :return: The datapackage for the currently registered game. If not found, an empty dictionary will be returned. - """ - if not self.ctx.game: - return {} - checksum = self.ctx.checksums[self.ctx.game] - return Utils.load_data_package_for_checksum(self.ctx.game, checksum) - def _cmd_missing(self, filter_text = "") -> bool: """List all missing location checks, from your local game state. Can be given text, which will be used as filter.""" @@ -119,8 +108,8 @@ class ClientCommandProcessor(CommandProcessor): count = 0 checked_count = 0 - lookup = self.get_current_datapackage().get("location_name_to_id", {}) - for location, location_id in lookup.items(): + lookup = self.ctx.location_names[self.ctx.game] + for location_id, location in lookup.items(): if filter_text and filter_text not in location: continue if location_id < 0: @@ -141,11 +130,10 @@ class ClientCommandProcessor(CommandProcessor): self.output("No missing location checks found.") return True - def output_datapackage_part(self, key: str, name: str) -> bool: + def output_datapackage_part(self, name: typing.Literal["Item Names", "Location Names"]) -> bool: """ Helper to digest a specific section of this game's datapackage. - :param key: The dictionary key in the datapackage. :param name: Printed to the user as context for the part. :return: Whether the process was successful. @@ -154,23 +142,20 @@ class ClientCommandProcessor(CommandProcessor): self.output(f"No game set, cannot determine {name}.") return False - lookup = self.get_current_datapackage().get(key) - if lookup is None: - self.output("datapackage not yet loaded, try again") - return False - + lookup = self.ctx.item_names if name == "Item Names" else self.ctx.location_names + lookup = lookup[self.ctx.game] self.output(f"{name} for {self.ctx.game}") - for key in lookup: - self.output(key) + for name in lookup.values(): + self.output(name) return True def _cmd_items(self) -> bool: """List all item names for the currently running game.""" - return self.output_datapackage_part("item_name_to_id", "Item Names") + return self.output_datapackage_part("Item Names") def _cmd_locations(self) -> bool: """List all location names for the currently running game.""" - return self.output_datapackage_part("location_name_to_id", "Location Names") + return self.output_datapackage_part("Location Names") def output_group_part(self, group_key: typing.Literal["item_name_groups", "location_name_groups"], filter_key: str, From e23720a9777166472d76041edfe55a707e7ca019 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 5 Sep 2025 16:48:39 +0200 Subject: [PATCH 057/204] LttP: shuffle around gitignore (#5307) --- data/sprites/{custom => alttp/remote}/.gitignore | 0 data/sprites/custom/link.apsprite | 7 ------- data/sprites/remote/.gitignore | 2 -- 3 files changed, 9 deletions(-) rename data/sprites/{custom => alttp/remote}/.gitignore (100%) delete mode 100644 data/sprites/custom/link.apsprite delete mode 100644 data/sprites/remote/.gitignore diff --git a/data/sprites/custom/.gitignore b/data/sprites/alttp/remote/.gitignore similarity index 100% rename from data/sprites/custom/.gitignore rename to data/sprites/alttp/remote/.gitignore diff --git a/data/sprites/custom/link.apsprite b/data/sprites/custom/link.apsprite deleted file mode 100644 index ea0e85c1..00000000 --- a/data/sprites/custom/link.apsprite +++ /dev/null @@ -1,7 +0,0 @@ -author: Nintendo -data: null -game: A Link to the Past -min_format_version: 1 -name: Link -format_version: 1 -sprite_version: 1 \ No newline at end of file diff --git a/data/sprites/remote/.gitignore b/data/sprites/remote/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/data/sprites/remote/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore From 31b2eed1f9c26a9d4f0eeee6adfe6cefb4368e8b Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Fri, 5 Sep 2025 11:09:33 -0400 Subject: [PATCH 058/204] TUNIC: Make the local_fill option show up on the website #5348 --- worlds/tunic/options.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index 79bb033b..ef0130d0 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -209,8 +209,9 @@ class GrassRandomizer(Toggle): class LocalFill(NamedRange): """ Choose the percentage of your filler/trap items that will be kept local or distributed to other TUNIC players with this option enabled. - This option defaults to 95% if you have Grass Randomizer enabled, 40% if you have Breakable Shuffle enabled, 96% if you have both, and 0% otherwise. - If you have Grass Randomizer enabled, this option must be set to 95% or higher to avoid flooding the item pool. The host can remove this restriction by turning off the limit_grass_rando setting in host.yaml. + If you have Grass Randomizer enabled, this defaults to 95%. If you have Breakable Shuffle enabled, this defaults to 40%. If you have both enabled, this defaults to 96%. + If you have Grass Randomizer enabled, this option must be set to 95% or higher to avoid flooding the item pool. + The host can remove this restriction by turning off the limit_grass_rando setting in host.yaml. This setting can only be changed with local generation, it cannot be changed on the website. This option ignores items placed in your local_items or non_local_items. This option does nothing in single player games. """ @@ -222,7 +223,6 @@ class LocalFill(NamedRange): "default": -1 } default = -1 - visibility = Visibility.template | Visibility.complex_ui | Visibility.spoiler class TunicPlandoConnections(PlandoConnections): From 77cab1382754ac01554a078e44648dda2678429b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Fri, 5 Sep 2025 23:20:37 +0200 Subject: [PATCH 059/204] ArchipIDLE: Remove game #5422 --- README.md | 1 - docs/CODEOWNERS | 3 - setup.py | 1 - worlds/archipidle/Items.py | 315 ------------------------ worlds/archipidle/Rules.py | 28 --- worlds/archipidle/__init__.py | 128 ---------- worlds/archipidle/docs/en_ArchipIDLE.md | 13 - worlds/archipidle/docs/guide_en.md | 12 - worlds/archipidle/docs/guide_fr.md | 11 - 9 files changed, 512 deletions(-) delete mode 100644 worlds/archipidle/Items.py delete mode 100644 worlds/archipidle/Rules.py delete mode 100644 worlds/archipidle/__init__.py delete mode 100644 worlds/archipidle/docs/en_ArchipIDLE.md delete mode 100644 worlds/archipidle/docs/guide_en.md delete mode 100644 worlds/archipidle/docs/guide_fr.md diff --git a/README.md b/README.md index 4a0aa614..0431049b 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ Currently, the following games are supported: * Meritous * Super Metroid/Link to the Past combo randomizer (SMZ3) * ChecksFinder -* ArchipIDLE * Hollow Knight * The Witness * Sonic Adventure 2: Battle diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 44eb830b..d0de8332 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -21,9 +21,6 @@ # Aquaria /worlds/aquaria/ @tioui -# ArchipIDLE -/worlds/archipidle/ @LegendaryLinux - # Blasphemous /worlds/blasphemous/ @TRPG0 diff --git a/setup.py b/setup.py index 01342e4e..3f25ade7 100644 --- a/setup.py +++ b/setup.py @@ -65,7 +65,6 @@ from Cython.Build import cythonize non_apworlds: set[str] = { "A Link to the Past", "Adventure", - "ArchipIDLE", "Archipelago", "Lufia II Ancient Cave", "Meritous", diff --git a/worlds/archipidle/Items.py b/worlds/archipidle/Items.py deleted file mode 100644 index 94665631..00000000 --- a/worlds/archipidle/Items.py +++ /dev/null @@ -1,315 +0,0 @@ -item_table = ( - 'An Old GeoCities Profile', - 'Very Funny Joke', - 'Motivational Video', - 'Staples Easy Button', - 'One Million Dollars', - 'Replica Master Sword', - 'VHS Copy of Jurassic Park', - '32GB USB Drive', - 'Pocket Protector', - 'Leftover Parts from IKEA Furniture', - 'Half-Empty Ink Cartridge for a Printer', - 'Watch Battery', - 'Towel', - 'Scarf', - '2012 Magic the Gathering Core Set Starter Box', - 'Poke\'mon Booster Pack', - 'USB Speakers', - 'Eco-Friendly Spork', - 'Cheeseburger', - 'Brand New Car', - 'Hunting Knife', - 'Zippo Lighter', - 'Red Shirt', - 'One-Up Mushroom', - 'Nokia N-GAGE', - '2-Liter of Sprite', - 'Free trial of the critically acclaimed MMORPG Final Fantasy XIV, including the entirety of A Realm Reborn and the award winning Heavensward and Stormblood expansions up to level 70 with no restrictions on playtime!', - 'Can of Compressed Air', - 'Striped Kitten', - 'USB Power Adapter', - 'Fortune Cookie', - 'Nintendo Power Glove', - 'The Lampshade of No Real Significance', - 'Kneepads of Allure', - 'Get Out of Jail Free Card', - 'Box Set of Stargate SG-1 Season 4', - 'The Missing Left Sock', - 'Poster Tube', - 'Electronic Picture Frame', - 'Bottle of Shampoo', - 'Your Mission, Should You Choose To Accept It', - 'Fanny Pack', - 'Robocop T-Shirt', - 'Suspiciously Small Monocle', - 'Table Saw', - 'Cookies and Cream Milkshake', - 'Deflated Accordion', - 'Grandma\'s Homemade Pie', - 'Invisible Lego on the Floor', - 'Pitfall Trap', - 'Flathead Screwdriver', - 'Leftover Pizza', - 'Voodoo Doll that Looks Like You', - 'Pink Shoelaces', - 'Half a Bottle of Scotch', - 'Reminder Not to Forget Aginah', - 'Medicine Ball', - 'Yoga Mat', - 'Chocolate Orange', - 'Old Concert Tickets', - 'The Pick of Destiny', - 'McGuffin', - 'Just a Regular McMuffin', - '34 Tacos', - 'Duct Tape', - 'Copy of Untitled Goose Game', - 'Partially Used Bed Bath & Beyond Gift Card', - 'Mostly Popped Bubble Wrap', - 'Expired Driver\'s License', - 'The Look, You Know the One', - 'Transformers Lunch Box', - 'MP3 Player', - 'Dry Sharpie', - 'Chalkboard Eraser', - 'Overhead Projector', - 'Physical Copy of the Japanese 1.0 Link to the Past', - 'Collectable Action Figure', - 'Box Set of The Lord of the Rings Books', - 'Lite-Bright', - 'Stories from the Good-Old-Days', - 'Un-Reproducable Bug Reports', - 'Autographed Copy of Shaq-Fu', - 'Game-Winning Baseball', - 'Portable Battery Bank', - 'Blockbuster Membership Card', - 'Offensive Bumper Sticker', - 'Last Sunday\'s Crossword Puzzle', - 'Rubik\'s Cube', - 'Your First Grey Hair', - 'Embarrassing Childhood Photo', - 'Abandoned Sphere One Check', - 'The Internet', - 'Late-Night Cartoons', - 'The Correct Usage of a Semicolon', - 'Microsoft Windows 95 Resource Kit', - 'Car-Phone', - 'Walkman Radio', - 'Relevant XKCD Comic', - 'Razor Scooter', - 'Set of Beyblades', - 'Box of Pogs', - 'Beanie-Baby Collection', - 'Laser Tag Gun', - 'Radio Controlled Car', - 'Boogie Board', - 'Air Jordans', - 'Rubber Duckie', - 'The Last Cookie in the Cookie Jar', - 'Tin-Foil Hat', - 'Button-Up Shirt', - 'Designer Brand Bag', - 'Trapper Keeper', - 'Fake Moustache', - 'Colored Pencils', - 'Pair of 3D Glasses', - 'Pair of Movie Tickets', - 'Refrigerator Magnets', - 'NASCAR Dinner Plates', - 'The Final Boss', - 'Unskippable Cutscenes', - '24 Rolls of Toilet Paper', - 'Canned Soup', - 'Warm Blanket', - '3D Printer', - 'Jetpack', - 'Hoverboard', - 'Joycons with No Drift', - 'Double Rainbow', - 'Ping Pong Ball', - 'Area 51 Arcade Cabinet', - 'Elephant in the Room', - 'The Pink Panther', - 'Denim Shorts', - 'Tennis Racket', - 'Collection of Stuffed Animals', - 'Old Cell Phone', - 'Nintendo Virtual Boy', - 'Box of 5.25 Inch Floppy Disks', - 'Bag of Miscellaneous Wires', - 'Garden Shovel', - 'Leather Gloves', - 'Knife of +9 VS Ogres', - 'Old, Smelly Cheese', - 'Linksys BEFSR41 Router', - 'Ethernet Cables for a LAN Party', - 'Mechanical Pencil', - 'Book of Graph Paper', - '300 Sheets of Printer Paper', - 'One AAA Battery', - 'Box of Old Game Controllers', - 'Sega Dreamcast', - 'Mario\'s Overalls', - 'Betamax Player', - 'Stray Lego', - 'Chocolate Chip Pancakes', - 'Two Blueberry Muffins', - 'Nintendo 64 Controller with a Perfect Thumbstick', - 'Cuckoo Crossing the Road', - 'One Eyed, One Horned, Flying Purple People-Eater', - 'Love Potion Number Nine', - 'Wireless Headphones', - 'Festive Keychain', - 'Bundle of Twisted Cables', - 'Plank of Wood', - 'Broken Ant Farm', - 'Thirty-six American Dollars', - 'Can of Shaving Cream', - 'Blue Hair Dye', - 'Mug Engraved with the AP Logo', - 'Tube of Toothpaste', - 'Album of Elevator Music', - 'Headlight Fluid', - 'Tickets to the Renaissance Faire', - 'Bag of Golf Balls', - 'Box of Packing Peanuts', - 'Bottle of Peanut Butter', - 'Breath of the Wild Cookbook', - 'Stardew Valley Cookbook', - 'Thirteen Angry Chickens', - 'Bowl of Cereal', - 'Rubber Snake', - 'Stale Sunflower Seeds', - 'Alarm Clock Without a Snooze Button', - 'Wet Pineapple', - 'Set of Scented Candles', - 'Adorable Stuffed Animal', - 'The Broodwitch', - 'Old Photo Album', - 'Trade Quest Item', - 'Pair of Fancy Boots', - 'Shoddy Pickaxe', - 'Adventurer\'s Sword', - 'Cute Puppy', - 'Box of Matches', - 'Set of Allen Wrenches', - 'Glass of Water', - 'Magic Shaggy Carpet', - 'Macaroni and Cheese', - 'Chocolate Chip Cookie Dough Ice Cream', - 'Fresh Strawberries', - 'Delicious Tacos', - 'The Krabby Patty Recipe', - 'Map to Waldo\'s Location', - 'Stray Cat', - 'Ham and Cheese Sandwich', - 'DVD Player', - 'Motorcycle Helmet', - 'Fake Flowers', - '6-Pack of Sponges', - 'Heated Pants', - 'Empty Glass Bottle', - 'Brown Paper Bag', - 'Model Train Set', - 'TV Remote', - 'RC Car', - 'Super Soaker 9000', - 'Giant Sunglasses', - 'World\'s Smallest Violin', - 'Pile of Fresh Warm Laundry', - 'Half-Empty Ice Cube Tray', - 'Bob Ross Afro Wig', - 'Empty Cardboard Box', - 'Packet of Soy Sauce', - 'Solutions to a Math Test', - 'Pencil Eraser', - 'The Great Pumpkin', - 'Very Expensive Toaster', - 'Pack of Colored Sharpies', - 'Bag of Chocolate Chips', - 'Grandma\'s Homemade Cookies', - 'Collection of Bottle Caps', - 'Pack of Playing Cards', - 'Boom Box', - 'Toy Sail Boat', - 'Smooth Nail File', - 'Colored Chalk', - 'Missing Button', - 'Rubber Band Ball', - 'Joystick', - 'Galaga Arcade Cabinet', - 'Anime Mouse Pad', - 'Orange and Yellow Glow Sticks', - 'Odd Bookmark', - 'Stray Dice', - 'Tooth Picks', - 'Dirty Dishes', - 'Poke\'mon Card Game Rule Book (Gen 1)', - 'Salt Shaker', - 'Digital Thermometer', - 'Infinite Improbability Drive', - 'Fire Extinguisher', - 'Beeping Smoke Alarm', - 'Greasy Spatula', - 'Progressive Auto Insurance', - 'Mace Windu\'s Purple Lightsaber', - 'An Old Fixer-Upper', - 'Gamer Chair', - 'Comfortable Reclining Chair', - 'Shirt Covered in Dog Hair', - 'Angry Praying Mantis', - 'Card Games on Motorcycles', - 'Trucker Hat', - 'The DK Rap', - 'Three Great Balls', - 'Some Very Sus Behavior', - 'Glass of Orange Juice', - 'Turkey Bacon', - 'Bald Barbie Doll', - 'Developer Commentary', - 'Subscription to Nintendo Power Magazine', - 'DeLorean Time Machine', - 'Unkillable Cockroach', - 'Dungeons & Dragons Rulebook', - 'Boxed Copy of Quest 64', - 'James Bond\'s Gadget Wristwatch', - 'Tube of Go-Gurt', - 'Digital Watch', - 'Laser Pointer', - 'The Secret Cow Level', - 'AOL Free Trial CD-ROM', - 'E.T. for Atari 2600', - 'Season 2 of Knight Rider', - 'Spam E-Mails', - 'Half-Life 3 Release Date', - 'Source Code of Jurassic Park', - 'Moldy Cheese', - 'Comic Book Collection', - 'Hardcover Copy of Scott Pilgrim VS the World', - 'Old Gym Shorts', - 'Very Cool Sunglasses', - 'Your High School Yearbook Picture', - 'Written Invitation to Prom', - 'The Star Wars Holiday Special', - 'Oil Change Coupon', - 'Finger Guns', - 'Box of Tabletop Games', - 'Sock Puppets', - 'The Dog of Wisdom', - 'Surprised Chipmunk', - 'Stonks', - 'A Shrubbery', - 'Roomba with a Knife', - 'Wet Cat', - 'The missing moderator, Frostwares', - '1,793 Crossbows', - 'Holographic First Edition Charizard (Gen 1)', - 'VR Headset', - 'Archipelago 1.0 Release Date', - 'Strand of Galadriel\'s Hair', - 'Can of Meow-Mix', - 'Shake-Weight', - 'DVD Collection of Billy Mays Infomercials', - 'Old CD Key', -) diff --git a/worlds/archipidle/Rules.py b/worlds/archipidle/Rules.py deleted file mode 100644 index 2cc6220c..00000000 --- a/worlds/archipidle/Rules.py +++ /dev/null @@ -1,28 +0,0 @@ -from BaseClasses import MultiWorld -from worlds.AutoWorld import LogicMixin - - -class ArchipIDLELogic(LogicMixin): - def _archipidle_location_is_accessible(self, player_id, items_required): - return sum(self.prog_items[player_id].values()) >= items_required - - -def set_rules(world: MultiWorld, player: int): - for i in range(16, 31): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 4) - - for i in range(31, 51): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 10) - - for i in range(51, 101): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 20) - - for i in range(101, 201): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 40) - - world.completion_condition[player] =\ - lambda state: state.can_reach(world.get_location("IDLE item number 200", player), "Location", player) diff --git a/worlds/archipidle/__init__.py b/worlds/archipidle/__init__.py deleted file mode 100644 index f4345444..00000000 --- a/worlds/archipidle/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -from BaseClasses import Item, MultiWorld, Region, Location, Entrance, Tutorial, ItemClassification -from worlds.AutoWorld import World, WebWorld -from datetime import datetime -from .Items import item_table -from .Rules import set_rules - - -class ArchipIDLEWebWorld(WebWorld): - theme = 'partyTime' - tutorials = [ - Tutorial( - tutorial_name='Setup Guide', - description='A guide to playing Archipidle', - language='English', - file_name='guide_en.md', - link='guide/en', - authors=['Farrak Kilhn'] - ), - Tutorial( - tutorial_name='Guide d installation', - description='Un guide pour jouer à Archipidle', - language='Français', - file_name='guide_fr.md', - link='guide/fr', - authors=['TheLynk'] - ) - ] - - -class ArchipIDLEWorld(World): - """ - An idle game which sends a check every thirty to sixty seconds, up to two hundred checks. - """ - game = "ArchipIDLE" - topology_present = False - hidden = (datetime.now().month != 4) # ArchipIDLE is only visible during April - web = ArchipIDLEWebWorld() - - item_name_to_id = {} - start_id = 9000 - for item in item_table: - item_name_to_id[item] = start_id - start_id += 1 - - location_name_to_id = {} - start_id = 9000 - for i in range(1, 201): - location_name_to_id[f"IDLE item number {i}"] = start_id - start_id += 1 - - def set_rules(self): - set_rules(self.multiworld, self.player) - - def create_item(self, name: str) -> Item: - return Item(name, ItemClassification.progression, self.item_name_to_id[name], self.player) - - def create_items(self): - item_pool = [ - ArchipIDLEItem( - item_table[0], - ItemClassification.progression, - self.item_name_to_id[item_table[0]], - self.player - ) - ] - - for i in range(40): - item_pool.append(ArchipIDLEItem( - item_table[1], - ItemClassification.progression, - self.item_name_to_id[item_table[1]], - self.player - )) - - for i in range(40): - item_pool.append(ArchipIDLEItem( - item_table[2], - ItemClassification.filler, - self.item_name_to_id[item_table[2]], - self.player - )) - - item_table_copy = list(item_table[3:]) - self.random.shuffle(item_table_copy) - for i in range(119): - item_pool.append(ArchipIDLEItem( - item_table_copy[i], - ItemClassification.progression if i < 9 else ItemClassification.filler, - self.item_name_to_id[item_table_copy[i]], - self.player - )) - - self.multiworld.itempool += item_pool - - def create_regions(self): - self.multiworld.regions += [ - create_region(self.multiworld, self.player, 'Menu', None, ['Entrance to IDLE Zone']), - create_region(self.multiworld, self.player, 'IDLE Zone', self.location_name_to_id) - ] - - # link up our region with the entrance we just made - self.multiworld.get_entrance('Entrance to IDLE Zone', self.player)\ - .connect(self.multiworld.get_region('IDLE Zone', self.player)) - - def get_filler_item_name(self) -> str: - return self.multiworld.random.choice(item_table) - - -def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): - region = Region(name, player, world) - if locations: - for location_name in locations.keys(): - location = ArchipIDLELocation(player, location_name, locations[location_name], region) - region.locations.append(location) - - if exits: - for _exit in exits: - region.exits.append(Entrance(player, _exit, region)) - - return region - - -class ArchipIDLEItem(Item): - game = "ArchipIDLE" - - -class ArchipIDLELocation(Location): - game: str = "ArchipIDLE" diff --git a/worlds/archipidle/docs/en_ArchipIDLE.md b/worlds/archipidle/docs/en_ArchipIDLE.md deleted file mode 100644 index c3b396c6..00000000 --- a/worlds/archipidle/docs/en_ArchipIDLE.md +++ /dev/null @@ -1,13 +0,0 @@ -# ArchipIDLE - -## What is this game? - -ArchipIDLE was originally the 2022 Archipelago April Fools' Day joke. It is an idle game that sends a location check -on regular intervals. Updated annually with more items, gimmicks, and features, the game is visible -only during the month of April. - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure -and export a config file. - diff --git a/worlds/archipidle/docs/guide_en.md b/worlds/archipidle/docs/guide_en.md deleted file mode 100644 index c450ec42..00000000 --- a/worlds/archipidle/docs/guide_en.md +++ /dev/null @@ -1,12 +0,0 @@ -# ArchipIdle Setup Guide - -## Joining a MultiWorld Game -1. Generate a `.yaml` file from the [ArchipIDLE Player Options Page](/games/ArchipIDLE/player-options) -2. Open the ArchipIDLE Client in your web browser by either: - - Navigate to the [ArchipIDLE Client](http://idle.multiworld.link) - - Download the client and run it locally from the - [ArchipIDLE GitHub Releases Page](https://github.com/ArchipelagoMW/archipidle/releases) -3. Enter the server address in the `Server Address` field and press enter -4. Enter your slot name when prompted. This should be the same as the `name` you entered on the - options page above, or the `name` field in your yaml file. -5. Click the "Begin!" button. diff --git a/worlds/archipidle/docs/guide_fr.md b/worlds/archipidle/docs/guide_fr.md deleted file mode 100644 index dc0c8af3..00000000 --- a/worlds/archipidle/docs/guide_fr.md +++ /dev/null @@ -1,11 +0,0 @@ -# Guide de configuration d'ArchipIdle - -## Rejoindre une partie MultiWorld -1. Générez un fichier `.yaml` à partir de la [page des paramètres du lecteur ArchipIDLE](/games/ArchipIDLE/player-options) -2. Ouvrez le client ArchipIDLE dans votre navigateur Web en : - - Accédez au [Client ArchipIDLE](http://idle.multiworld.link) - - Téléchargez le client et exécutez-le localement à partir du [Page des versions d'ArchipIDLE GitHub](https://github.com/ArchipelagoMW/archipidle/releases) -3. Entrez l'adresse du serveur dans le champ `Server Address` et appuyez sur Entrée -4. Entrez votre nom d'emplacement lorsque vous y êtes invité. Il doit être le même que le `name` que vous avez saisi sur le - page de configuration ci-dessus, ou le champ `name` dans votre fichier yaml. -5. Cliquez sur "Commencer !" bouton. From c5b404baa826facca272cb9bb96f75a90248a073 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Fri, 5 Sep 2025 21:33:13 +0000 Subject: [PATCH 060/204] CI: only trigger release action for bare semver (#5065) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8c5d87b0..147f3094 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ name: Release on: push: tags: - - '*.*.*' + - 'v?[0-9]+.[0-9]+.[0-9]*' env: ENEMIZER_VERSION: 7.1 From c3c517a200d0adf771baf961f5f027a16d75e52c Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sat, 6 Sep 2025 17:09:41 +0000 Subject: [PATCH 061/204] DS3: use yaml.safe_load (#5360) --- worlds/dark_souls_3/detailed_location_descriptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/dark_souls_3/detailed_location_descriptions.py b/worlds/dark_souls_3/detailed_location_descriptions.py index 6e6cf1eb..5a505a0e 100644 --- a/worlds/dark_souls_3/detailed_location_descriptions.py +++ b/worlds/dark_souls_3/detailed_location_descriptions.py @@ -22,7 +22,7 @@ if __name__ == '__main__': response = requests.get(url) if response.status_code != 200: raise Exception(f"Got {response.status_code} when downloading static randomizer locations") - annotations = yaml.load(response.text, Loader=yaml.Loader) + annotations = yaml.safe_load(response.text) static_to_archi_regions = { area['Name']: area['Archipelago'] From 8a091c9e02062ea0f23ee81383b856e255ace926 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:21:36 -0600 Subject: [PATCH 062/204] Kivy: Fix MessageBox popups (#5193) --- data/client.kv | 7 ++----- kvui.py | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/data/client.kv b/data/client.kv index ed63df13..08f4c8d7 100644 --- a/data/client.kv +++ b/data/client.kv @@ -220,6 +220,8 @@ : theme_text_color: "Custom" text_color: 1, 1, 1, 1 +: + height: self.content.texture_size[1] + 80 : layout: layout bar_width: "12dp" @@ -233,8 +235,3 @@ spacing: 10 size_hint_y: None height: self.minimum_height -: - valign: "middle" - halign: "center" - text_size: self.width, None - height: self.texture_size[1] diff --git a/kvui.py b/kvui.py index e11e366d..013cd336 100644 --- a/kvui.py +++ b/kvui.py @@ -720,13 +720,11 @@ class MessageBoxLabel(MDLabel): class MessageBox(Popup): - def __init__(self, title, text, error=False, **kwargs): - label = MessageBoxLabel(text=text) + label = MessageBoxLabel(text=text, padding=("6dp", "0dp")) separator_color = [217 / 255, 129 / 255, 122 / 255, 1.] if error else [47 / 255., 167 / 255., 212 / 255, 1.] super().__init__(title=title, content=label, size_hint=(0.5, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) - self.height += max(0, label.height - 18) class MDNavigationItemBase(MDNavigationItem): From 1b200fb20b5f4b4eec4b2a7df743c8f078cf1868 Mon Sep 17 00:00:00 2001 From: lgbarrere Date: Mon, 8 Sep 2025 10:37:51 +0200 Subject: [PATCH 063/204] Choo-Choo Charles: implement new game and documentations (#5287) * Add cccharles world to AP > The logic has been tested, the game can be completed > The logic is simple and it does not take into account options ! The documentations are a work in progress * Update documentations > Redacted French and English Setup Guides > Redacted French and English Game Pages * Handling PR#5287 remarks > Revert unexpected changes on .run\Archipelago Unittests.run.xml (base Archipelago file) > Fixed typo "querty" -> "qwerty" in fr and eng Game Pages > Adding "Game page in other languages" section to eng Game Page documentation > Improved Steam path in fr and eng Setup Guides * Handled PR remarks + fixes > Added get_filler_item_name() to remove warnings > Fixed irrelevant links for documentations > Used the Player Options page instead of the default YAML on GitHub > Reworded all locations to make them simple and clear > Split some locations that can be linked with an entrance rule > Reworked all options > Updated regions according to locations > Replaced unnecessary rules by rules on entrances * Empty Options.py Only the base options are handled yet, "work in progress" features removed. * Handled PR remark > Fixed specific UT name * Handled PR remarks > UT updated by replacing depreciated features * Add start_inventory_from_pool as option This start_inventory_from_pool option is like regular start inventory but it takes items from the pool and replaces them with fillers Co-authored-by: Scipio Wright * Handled PR remarks > Mainly fixed editorial and minor issues without impact on UT results (still passed) * Update the guides according to releases > Updated the depreciated guides because the may to release the Mod has been changed > Removed the fixed issues from 'Known Issues' > Add the "Mod Download" section to simplify the others sections. * Handled PR remark > base_id reduced to ensure it fits to signed int (32 bits) in case of future AP improvements * Handled PR remarks > Set topology_present to False because unnecessary > Added an exception in case of unknown item instead of using filler classification > Fixed an issue that caused the "Bug Spray" to be considered as filler > Reworked the test_claire_breakers() test to ensure the lighthouse mission can only be finished if at least 4 breakers are collected * Added Choo-Choo Charles to README.md * CCCharles: Added rules to win > The victory could be accessed from sphere 1, this is now fixed by adding the following items as requirements: - Temple Key - Green Egg - Blue Egg - Red Egg --------- Co-authored-by: Scipio Wright --- README.md | 1 + docs/CODEOWNERS | 3 + worlds/cccharles/BaseID.py | 2 + worlds/cccharles/Items.py | 167 ++++ worlds/cccharles/Locations.py | 914 ++++++++++++++++++ worlds/cccharles/Options.py | 7 + worlds/cccharles/Regions.py | 290 ++++++ worlds/cccharles/Rules.py | 215 ++++ worlds/cccharles/__init__.py | 171 ++++ worlds/cccharles/docs/en_Choo-Choo Charles.md | 39 + worlds/cccharles/docs/fr_Choo-Choo Charles.md | 36 + worlds/cccharles/docs/setup_en.md | 52 + worlds/cccharles/docs/setup_fr.md | 52 + worlds/cccharles/test/TestAccess.py | 27 + worlds/cccharles/test/__init__.py | 0 worlds/cccharles/test/bases.py | 5 + 16 files changed, 1981 insertions(+) create mode 100644 worlds/cccharles/BaseID.py create mode 100644 worlds/cccharles/Items.py create mode 100644 worlds/cccharles/Locations.py create mode 100644 worlds/cccharles/Options.py create mode 100644 worlds/cccharles/Regions.py create mode 100644 worlds/cccharles/Rules.py create mode 100644 worlds/cccharles/__init__.py create mode 100644 worlds/cccharles/docs/en_Choo-Choo Charles.md create mode 100644 worlds/cccharles/docs/fr_Choo-Choo Charles.md create mode 100644 worlds/cccharles/docs/setup_en.md create mode 100644 worlds/cccharles/docs/setup_fr.md create mode 100644 worlds/cccharles/test/TestAccess.py create mode 100644 worlds/cccharles/test/__init__.py create mode 100644 worlds/cccharles/test/bases.py diff --git a/README.md b/README.md index 0431049b..fa871905 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Currently, the following games are supported: * shapez * Paint * Celeste (Open World) +* Choo-Choo Charles For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index d0de8332..d5f35888 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -45,6 +45,9 @@ # ChecksFinder /worlds/checksfinder/ @SunCatMC +# Choo-Choo Charles +/worlds/cccharles/ @Yaranorgoth + # Civilization VI /worlds/civ6/ @hesto2 diff --git a/worlds/cccharles/BaseID.py b/worlds/cccharles/BaseID.py new file mode 100644 index 00000000..ab88fb7a --- /dev/null +++ b/worlds/cccharles/BaseID.py @@ -0,0 +1,2 @@ +# CCCharles base ID +base_id = 66600000 diff --git a/worlds/cccharles/Items.py b/worlds/cccharles/Items.py new file mode 100644 index 00000000..0cf7ced0 --- /dev/null +++ b/worlds/cccharles/Items.py @@ -0,0 +1,167 @@ +from BaseClasses import Item +from .BaseID import base_id + + +class CCCharlesItem(Item): + game = "Choo-Choo Charles" + + +optional_items = { + "Scraps": base_id + 1, + "30 Scraps Reward": base_id + 2, + "25 Scraps Reward": base_id + 3, + "35 Scraps Reward": base_id + 4, + "40 Scraps Reward": base_id + 5, + "South Mine Key": base_id + 6, + "North Mine Key": base_id + 7, + "Mountain Ruin Key": base_id + 8, + "Barn Key": base_id + 9, + "Candice's Key": base_id + 10, + "Dead Fish": base_id + 11, + "Lockpicks": base_id + 12, + "Ancient Tablet": base_id + 13, + "Blue Box": base_id + 14, + "Page Drawing": base_id + 15, + "Journal": base_id + 16, + "Timed Dynamite": base_id + 17, + "Box of Rockets": base_id + 18, + "Breaker": base_id + 19, + "Broken Bob": base_id + 20, + "Employment Contracts": base_id + 21, + "Mob Camp Key": base_id + 22, + "Jar of Pickles": base_id + 23 +} + +useless_items = { + "Orange Paint Can": base_id + 24, + "Green Paint Can": base_id + 25, + "White Paint Can": base_id + 26, + "Pink Paint Can": base_id + 27, + "Grey Paint Can": base_id + 28, + "Blue Paint Can": base_id + 29, + "Black Paint Can": base_id + 30, + "Lime Paint Can": base_id + 31, + "Teal Paint Can": base_id + 32, + "Red Paint Can": base_id + 33, + "Purple Paint Can": base_id + 34, + "The Boomer": base_id + 35, + "Bob": base_id + 36 +} + +progression_items = { + "Green Egg": base_id + 37, + "Blue Egg": base_id + 38, + "Red Egg": base_id + 39, + "Remote Explosive": base_id + 40, + "Remote Explosive x8": base_id + 41, # Originally, Paul gives 8 explosives at once + "Temple Key": base_id + 42, + "Bug Spray": base_id + 43 # Should only be considered progressive in Nightmare Mode +} + +item_groups = { + "Weapons": { + "Bug Spray", + "The Boomer", + "Bob" + }, + "Paint Can": { + "Orange Paint Can", + "Green Paint Can", + "White Paint Can", + "Pink Paint Can", + "Grey Paint Can", + "Blue Paint Can", + "Black Paint Can", + "Lime Paint Can", + "Teal Paint Can", + "Red Paint Can", + "Purple Paint Can" + }, + "Train Upgrade": { + "Scraps", + "30 Scraps Reward", + "25 Scraps Reward", + "40 Scraps Reward" + }, + "Dungeon Keys": { + "South Mine Key", + "North Mine Key", + "Mountain Ruin Key" + }, + "Building Keys": { + "Barn Key", + "Candice's Key", + "Mob Camp Key", + "Temple Key" + }, + "Mission Items": { + "Dead Fish", + "Lockpicks", + "Ancient Tablet", + "Blue Box", + "Page Drawing", + "Journal", + "Timed Dynamite", + "Box of Rockets", + "Breaker", + "Broken Bob", + "Employment Contracts", + "Jar of Pickles", + "Remote Explosive", + "Remote Explosive x8" + }, + "Eggs": { + "Green Egg", + "Blue Egg", + "Red Egg" + } +} + + +# All items excepted the duplications (no item amount) +unique_item_dict = {**optional_items, **useless_items, **progression_items} + +# All 691 items to add to the item pool +full_item_list = [] +full_item_list += ["Scraps"] * 637 # 636 + 1 as Scrap Reward (from Ronny) +full_item_list += ["30 Scraps Reward"] * 3 +full_item_list += ["25 Scraps Reward"] * 1 +full_item_list += ["35 Scraps Reward"] * 2 +full_item_list += ["40 Scraps Reward"] * 1 +full_item_list += ["South Mine Key"] * 1 +full_item_list += ["North Mine Key"] * 1 +full_item_list += ["Mountain Ruin Key"] * 1 +full_item_list += ["Barn Key"] * 1 +full_item_list += ["Candice's Key"] * 1 +full_item_list += ["Dead Fish"] * 1 +full_item_list += ["Lockpicks"] * 1 +full_item_list += ["Ancient Tablet"] * 1 +full_item_list += ["Blue Box"] * 1 +full_item_list += ["Page Drawing"] * 8 +full_item_list += ["Journal"] * 1 +full_item_list += ["Timed Dynamite"] * 1 +full_item_list += ["Box of Rockets"] * 1 +full_item_list += ["Breaker"] * 4 +full_item_list += ["Broken Bob"] * 1 +full_item_list += ["Employment Contracts"] * 1 +full_item_list += ["Mob Camp Key"] * 1 +full_item_list += ["Jar of Pickles"] * 1 +full_item_list += ["Orange Paint Can"] * 1 +full_item_list += ["Green Paint Can"] * 1 +full_item_list += ["White Paint Can"] * 1 +full_item_list += ["Pink Paint Can"] * 1 +full_item_list += ["Grey Paint Can"] * 1 +full_item_list += ["Blue Paint Can"] * 1 +full_item_list += ["Black Paint Can"] * 1 +full_item_list += ["Lime Paint Can"] * 1 +full_item_list += ["Teal Paint Can"] * 1 +full_item_list += ["Red Paint Can"] * 1 +full_item_list += ["Purple Paint Can"] * 1 +full_item_list += ["The Boomer"] * 1 +full_item_list += ["Bob"] * 1 +full_item_list += ["Green Egg"] * 1 +full_item_list += ["Blue Egg"] * 1 +full_item_list += ["Red Egg"] * 1 +full_item_list += ["Remote Explosive x8"] * 1 +full_item_list += ["Temple Key"] * 1 +full_item_list += ["Bug Spray"] * 1 diff --git a/worlds/cccharles/Locations.py b/worlds/cccharles/Locations.py new file mode 100644 index 00000000..63b502bc --- /dev/null +++ b/worlds/cccharles/Locations.py @@ -0,0 +1,914 @@ +from BaseClasses import Location +from .BaseID import base_id + + +class CCCharlesLocation(Location): + game = "Choo-Choo Charles" + +# "First Station": +# /!\ NOT CONSIDERED YET: train_keypickup Train_KeyPickup Photorealistic_Island (X=-8816.341 Y=23392.416 Z=10219.855) + +loc_start_camp = { + "Start Camp Scraps 1": base_id + 1000, # ItemPickup139_5 Camp (X=24006.348 Y=53777.297 Z=10860.107) + "Start Camp Scraps 2": base_id + 1001 # ItemPickup140_8 Camp (X=23951.754 Y=54897.230 Z=10895.235) +} + +loc_tony_tiddle_mission = { + "Barn Tony Tiddle Mission Start": base_id + 1002 # (dialog 5) -> barn_key (1) +} + +loc_barn = { + "Barn Scraps 1": base_id + 1003, # ItemPickup12 Photorealistic_Island (X=70582.805 Y=52591.066 Z=11976.719) + "Barn Scraps 2": base_id + 1004, # ItemPickup4_2 Photorealistic_Island (X=70536.641 Y=51890.633 Z=11986.488) + "Barn Scraps 3": base_id + 1005, # ItemPickup6 Photorealistic_Island (X=70750.336 Y=52275.828 Z=11994.434) + "Barn Scraps 4": base_id + 1006, # ItemPickup11 Photorealistic_Island (X=70937.719 Y=52989.066 Z=12003.523) + "Barn Scraps 5": base_id + 1007, # ItemPickup5 Photorealistic_Island (X=71303.508 Y=52232.188 Z=12003.997) + "Barn Scraps 6": base_id + 1008, # ItemPickup7 Photorealistic_Island (X=71678.672 Y=52825.531 Z=11977.212) + "Barn Scraps 7": base_id + 1009, # ItemPickup8 Photorealistic_Island (X=71506.961 Y=52357.293 Z=12362.159) + "Barn Scraps 8": base_id + 1010, # ItemPickup9 Photorealistic_Island (X=71029.875 Y=52384.613 Z=12362.159) + "Barn Scraps 9": base_id + 1011 # ItemPickup10 Photorealistic_Island (X=71129.594 Y=52600.262 Z=12364.142) +} + +loc_candice_mission = { + "Tutorial House Candice Mission Start": base_id + 1012 # (dialog 3) -> candice_key (2) +} + +loc_tutorial_house = { + "Tutorial House Scraps 1": base_id + 1013, # ItemPickup17_2 Photorealistic_Island (X=74745.852 Y=73865.555 Z=11426.619) + "Tutorial House Scraps 2": base_id + 1014, # ItemPickup18_2 Photorealistic_Island (X=74864.102 Y=73900.094 Z=11426.619) + "Tutorial House Scraps 3": base_id + 1015, # ItemPickup14_2 Photorealistic_Island (X=74877.625 Y=73738.594 Z=11422.057) \!/ Existing match 4 + "Tutorial House Scraps 4": base_id + 1016, # ItemPickup15_8 Photorealistic_Island (X=75068.992 Y=73971.133 Z=11426.619) + "Tutorial House Scraps 5": base_id + 1017, # ItemPickup21_1 Photorealistic_Island (X=74923.500 Y=73571.648 Z=11426.619) + "Tutorial House Scraps 6": base_id + 1018, # ItemPickup19 Photorealistic_Island (X=75194.906 Y=73495.719 Z=11426.619) + "Tutorial House Scraps 7": base_id + 1019, # ItemPickup13_3 Photorealistic_Island (X=75320.102 Y=73446.352 Z=11487.376) + "Tutorial House Scraps 8": base_id + 1020, # ItemPickup20 Photorealistic_Island (X=75298.680 Y=73580.531 Z=11426.619) + "Tutorial House Scraps 9": base_id + 1021 # ItemPickup16_3 Photorealistic_Island (X=75310.008 Y=73770.742 Z=11489.709) +} + +loc_swamp_edges = { + "Swamp Edges Scraps 1": base_id + 1022, # ItemPickup465_67 Swamp_EnvironmentDetails (X=81964.398 Y=72167.305 Z=10116.385) + "Swamp Edges Scraps 2": base_id + 1023, # ItemPickup460_52 Swamp_EnvironmentDetails (X=89674.047 Y=71610.008 Z=9482.095) + "Swamp Edges Scraps 3": base_id + 1024, # ItemPickup459_49 Swamp_EnvironmentDetails (X=91637.156 Y=73345.672 Z=9492.019) + "Swamp Edges Scraps 4": base_id + 1025, # ItemPickup458_46 Swamp_EnvironmentDetails (X=94601.117 Y=75064.117 Z=9567.464) + "Swamp Edges Scraps 5": base_id + 1026, # ItemPickup457_43 Swamp_EnvironmentDetails (X=95536.641 Y=72622.969 Z=9512.531) + "Swamp Edges Scraps 6": base_id + 1027, # ItemPickup456_40 Swamp_EnvironmentDetails (X=96419.922 Y=65508.676 Z=9838.949) + "Swamp Edges Scraps 7": base_id + 1028, # ItemPickup455_37 Swamp_EnvironmentDetails (X=98158.680 Y=63191.629 Z=10477.084) + "Swamp Edges Scraps 8": base_id + 1029, # ItemPickup55_29 Swamp_EnvironmentDetails (X=93421.820 Y=59200.461 Z=9545.312) + "Swamp Edges Scraps 9": base_id + 1030, # ItemPickup453_31 Swamp_EnvironmentDetails(X=92951.648 Y=56453.527 Z=9560.638) + "Swamp Edges Scraps 10": base_id + 1031, # ItemPickup454_34 Swamp_EnvironmentDetails (X=96943.297 Y=58754.043 Z=10728.124) + "Swamp Edges Scraps 11": base_id + 1032, # ItemPickup452_28 Swamp_EnvironmentDetails (X=95000.617 Y=53070.859 Z=10258.078) + "Swamp Edges Scraps 12": base_id + 1033, # ItemPickup451_25 Swamp_EnvironmentDetails (X=91390.703 Y=53628.707 Z=9498.378) + "Swamp Edges Scraps 13": base_id + 1034, # ItemPickup53_23 Swamp_EnvironmentDetails (X=87628.742 Y=51614.957 Z=9487.013) + "Swamp Edges Scraps 14": base_id + 1035, # ItemPickup448_16 Swamp_EnvironmentDetails (X=89785.992 Y=48603.844 Z=9573.859) + "Swamp Edges Scraps 15": base_id + 1036, # ItemPickup447_11 Swamp_EnvironmentDetails (X=89925.383 Y=46288.707 Z=9499.904) + "Swamp Edges Scraps 16": base_id + 1037, # ItemPickup446_8 Swamp_EnvironmentDetails (X=90848.938 Y=43133.535 Z=9729.535) + "Swamp Edges Scraps 17": base_id + 1038, # ItemPickup445_5 Swamp_EnvironmentDetails (X=87382.383 Y=42475.191 Z=9509.929) + "Swamp Edges Scraps 18": base_id + 1039, # ItemPickup444_2 Swamp_EnvironmentDetails (X=87481.820 Y=39316.820 Z=9757.511) + "Swamp Edges Scraps 19": base_id + 1040, # ItemPickup54_26 Swamp_EnvironmentDetails (X=86039.180 Y=37135.004 Z=9826.263) + "Swamp Edges Scraps 20": base_id + 1041, # ItemPickup475_97 Swamp_EnvironmentDetails (X=81798.609 Y=36766.922 Z=9479.318) + "Swamp Edges Scraps 21": base_id + 1042, # ItemPickup474_94 Swamp_EnvironmentDetails (X=79254.055 Y=40120.293 Z=9879.539) + "Swamp Edges Scraps 22": base_id + 1043, # ItemPickup473_91 Swamp_EnvironmentDetails (X=82251.773 Y=42454.027 Z=9482.057) + "Swamp Edges Scraps 23": base_id + 1044, # ItemPickup472_88 Swamp_EnvironmentDetails (X=84903.977 Y=48323.543 Z=9503.382) + "Swamp Edges Scraps 24": base_id + 1045, # ItemPickup471_85 Swamp_EnvironmentDetails (X=84238.609 Y=51239.547 Z=9529.745) + "Swamp Edges Scraps 25": base_id + 1046, # ItemPickup470_82 Swamp_EnvironmentDetails (X=84439.063 Y=53501.563 Z=9491.291) + "Swamp Edges Scraps 26": base_id + 1047, # ItemPickup52_20 Swamp_EnvironmentDetails (X=83025.086 Y=53275.348 Z=9694.177) + "Swamp Edges Scraps 27": base_id + 1048, # ItemPickup469_79 Swamp_EnvironmentDetails (X=79827.055 Y=54791.504 Z=10121.452) + "Swamp Edges Scraps 28": base_id + 1049, # ItemPickup468_76 Swamp_EnvironmentDetails (X=82266.461 Y=58126.316 Z=9660.493) + "Swamp Edges Scraps 29": base_id + 1050, # ItemPickup467_73 Swamp_EnvironmentDetails (X=75911.297 Y=65155.836 Z=10660.832) + "Swamp Edges Scraps 30": base_id + 1051, # ItemPickup466_70 Swamp_EnvironmentDetails (X=81171.641 Y=66836.125 Z=9673.756) + "Swamp Edges Scraps 31": base_id + 1052, # ItemPickup449_19 Swamp_EnvironmentDetails (X=95254.992 Y=40910.563 Z=10503.727) + "Swamp Edges Scraps 32": base_id + 1053 # ItemPickup450_22 Swamp_EnvironmentDetails (X=93992.992 Y=50773.484 Z=10238.064) +} + +loc_swamp_mission = { + "Swamp Shack Scraps 1": base_id + 1054, # ItemPickup51_17 Swamp_EnvironmentDetails (X=87685.797 Y=69754.008 Z=9629.617) + "Swamp Shack Scraps 2": base_id + 1055, # ItemPickup461_55 Swamp_EnvironmentDetails (X=87308.883 Y=69096.789 Z=9624.543) + "Swamp Islet Scraps 1": base_id + 1056, # ItemPickup462_58 Swamp_EnvironmentDetails (X=88101.219 Y=64553.148 Z=9557.692) + "Swamp Islet Scraps 2": base_id + 1057, # ItemPickup463_61 Swamp_EnvironmentDetails (X=87100.922 Y=63590.965 Z=9582.900) + "Swamp Islet Scraps 3": base_id + 1058, # ItemPickup464_64 Swamp_EnvironmentDetails (X=86399.656 Y=64290.805 Z=9493.576) + "Swamp Islet Dead Fish": base_id + 1059, # Swamp_FishPickup Swamp_EnvironmentDetails (X=87288.945 Y=64278.273 Z=9550.320) + "Swamp Lizbeth Murkwater Mission End": base_id + 1060 # (dialog 2) -> 30_scraps_reward +} + +loc_junkyard_area = { + "Junkyard Area Scraps 1": base_id + 1061, # ItemPickup185_29 Junkyard_Details1 (X=94184.391 Y=89760.258 Z=9331.188) + "Junkyard Area Scraps 2": base_id + 1062, # ItemPickup177_5 Junkyard_Details1 (X=91919.469 Y=89681.602 Z=9407.639) + "Junkyard Area Scraps 3": base_id + 1063, # ItemPickup46_5 Junkyard_Details (X=91696.078 Y=90453.563 Z=9480.997) + "Junkyard Area Scraps 4": base_id + 1064, # ItemPickup178_8 Junkyard_Details1 (X=92453.719 Y=91142.531 Z=9398.951) + "Junkyard Area Scraps 5": base_id + 1065, # ItemPickup182_20 Junkyard_Details1 (X=88645.453 Y=90374.930 Z=9507.291) + "Junkyard Area Scraps 6": base_id + 1066, # ItemPickup48_11 Junkyard_Details (X=88461.953 Y=92077.531 Z=9712.173) + "Junkyard Area Scraps 7": base_id + 1067, # ItemPickup49_14 Junkyard_Details (X=91521.555 Y=93773.641 Z=9421.457) + "Junkyard Area Scraps 8": base_id + 1068, # ItemPickup50_17 Junkyard_Details (X=94741.484 Y=92565.938 Z=9221.093) + "Junkyard Area Scraps 9": base_id + 1069, # ItemPickup186_32 Junkyard_Details1 (X=95256.008 Y=91356.789 Z=9251.082) + "Junkyard Area Scraps 10": base_id + 1070, # ItemPickup45_2 Junkyard_Details (X=94289.664 Y=89951.477 Z=9367.076) + "Junkyard Area Daryl Mission Start": base_id + 1071, # (dialog 4) -> Lockpicks (4) + "Junkyard Area Chest Ancient Tablet": base_id + 1072, # Junkyard_TabletPickup Junkyard_Details (X=90715.367 Y=92168.563 Z=9402.729) + "Junkyard Area Daryl Mission End": base_id + 1073 # (dialog 3) -> 25_scraps_reward +} + +loc_south_house = { + "South House Scraps 1": base_id + 1074, # ItemPickup361_26 Secret12_ExteriorDetails (X=85865.969 Y=103869.656 Z=9453.063) + "South House Scraps 2": base_id + 1075, # ItemPickup360_23 Secret12_ExteriorDetails (X=84403.742 Y=107229.039 Z=9067.245) + "South House Scraps 3": base_id + 1076, # ItemPickup359_20 Secret12_ExteriorDetails (X=83389.789 Y=108817.992 Z=8752.255) + "South House Scraps 4": base_id + 1077, # ItemPickup353_2 Secret12_ExteriorDetails (X=82413.547 Y=109697.477 Z=8637.677) + "South House Scraps 5": base_id + 1078, # ItemPickup354_5 Secret12_ExteriorDetails (X=83000.359 Y=110323.664 Z=8560.229) + "South House Scraps 6": base_id + 1079, # ItemPickup358_17 Secret12_ExteriorDetails (X=82072.625 Y=110482.664 Z=8682.441) + "South House Scraps 7": base_id + 1080, # ItemPickup24_30 Secret12_Details (X=81970.766 Y=111082.117 Z=8647.703) + "South House Scraps 8": base_id + 1081, # ItemPickup356_11 Secret12_ExteriorDetails (X=80915.375 Y=108689.758 Z=8377.754) + "South House Scraps 9": base_id + 1082, # ItemPickup355_8 Secret12_ExteriorDetails (X=81762.180 Y=111371.023 Z=7876.312) + "South House Scraps 10": base_id + 1083, # ItemPickup357_14 Secret12_ExteriorDetails (X=80663.336 Y=113306.695 Z=7226.475) + "South House Scraps 11": base_id + 1084, # ItemPickup23_21 Secret12_Details (X=80520.367 Y=113747.039 Z=7252.808) + "South House Scraps 12": base_id + 1085, # ItemPickup22_18 Secret12_Details (X=80830.273 Y=113871.383 Z=7201.687) + "South House Chest Scraps 1": base_id + 1086, # ItemPickup21 Secret12_Details (X=82079.922 Y=110808.602 Z=8739.324) + "South House Chest Scraps 2": base_id + 1087, # ItemPickup18 Secret12_Details (X=82102.664 Y=110813.664 Z=8726.308) + "South House Chest Scraps 3": base_id + 1088, # ItemPickup17 Secret12_Details (X=82091.547 Y=110810.906 Z=8721.354) \!/ Existing match 1 + "South House Chest Scraps 4": base_id + 1089, # ItemPickup16 Secret12_Details (X=82102.664 Y=110813.664 Z=8708.337) KO + "South House Chest Scraps 5": base_id + 1090, # ItemPickup14 Secret12_Details (X=82091.516 Y=110810.898 Z=8701.793) \!/ Existing match 3 + "South House Chest Scraps 6": base_id + 1091 # ItemPickup13_7 Secret12_Details (X=82102.664 Y=110813.625 Z=8688.776) +} + +loc_junkyard_shed = { + "Junkyard Shed Helen Mission Start": base_id + 1092, # (dialog 8) -> south_mine_key (6) + "Junkyard Shed Scraps 1": base_id + 1093, # ItemPickup424_23 Settlement_A_House_1 (X=98303.992 Y=84476.016 Z=9376.540) + "Junkyard Shed Scraps 2": base_id + 1094, # ItemPickup419_8 Settlement_A_House_1 (X=98174.680 Y=84067.383 Z=9249.197) + "Junkyard Shed Scraps 3": base_id + 1095, # ItemPickup418_5 Settlement_A_House_1 (X=97948.977 Y=83354.656 Z=9339.430) + "Junkyard Shed Scraps 4": base_id + 1096, # ItemPickup417_2 Settlement_A_House_1 (X=98208.391 Y=83088.047 Z=9273.632) + "Junkyard Shed Scraps 5": base_id + 1097, # ItemPickup420_11 Settlement_A_House_1 (X=97757.773 Y=82995.656 Z=9298.597) + "Junkyard Shed Scraps 6": base_id + 1098, # ItemPickup422_17 Settlement_A_House_1 (X=98776.102 Y=80881.133 Z=9286.782) + "Junkyard Shed Scraps 7": base_id + 1099, # ItemPickup421_14 Settlement_A_House_1 (X=99198.508 Y=82057.820 Z=9248.227) + "Junkyard Shed Scraps 8": base_id + 1100 # ItemPickup423_20 Settlement_A_House_1 (X=99208.617 Y=84383.125 Z=9257.880) +} + +loc_military_base = { + "Military Base Sgt Flint Mission End": base_id + 1101, # (dialog 2) -> bug_spray + "Military Base Scraps 1": base_id + 1102, # ItemPickup134_17 Bugspray_Main (X=105743.531 Y=83017.492 Z=9423.290) + "Military Base Scraps 2": base_id + 1103, # ItemPickup129_2 Bugspray_Main (X=108495.805 Y=81616.992 Z=9139.340) + "Military Base Scraps 3": base_id + 1104, # ItemPickup135_20 Bugspray_Main (X=108709.219 Y=85981.016 Z=9650.472) + "Military Base Scraps 4": base_id + 1105, # ItemPickup130_5 Bugspray_Main (X=112004.195 Y=83811.313 Z=8887.996) + "Military Base Scraps 5": base_id + 1106, # ItemPickup131_8 Bugspray_Main (X=110904.867 Y=82024.781 Z=9581.007) + "Military Base Scraps 6": base_id + 1107, # ItemPickup132_11 Bugspray_Main (X=112458.563 Y=81967.945 Z=9850.968) + "Military Base Scraps 7": base_id + 1108, # ItemPickup22_9 Bugspray_Details (X=112541.695 Y=81345.875 Z=9896.940) + "Military Base Scraps 8": base_id + 1109, # ItemPickup133_14 Bugspray_Main (X=111943.391 Y=79970.016 Z=10025.820) + "Military Base Scraps 9": base_id + 1110, # ItemPickup24_8 Bugspray_Details (X=112074.063 Y=83533.398 Z=9008.831) + "Military Base Scraps 10": base_id + 1111, # ItemPickup23_2 Bugspray_Details (X=110738.523 Y=85389.852 Z=9082.626) + "Military Base Scraps 11": base_id + 1112, # ItemPickup136_23 Bugspray_Main (X=112962.594 Y=85872.922 Z=8638.805) + "Military Base Scraps 12": base_id + 1113, # ItemPickup137_26 Bugspray_Main (X=116230.563 Y=84357.602 Z=8580.226) + "Military Base Orange Paint Can": base_id + 1114 # PaintCan_5 Bugspray_Details (X=111916.102 Y=83066.195 Z=9094.554) +} + +loc_south_mine_outside = { + "South Mine Outside Scraps 1": base_id + 1115, # ItemPickup20_1 Mine_1_OutsideMain (X=114794.375 Y=57211.855 Z=8523.348) + "South Mine Outside Scraps 2": base_id + 1116, # ItemPickup15_2 Mine_1_OutsideDetails (X=112523.438 Y=57693.836 Z=8639.382) + "South Mine Outside Scraps 3": base_id + 1117, # ItemPickup22_5 Mine_1_OutsideMain (X=112348.586 Y=59174.289 Z=8945.143) + "South Mine Outside Scraps 4": base_id + 1118, # ItemPickup13_2 Mine_1_OutsideDetails (X=110989.156 Y=57840.090 Z=8700.936) + "South Mine Outside Scraps 5": base_id + 1119, # ItemPickup16_1 Mine_1_OutsideDetails (X=110487.281 Y=54528.535 Z=8589.910) + "South Mine Outside Scraps 6": base_id + 1120, # ItemPickup18_1 Mine_1_OutsideMain (X=113727.297 Y=54791.703 Z=8424.460) + "South Mine Outside Scraps 7": base_id + 1121 # ItemPickup17_3 Mine_1_OutsideMain (X=113965.211 Y=53289.539 Z=8402.346) +} + +loc_south_mine_inside = { + "South Mine Inside Scraps 1": base_id + 1122, # ItemPickup23_4 Mine_1_Interior_1 (X=108659.945 Y=58712.691 Z=8763.015) + "South Mine Inside Scraps 2": base_id + 1123, # ItemPickup24_0 Mine_1_Interior_1 (X=104954.602 Y=61540.488 Z=7876.374) + "South Mine Inside Scraps 3": base_id + 1124, # ItemPickup26_0 Mine_1_Interior_1 (X=104436.758 Y=64091.211 Z=7872.767) + "South Mine Inside Scraps 4": base_id + 1125, # ItemPickup290_20 Mine_1_Interior_2 (X=101356.625 Y=66110.906 Z=8034.738) + "South Mine Inside Scraps 5": base_id + 1126, # ItemPickup287_8 Mine_1_Interior_2 (X=96888.820 Y=64458.559 Z=7917.468) + "South Mine Inside Scraps 6": base_id + 1127, # ItemPickup289_14 Mine_1_Interior_2 (X=95863.180 Y=63252.902 Z=7847.054) + "South Mine Inside Scraps 7": base_id + 1128, # ItemPickup288_11 Mine_1_Interior_2 (X=97337.219 Y=62921.438 Z=7884.393) + "South Mine Inside Scraps 8": base_id + 1129, # ItemPickup285_2 Mine_1_Interior_2 (X=96689.203 Y=61880.895 Z=7806.810) + "South Mine Inside Scraps 9": base_id + 1130, # ItemPickup286_5 Mine_1_Interior_2 (X=98403.227 Y=62812.531 Z=7880.947) + "South Mine Inside Green Egg": base_id + 1131, # ItemPickup14_2 Mine_1_Interior_2 (X=96753.219 Y=62909.504 Z=8030.018) \!/ Existing match 4 + "South Mine Inside Green Paint Can": base_id + 1132 # PaintCan_2 Mine_1_Interior_1 (X=108293.281 Y=64192.094 Z=7872.770) \!/ Existing match 5 +} + +loc_middle_station = { + "Middle Station White Paint Can": base_id + 1133, # PaintCan_2 Station_Details1 (X=34554.141 Y=-7395.408 Z=11897.556) \!/ Existing match 5 + "Middle Station Scraps 1": base_id + 1134, # ItemPickup431_20 Station_BuildingDetails (X=37710.504 Y=-6462.562 Z=11356.691) + "Middle Station Scraps 2": base_id + 1135, # ItemPickup425_2 Station_BuildingDetails (X=37034.340 Y=-4923.256 Z=11348.328) + "Middle Station Scraps 3": base_id + 1136, # ItemPickup427_8 Station_BuildingDetails (X=36689.164 Y=-3727.466 Z=11353.597) + "Middle Station Scraps 4": base_id + 1137, # ItemPickup426_5 Station_BuildingDetails (X=37207.629 Y=-3393.977 Z=11379.110) + "Middle Station Scraps 5": base_id + 1138, # ItemPickup429_14 Station_BuildingDetails (X=37988.219 Y=-3365.906 Z=11350.225) + "Middle Station Scraps 6": base_id + 1139, # ItemPickup428_11 Station_BuildingDetails (X=36956.242 Y=-2746.948 Z=11353.506) + "Middle Station Scraps 7": base_id + 1140, # ItemPickup430_17 Station_BuildingDetails (X=36638.492 Y=-6410.017 Z=11353.546) + "Middle Station Scraps 8": base_id + 1141, # ItemPickup433_26 Station_BuildingDetails (X=35931.168 Y=-7558.021 Z=11899.232) + "Middle Station Scraps 9": base_id + 1142, # ItemPickup434 Station_BuildingDetails (X=35636.855 Y=-7628.500 Z=11903.627) + "Middle Station Scraps 10": base_id + 1143, # ItemPickup435 Station_BuildingDetails (X=34894.152 Y=-7537.087 Z=11903.627) + "Middle Station Scraps 11": base_id + 1144, # ItemPickup13_4 Station_BuildingDetails (X=33505.609 Y=-7742.843 Z=11898.971) + "Middle Station Scraps 12": base_id + 1145, # ItemPickup440_5 Station_Details1 (X=37394.004 Y=-8395.084 Z=11389.296) + "Middle Station Scraps 13": base_id + 1146, # ItemPickup432_23 Station_BuildingDetails (X=36040.695 Y=-8068.016 Z=11456.609) + "Middle Station Scraps 14": base_id + 1147, # ItemPickup16_4 Station_BuildingDetails (X=35360.320 Y=-8441.443 Z=11457.823) + "Middle Station Scraps 15": base_id + 1148, # ItemPickup439_2 Station_Details1 (X=36311.324 Y=-9563.938 Z=11468.039) + "Middle Station Scraps 16": base_id + 1149, # ItemPickup442_11 Station_Details1 (X=33335.656 Y=-13872.785 Z=11189.906) + "Middle Station Scraps 17": base_id + 1150, # ItemPickup441_8 Station_Details1 (X=33129.984 Y=-14073.978 Z=11189.906) + "Middle Station Scraps 18": base_id + 1151, # ItemPickup436_31 Station_BuildingDetails (X=33587.488 Y=-7828.651 Z=11529.446) + "Middle Station Scraps 19": base_id + 1152, # ItemPickup14_3 Station_BuildingDetails (X=34007.254 Y=-7749.381 Z=11533.760) + "Middle Station Scraps 20": base_id + 1153, # ItemPickup443_14 Station_Details1 (X=31457.752 Y=-7120.744 Z=11421.197) + "Middle Station Theodore Mission End": base_id + 1154 # (dialog 2) -> 35_scraps_reward + # "Middle Station Scraps Glitch 1" ItemPickup437_34 (X=34217.613 Y=-9481.271 Z=11505.686) /!\ Glitched scrap + # "Middle Station Scraps Glitch 2" ItemPickup438_37 (X=36101.633 Y=-10459.024 Z=11385.937) /!\ Glitched scrap +} + +loc_canyon = { + "Canyon Scraps 1": base_id + 1155, # ItemPickup156_47 Canyon_Main (X=29432.162 Y=-3164.300 Z=11540.294) + "Canyon Scraps 2": base_id + 1156, # ItemPickup155_44 Canyon_Main (X=26331.086 Y=3036.740 Z=11701.688) + "Canyon Scraps 3": base_id + 1157, # ItemPickup154_41 Canyon_Main (X=22688.129 Y=3906.730 Z=12249.182) + "Canyon Scraps 4": base_id + 1158, # ItemPickup147_20 Canyon_Main (X=20546.193 Y=4371.471 Z=12128.874) + "Canyon Scraps 5": base_id + 1159, # ItemPickup148_23 Canyon_Main (X=20006.584 Y=4928.478 Z=12174.837) + "Canyon Scraps 6": base_id + 1160, # ItemPickup146_17 Canyon_Main (X=19251.633 Y=3798.014 Z=12170.390) + "Canyon Scraps 7": base_id + 1161, # ItemPickup149_26 Canyon_Main (X=18302.678 Y=7323.849 Z=12595.085) + "Canyon Scraps 8": base_id + 1162, # ItemPickup150_29 Canyon_Main (X=19019.563 Y=8172.146 Z=12640.462) + "Canyon Scraps 9": base_id + 1163, # ItemPickup142_5 Canyon_Main (X=18001.689 Y=11138.320 Z=13035.360) + "Canyon Scraps 10": base_id + 1164, # ItemPickup143_8 Canyon_Main (X=16381.525 Y=7191.394 Z=13682.453) + "Canyon Scraps 11": base_id + 1165, # ItemPickup144_11 Canyon_Main (X=18294.928 Y=7870.372 Z=14350.015) + "Canyon Scraps 12": base_id + 1166, # ItemPickup31_2 CanyonCamp_Details (X=20730.520 Y=8032.158 Z=14439.826) + "Canyon Scraps 13": base_id + 1167, # ItemPickup145_14 Canyon_Main (X=24752.658 Y=7959.624 Z=14363.087) + "Canyon Scraps 14": base_id + 1168, # ItemPickup141_2 Canyon_Main (X=20181.992 Y=13816.017 Z=14897.407) + "Canyon Scraps 15": base_id + 1169, # ItemPickup151_32 Canyon_Main (X=23172.160 Y=2842.120 Z=12954.566) + "Canyon Scraps 16": base_id + 1170, # ItemPickup152_35 Canyon_Main (X=22307.621 Y=-1180.840 Z=12451.548) + "Canyon Scraps 17": base_id + 1171, # ItemPickup153_38 Canyon_Main (X=28473.596 Y=6741.842 Z=13314.166) + "Canyon Blue Box": base_id + 1172 # Canyon_BlueBoxPickup CanyonCamp_Details (X=20338.525 Y=4989.111 Z=12323.649) +} + +loc_watchtower = { + "Watchtower Scraps 1": base_id + 1173, # ItemPickup373_13 Secret2_WatchTowerDetails (X=32760.389 Y=-28814.084 Z=10997.447) + "Watchtower Scraps 2": base_id + 1174, # ItemPickup22_6 Secret2_WatchTowerDetails (X=32801.668 Y=-31660.041 Z=10643.390) + "Watchtower Scraps 3": base_id + 1175, # ItemPickup372_10 Secret2_WatchTowerDetails (X=31018.063 Y=-33375.313 Z=11100.126) + "Watchtower Scraps 4": base_id + 1176, # ItemPickup22_16 Secret2_WatchTowerDetails (X=33308.215 Y=-35928.578 Z=10614.347) + "Watchtower Scraps 5": base_id + 1177, # ItemPickup22_2 Secret2_WatchTowerDetails (X=34304.262 Y=-33446.063 Z=10674.936) + "Watchtower Scraps 6": base_id + 1178, # ItemPickup370_2 Secret2_WatchTowerDetails (X=32869.453 Y=-33184.094 Z=10612.040) + "Watchtower Scraps 7": base_id + 1179, # ItemPickup374_16 Secret2_WatchTowerDetails (X=33210.707 Y=-32097.611 Z=11211.031) + "Watchtower Scraps 8": base_id + 1180, # ItemPickup22_10 Secret2_WatchTowerDetails (X=33246.262 Y=-32046.697 Z=11851.025) + "Watchtower Scraps 9": base_id + 1181, # ItemPickup22_8 Secret2_WatchTowerDetails (X=33553.156 Y=-31810.645 Z=11849.521) + "Watchtower Scraps 10": base_id + 1182, # ItemPickup371_7 Secret2_WatchTowerDetails (X=36151.621 Y=-31791.633 Z=11093.785) + "Watchtower Pink Paint Can": base_id + 1183 # PaintCan_2 Secret2_WatchTowerDetails (X=33069.133 Y=-32168.045 Z=11859.582) \!/ Existing match 5 +} + +loc_boulder_field = { + "Boulder Field Page Drawing 1": base_id + 1184, # Pages_Drawing1 Pages_Environment_Details (X=46232.703 Y=-37052.875 Z=9531.116) + "Boulder Field Page Drawing 2": base_id + 1185, # Pages_Drawing2 Pages_Environment_Details (X=51854.980 Y=-31332.070 Z=9804.927) + "Boulder Field Page Drawing 3": base_id + 1186, # Pages_Drawing3 Pages_Environment_Details (X=47595.750 Y=-29931.740 Z=9308.014) + "Boulder Field Page Drawing 4": base_id + 1187, # Pages_Drawing4 Pages_Environment_Details (X=43819.680 Y=-30378.770 Z=9706.599) + "Boulder Field Page Drawing 5": base_id + 1188, # Pages_Drawing5 Pages_Environment_Details (X=47494.746 Y=-20884.781 Z=9812.398) + "Boulder Field Page Drawing 6": base_id + 1189, # Pages_Drawing6 Pages_Environment_Details (X=43725.148 Y=-21952.570 Z=9744.351) + "Boulder Field Page Drawing 7": base_id + 1190, # Pages_Drawing7 Pages_Environment_Details (X=44752.465 Y=-16362.510 Z=10147.004) + "Boulder Field Page Drawing 8": base_id + 1191, # Pages_Drawing8 Pages_Environment_Details (X=50496.270 Y=-26090.533 Z=9835.365) + "Boulder Field Scraps 1": base_id + 1192, # ItemPickup293_8 Pages_Environment_Main (X=41385.406 Y=-32281.871 Z=10240.781) + "Boulder Field Scraps 2": base_id + 1193, # ItemPickup987321 Pages_House_Main (X=46654.969 Y=-38859.254 Z=9920.861) + "Boulder Field Scraps 3": base_id + 1194, # ItemPickup516121 Pages_House_Main (X=44765.836 Y=-41675.559 Z=9938.179) + "Boulder Field Scraps 4": base_id + 1195, # ItemPickup291_2 Pages_Environment_Main (X=50088.270 Y=-30669.107 Z=9267.371) + "Boulder Field Scraps 5": base_id + 1196, # ItemPickup303_38 Pages_Environment_Main (X=48014.609 Y=-28971.115 Z=9199.659) + "Boulder Field Scraps 6": base_id + 1197, # ItemPickup302_35 Pages_Environment_Main (X=50190.266 Y=-26243.977 Z=9648.289) + "Boulder Field Scraps 7": base_id + 1198, # ItemPickup305_44 Pages_Environment_Main (X=47802.246 Y=-22594.684 Z=9631.879) + "Boulder Field Scraps 8": base_id + 1199, # ItemPickup294_11 Pages_Environment_Main (X=44345.996 Y=-23408.535 Z=9659.643) + "Boulder Field Scraps 9": base_id + 1200, # ItemPickup295_14 Pages_Environment_Main (X=41620.590 Y=-22982.641 Z=9720.177) + "Boulder Field Scraps 10": base_id + 1201, # ItemPickup300_29 Pages_Environment_Main (X=52003.172 Y=-19163.049 Z=9925.105) + "Boulder Field Scraps 11": base_id + 1202, # ItemPickup301_32 Pages_Environment_Main (X=51422.176 Y=-22319.322 Z=10663.813) + "Boulder Field Scraps 12": base_id + 1203, # ItemPickup296_17 Pages_Environment_Main (X=43527.176 Y=-17952.570 Z=10812.458) + "Boulder Field Scraps 13": base_id + 1204, # ItemPickup297_20 Pages_Environment_Main (X=45241.871 Y=-15847.636 Z=9952.198) + "Boulder Field Scraps 14": base_id + 1205, # ItemPickup298_23 Pages_Environment_Main (X=46238.027 Y=-18407.420 Z=10199.825) + "Boulder Field Scraps 15": base_id + 1206, # ItemPickup299_26 Pages_Environment_Main (X=49835.617 Y=-17379.959 Z=9810.836) + "Boulder Field Scraps 16": base_id + 1207, # ItemPickup306_47 Pages_Environment_Main (X=45144.594 Y=-33817.090 Z=10136.658) + "Boulder Field Scraps 17": base_id + 1208, # ItemPickup292_5 Pages_Environment_Main (X=44336.184 Y=-37162.367 Z=9789.548) + "Boulder Field Scraps 18": base_id + 1209 # ItemPickup304_41 Pages_Environment_Main (X=44490.160 Y=-26442.754 Z=9974.022) +} + +loc_haunted_house = { + "Haunted House Sasha Mission End": base_id + 1210, # (dialog 2) -> 40_scraps_reward + "Haunted House Scraps 1": base_id + 1211, # ItemPickup1309876 Pages_House_Main (X=42900.188 Y=-43760.617 Z=9900.531) + "Haunted House Scraps 2": base_id + 1212, # ItemPickup22213 Pages_House_Main (X=43608.078 Y=-44642.434 Z=9922.888) + "Haunted House Scraps 3": base_id + 1213, # ItemPickup5423189 Pages_House_Main (X=43992.387 Y=-44259.336 Z=9877.623) + "Haunted House Scraps 4": base_id + 1214, # ItemPickup1312312 Pages_House_Main (X=43340.012 Y=-45362.617 Z=9882.796) + "Haunted House Scraps 5": base_id + 1215, # ItemPickup1596 Pages_House_Main (X=45105.383 Y=-45980.879 Z=9854.796) + "Haunted House Scraps 6": base_id + 1216 # ItemPickup8624 Pages_House_Main (X=45888.406 Y=-46050.246 Z=9555.326) +} + +loc_santiago_house = { + "Santiago House Scraps 1": base_id + 1217, # ItemPickup342_19 PortNPCHouse_Details (X=37271.445 Y=-46075.598 Z=10648.827) + "Santiago House Scraps 2": base_id + 1218, # ItemPickup37_5 PortNPCHouse_Details (X=38330.512 Y=-47184.668 Z=10387.618) + "Santiago House Scraps 3": base_id + 1219, # ItemPickup337_2 PortNPCHouse_Details (X=35720.422 Y=-49536.328 Z=10098.503) + "Santiago House Scraps 4": base_id + 1220, # ItemPickup344_25 PortNPCHouse_Details (X=35466.285 Y=-50363.078 Z=10098.504) + "Santiago House Scraps 5": base_id + 1221, # ItemPickup338_7 PortNPCHouse_Details (X=34274.289 Y=-49947.578 Z=10098.501) + "Santiago House Scraps 6": base_id + 1222, # ItemPickup341_16 PortNPCHouse_Details (X=35584.359 Y=-48195.172 Z=10323.833) + "Santiago House Scraps 7": base_id + 1223, # ItemPickup340_13 PortNPCHouse_Details (X=35019.766 Y=-49904.113 Z=10124.169) + "Santiago House Scraps 8": base_id + 1224, # ItemPickup339_10 PortNPCHouse_Details (X=35527.711 Y=-49614.801 Z=10124.016) + "Santiago House Scraps 9": base_id + 1225, # ItemPickup36_2 PortNPCHouse_Details (X=34471.707 Y=-49497.000 Z=10199.790) + "Santiago House Scraps 10": base_id + 1226, # ItemPickup343_22 PortNPCHouse_Details (X=37920.277 Y=-51867.754 Z=9847.511) + "Santiago House Journal": base_id + 1227 # Port_Journal_Pickup PortNPCHouse_Details (X=34690.777 Y=-49788.359 Z=10214.353) +} + +loc_port = { + "Port Grey Paint Can": base_id + 1228, # PaintCan_13 Port_Details (X=74641.648 Y=-11320.948 Z=7551.767) + "Port Scraps 1": base_id + 1229, # ItemPickup334_32 Port_Main (X=67315.281 Y=-13828.055 Z=10101.339) + "Port Scraps 2": base_id + 1230, # ItemPickup335_35 Port_Main (X=67679.508 Y=-14127.952 Z=10061.037) + "Port Scraps 3": base_id + 1231, # ItemPickup336_38 Port_Main (X=67062.219 Y=-15626.003 Z=10065.956) + "Port Scraps 4": base_id + 1232, # ItemPickup21_15 Port_Main (X=66140.914 Y=-16079.730 Z=10092.268) + "Port Scraps 5": base_id + 1233, # ItemPickup18_12 Port_Main (X=66824.719 Y=-14729.157 Z=10125.234) + "Port Scraps 6": base_id + 1234, # ItemPickup333_29 Port_Main (X=69777.258 Y=-8371.526 Z=9391.735) + "Port Scraps 7": base_id + 1235, # ItemPickup332_26 Port_Main (X=70339.695 Y=-11066.703 Z=8912.465) + "Port Scraps 8": base_id + 1236, # ItemPickup331_23 Port_Main (X=72729.508 Y=-7048.998 Z=8245.522) + "Port Scraps 9": base_id + 1237, # ItemPickup329_17 Port_Main (X=75896.070 Y=-8705.214 Z=7514.992) + "Port Scraps 10": base_id + 1238, # ItemPickup330_20 Port_Main (X=74264.211 Y=-10553.446 Z=7520.141) + "Port Scraps 11": base_id + 1239, # ItemPickup17_9 Port_Main (X=74328.117 Y=-11423.852 Z=7511.827) + "Port Scraps 12": base_id + 1240, # ItemPickup328_14 Port_Main (X=76753.164 Y=-10744.933 Z=7437.174) + "Port Scraps 13": base_id + 1241, # ItemPickup326_8 Port_Main (X=77330.414 Y=-11640.151 Z=7189.003) + "Port Scraps 14": base_id + 1242, # ItemPickup327_11 Port_Main (X=76403.516 Y=-12484.995 Z=7440.368) + "Port Scraps 15": base_id + 1243, # ItemPickup324_2 Port_Main (X=78651.977 Y=-12233.159 Z=7439.514) + "Port Scraps 16": base_id + 1244, # ItemPickup14_5 Port_Main (X=80336.297 Y=-12276.590 Z=7436.639) + "Port Scraps 17": base_id + 1245, # ItemPickup325_5 Port_Main (X=79845.086 Y=-13410.705 Z=7440.597) + "Port Scraps 18": base_id + 1246, # ItemPickup13_2 Port_Main (X=76156.719 Y=-12816.718 Z=7439.269) KO + "Port Scraps 19": base_id + 1247, # ItemPickup16 Port_Main (X=80754.914 Y=-14055.545 Z=7445.339) KO + "Port Santiago Mission End": base_id + 1248 # (dialog 3) -> 35_scraps_reward +} + +loc_trench_house = { + "Trench House Scraps 1": base_id + 1249, # ItemPickup157_2 DeadWoodsEnvironment (X=76340.328 Y=-42886.191 Z=9567.521) + "Trench House Scraps 2": base_id + 1250, # ItemPickup158_5 DeadWoodsEnvironment (X=76013.594 Y=-44140.141 Z=9413.147) + "Trench House Scraps 3": base_id + 1251, # ItemPickup159_11 DeadWoodsEnvironment (X=74408.320 Y=-45424.000 Z=9446.966) + "Trench House Scraps 4": base_id + 1252, # ItemPickup69_14 Secret8_BasementHouseDetails (X=75196.344 Y=-48321.504 Z=9453.302) + "Trench House Scraps 5": base_id + 1253, # ItemPickup160_14 DeadWoodsEnvironment (X=73467.273 Y=-48995.738 Z=9355.070) + "Trench House Scraps 6": base_id + 1254, # ItemPickup163_23 DeadWoodsEnvironment (X=76418.469 Y=-53239.539 Z=9276.892) + "Trench House Scraps 7": base_id + 1255, # ItemPickup173_56 DeadWoodsEnvironment (X=70719.875 Y=-54290.117 Z=9357.084) + "Trench House Scraps 8": base_id + 1256, # ItemPickup165_29 DeadWoodsEnvironment (X=70075.938 Y=-53041.973 Z=9675.481) + "Trench House Scraps 9": base_id + 1257, # ItemPickup162_20 DeadWoodsEnvironment (X=74745.711 Y=-52304.027 Z=9073.130) + "Trench House Scraps 10": base_id + 1258, # ItemPickup68_11 Secret8_BasementHouseDetails (X=74519.750 Y=-53603.063 Z=9078.054) + "Trench House Scraps 11": base_id + 1259, # ItemPickup161_17 DeadWoodsEnvironment (X=73747.492 Y=-52589.906 Z=9104.748) + "Trench House Scraps 12": base_id + 1260, # ItemPickup67_8 Secret8_BasementHouseDetails (X=74333.125 Y=-52847.961 Z=9124.773) + "Trench House Scraps 13": base_id + 1261, # ItemPickup66_5 Secret8_BasementHouseDetails (X=74062.195 Y=-52663.043 Z=9122.827) + "Trench House Scraps 14": base_id + 1262, # ItemPickup65_2 Secret8_BasementHouseDetails (X=74820.492 Y=-51350.051 Z=7956.387) + "Trench House Scraps 15": base_id + 1263, # ItemPickup164_26 DeadWoodsEnvironment (X=75286.289 Y=-51164.098 Z=7957.081) + "Trench House Scraps 16": base_id + 1264, # ItemPickup174_59 DeadWoodsEnvironment (X=68413.258 Y=-56872.816 Z=9349.443) + "Trench House Scraps 17": base_id + 1265, # ItemPickup175_62 DeadWoodsEnvironment (X=67281.281 Y=-59201.371 Z=9254.457) + "Trench House Scraps 18": base_id + 1266, # ItemPickup172_50 DeadWoodsEnvironment (X=69064.219 Y=-48796.352 Z=9770.164) + "Trench House Chest Scraps 1": base_id + 1267, # ItemPickup75123123 Secret8_BasementHouseDetails (X=75042.141 Y=-50830.891 Z=8005.156) + "Trench House Chest Scraps 2": base_id + 1268, # ItemPickup741123 Secret8_BasementHouseDetails (X=75066.516 Y=-50824.398 Z=7995.000) + "Trench House Chest Scraps 3": base_id + 1269, # ItemPickup729842 Secret8_BasementHouseDetails (X=75072.789 Y=-50818.441 Z=7986.979) + "Trench House Chest Scraps 4": base_id + 1270, # ItemPickup711123 Secret8_BasementHouseDetails (X=75038.656 Y=-50827.566 Z=7973.354) + "Trench House Chest Scraps 5": base_id + 1271, # ItemPickup73 Secret8_BasementHouseDetails (X=75060.406 Y=-50828.102 Z=7965.915) + "Trench House Chest Scraps 6": base_id + 1272 # ItemPickup7075674 Secret8_BasementHouseDetails (X=75056.648 Y=-50818.125 Z=7959.868) +} + +loc_doll_woods = { + "Doll Woods Scraps 1": base_id + 1273, # ItemPickup78_2 DeadWoodsDolls (X=60126.234 Y=-49668.906 Z=9970.880) + "Doll Woods Scraps 2": base_id + 1274, # ItemPickup166_32 DeadWoodsEnvironment (X=59854.066 Y=-47313.121 Z=10376.684) + "Doll Woods Scraps 3": base_id + 1275, # ItemPickup80_8 DeadWoodsDolls (X=59130.613 Y=-49597.789 Z=9930.675) + "Doll Woods Scraps 4": base_id + 1276, # ItemPickup168_38 DeadWoodsEnvironment (X=59785.973 Y=-51269.684 Z=10180.019) + "Doll Woods Scraps 5": base_id + 1277, # ItemPickup81_11 DeadWoodsDolls (X=58226.449 Y=-52660.801 Z=10576.626) + "Doll Woods Scraps 6": base_id + 1278, # ItemPickup167_35 DeadWoodsEnvironment (X=56243.176 Y=-49097.793 Z=10869.889) + "Doll Woods Scraps 7": base_id + 1279, # ItemPickup79_5 DeadWoodsDolls (X=59481.672 Y=-45288.137 Z=10897.672) + "Doll Woods Scraps 8": base_id + 1280, # ItemPickup170_44 DeadWoodsEnvironment (X=63807.668 Y=-44674.734 Z=10337.434) + "Doll Woods Scraps 9": base_id + 1281, # ItemPickup171_47 DeadWoodsEnvironment (X=68406.664 Y=-45721.813 Z=10021.356) + "Doll Woods Scraps 10": base_id + 1282 # ItemPickup169_41 DeadWoodsEnvironment (X=62898.469 Y=-47565.703 Z=10744.431) +} + +loc_lost_stairs = { + "Lost Stairs Scraps 1": base_id + 1283, # ItemPickup29_2 Secret1_Stairs2 (X=47087.617 Y=-53476.547 Z=9103.093) + "Lost Stairs Scraps 2": base_id + 1284 # ItemPickup30_5 Secret1_Stairs2 (X=47162.238 Y=-55318.094 Z=9127.096) +} + +loc_east_house = { + "East House Scraps 1": base_id + 1285, # ItemPickup409_5 Secret7_CliffHouseEnvironment (X=97507.664 Y=-53201.270 Z=9174.678) + "East House Scraps 2": base_id + 1286, # ItemPickup408_2 Secret7_CliffHouseEnvironment (X=98511.242 Y=-53899.414 Z=9016.314) + "East House Scraps 3": base_id + 1287, # ItemPickup410_8 Secret7_CliffHouseEnvironment (X=100688.102 Y=-54197.578 Z=8919.432) + "East House Scraps 4": base_id + 1288, # ItemPickup411_11 Secret7_CliffHouseEnvironment (X=103149.773 Y=-54659.980 Z=9002.535) + "East House Scraps 5": base_id + 1289, # ItemPickup416_26 Secret7_CliffHouseEnvironment (X=107458.172 Y=-55683.793 Z=9429.004) + "East House Scraps 6": base_id + 1290, # ItemPickup25_2 Secret7_CliffHouseEnvironment (X=109034.164 Y=-54360.703 Z=9495.910) + "East House Scraps 7": base_id + 1291, # ItemPickup413_17 Secret7_CliffHouseEnvironment (X=109245.148 Y=-55045.242 Z=9553.601) + "East House Scraps 8": base_id + 1292, # ItemPickup414_20 Secret7_CliffHouseEnvironment (X=112556.445 Y=-55851.754 Z=10049.954) + "East House Scraps 9": base_id + 1293, # ItemPickup415_23 Secret7_CliffHouseEnvironment (X=113131.469 Y=-56822.508 Z=10038.047) + "East House Scraps 10": base_id + 1294, # ItemPickup2599786 Secret7_CliffHouseDetails (X=112279.828 Y=-56743.781 Z=10029.549) + "East House Scraps 11": base_id + 1295, # ItemPickup253321 Secret7_CliffHouseDetails (X=112445.508 Y=-56280.320 Z=10059.164) + "East House Scraps 12": base_id + 1296, # ItemPickup2532323 Secret7_CliffHouseDetails (X=112562.211 Y=-56736.332 Z=10454.907) + "East House Scraps 13": base_id + 1297, # ItemPickup257655 Secret7_CliffHouseDetails (X=109313.320 Y=-58221.316 Z=9501.283) + "East House Scraps 14": base_id + 1298, # ItemPickup412_14 Secret7_CliffHouseEnvironment (X=104077.805 Y=-55987.301 Z=9066.847) + "East House Chest Scraps 1": base_id + 1299, # ItemPickup76246 Secret7_CliffHouseDetails (X=112317.242 Y=-55820.805 Z=10497.336) + "East House Chest Scraps 2": base_id + 1300, # ItemPickup76245 Secret7_CliffHouseDetails (X=112326.086 Y=-55808.477 Z=10485.685) + "East House Chest Scraps 3": base_id + 1301, # ItemPickup85131 Secret7_CliffHouseDetails (X=112329.031 Y=-55828.438 Z=10478.107) + "East House Chest Scraps 4": base_id + 1302, # ItemPickup56124 Secret7_CliffHouseDetails (X=112315.922 Y=-55820.102 Z=10466.683) + "East House Chest Scraps 5": base_id + 1303 # ItemPickup25123123123 Secret7_CliffHouseDetails (X=112337.922 Y=-55821.848 Z=10456.924) +} + +loc_rockets_testing_ground = { + "Rockets Testing Ground Timed Dynamite": base_id + 1304, # Boomer_DynamitePickup Boomer_RangeDetails (X=76476.609 Y=-65286.738 Z=8303.742) + "Rockets Testing Ground Scraps 1": base_id + 1305, # ItemPickup105_14 Boomer_HouseDetails (X=88925.570 Y=-63375.051 Z=8563.354) + "Rockets Testing Ground Scraps 2": base_id + 1306, # ItemPickup106_17 Boomer_HouseDetails (X=84234.016 Y=-64475.551 Z=8382.108) + "Rockets Testing Ground Scraps 3": base_id + 1307, # ItemPickup114_23 Boomer_RangeDetails (X=79349.438 Y=-64225.480 Z=8384.219) + "Rockets Testing Ground Scraps 4": base_id + 1308, # ItemPickup22_0 Boomer_RangeDetails (X=79831.070 Y=-65847.766 Z=8301.337) + "Rockets Testing Ground Scraps 5": base_id + 1309, # ItemPickup109_5 Boomer_RangeDetails (X=76526.500 Y=-65394.875 Z=8223.883) + "Rockets Testing Ground Scraps 6": base_id + 1310, # ItemPickup108_2 Boomer_RangeDetails (X=76237.977 Y=-67087.414 Z=8361.979) + "Rockets Testing Ground Scraps 7": base_id + 1311, # ItemPickup115_26 Boomer_RangeDetails (X=78857.672 Y=-67802.227 Z=8257.150) + "Rockets Testing Ground Scraps 8": base_id + 1312, # ItemPickup110_8 Boomer_RangeDetails (X=74878.570 Y=-62927.297 Z=8749.549) + "Rockets Testing Ground Scraps 9": base_id + 1313, # ItemPickup111_11 Boomer_RangeDetails (X=74542.641 Y=-61301.082 Z=9493.931) + "Rockets Testing Ground Scraps 10": base_id + 1314 # ItemPickup23_0 Boomer_RangeDetails (X=77020.859 Y=-62031.320 Z=8873.663) + # "Rockets Testing Ground Scraps Glitch 1" ItemPickup107_20 (X=81308.406 Y=-63482.320 Z=8533.338) /!\ Glitched scrap +} + +loc_rockets_testing_bunker = { + "Rockets Testing Bunker Scraps 1": base_id + 1315, # ItemPickup113_20 Boomer_RangeDetails (X=77552.094 Y=-61144.559 Z=8523.195) + "Rockets Testing Bunker Scraps 2": base_id + 1316, # ItemPickup112_14 Boomer_RangeDetails (X=77670.227 Y=-62029.941 Z=8570.785) + "Rockets Testing Bunker Box of Rockets": base_id + 1317 # Boomer_RocketsPickup Boomer_RangeDetails (X=77330.086 Y=-61504.324 Z=8523.195) +} + +loc_workshop = { + "Workshop Scraps 1": base_id + 1318, # ItemPickup103_8 Boomer_HouseDetails (X=93550.773 Y=-61901.797 Z=8828.551) + "Workshop Scraps 2": base_id + 1319, # ItemPickup102_5 Boomer_HouseDetails (X=93508.047 Y=-64009.910 Z=8783.468) + "Workshop Scraps 3": base_id + 1320, # ItemPickup101_2 Boomer_HouseDetails (X=92011.648 Y=-65572.281 Z=8736.709) + "Workshop Scraps 4": base_id + 1321, # ItemPickup24_2 Boomer_HouseDetails (X=92311.594 Y=-63045.211 Z=8749.977) + "Workshop Scraps 5": base_id + 1322, # ItemPickup104_11 Boomer_HouseDetails (X=91392.734 Y=-63527.629 Z=8709.268) + "Workshop Scraps 6": base_id + 1323, # ItemPickup25_1 Boomer_HouseDetails (X=92986.789 Y=-63012.047 Z=9235.383) + "Workshop John Smith Mission End": base_id + 1324 # (dialog 2) -> the_boomer +} + +loc_east_tower = { + "Greg Mission Start": base_id + 1325, # (dialog 6) -> north_mine_key + "East Tower Scraps 1": base_id + 1326, # ItemPickup231_17 Mine2_NPCHouseDetails (X=95448.250 Y=-67249.156 Z=8607.896) + "East Tower Scraps 2": base_id + 1327, # ItemPickup228_8 Mine2_NPCHouseDetails (X=96339.242 Y=-66374.828 Z=8650.519) + "East Tower Scraps 3": base_id + 1328, # ItemPickup229_11 Mine2_NPCHouseDetails (X=98540.711 Y=-67173.656 Z=8418.825) + "East Tower Scraps 4": base_id + 1329, # ItemPickup230_14 Mine2_NPCHouseDetails (X=97276.414 Y=-68495.008 Z=8337.229) + "East Tower Scraps 5": base_id + 1330, # ItemPickup227_5 Mine2_NPCHouseDetails (X=96470.820 Y=-66540.859 Z=8953.763) + "East Tower Scraps 6": base_id + 1331 # ItemPickup226_2 Mine2_NPCHouseDetails (X=96141.555 Y=-67013.445 Z=9399.308) +} + +loc_lighthouse = { + "Lighthouse Scraps 1": base_id + 1332, # ItemPickup200_41 LighthouseTerrainMain (X=100072.813 Y=-68645.688 Z=8150.313) + "Lighthouse Scraps 2": base_id + 1333, # ItemPickup198_35 LighthouseTerrainMain (X=105340.594 Y=-70828.602 Z=8436.780) + "Lighthouse Scraps 3": base_id + 1334, # ItemPickup199_38 LighthouseTerrainMain (X=103851.688 Y=-73396.625 Z=7973.290) + "Lighthouse Scraps 4": base_id + 1335, # ItemPickup196_29 LighthouseTerrainMain (X=107040.711 Y=-74021.555 Z=8303.216) + "Lighthouse Scraps 5": base_id + 1336, # ItemPickup197_32 LighthouseTerrainMain (X=110566.859 Y=-77435.961 Z=7642.565) + "Lighthouse Scraps 6": base_id + 1337, # ItemPickup32_2 LighthouseShed_Main (X=111451.352 Y=-77351.117 Z=7633.413) + "Lighthouse Scraps 7": base_id + 1338, # ItemPickup35_11 Lighthouse_Main (X=113078.500 Y=-78618.281 Z=7180.793) + "Lighthouse Scraps 8": base_id + 1339, # ItemPickup192_17 LighthouseTerrainMain (X=113396.305 Y=-80315.383 Z=7184.260) + "Lighthouse Scraps 9": base_id + 1340, # ItemPickup193_20 LighthouseTerrainMain (X=114057.484 Y=-81517.836 Z=7245.034) + "Lighthouse Scraps 10": base_id + 1341, # ItemPickup194_23 LighthouseTerrainMain (X=110915.156 Y=-78376.609 Z=7676.131) + "Lighthouse Scraps 11": base_id + 1342, # ItemPickup195_26 LighthouseTerrainMain (X=109341.703 Y=-79014.469 Z=8075.679) + "Lighthouse Scraps 12": base_id + 1343, # ItemPickup33_5 Lighthouse_Details (X=107006.578 Y=-81377.711 Z=8821.629) + "Lighthouse Scraps 13": base_id + 1344, # ItemPickup191_14 LighthouseTerrainMain (X=109240.195 Y=-82951.375 Z=8194.619) + "Lighthouse Scraps 14": base_id + 1345, # ItemPickup190_11 LighthouseTerrainMain (X=106295.719 Y=-84190.578 Z=8581.896) + "Lighthouse Scraps 15": base_id + 1346, # ItemPickup189_8 LighthouseTerrainMain (X=104233.883 Y=-84663.328 Z=7806.311) + "Lighthouse Scraps 16": base_id + 1347, # ItemPickup188_5 LighthouseTerrainMain (X=103209.227 Y=-81564.047 Z=8140.578) + "Lighthouse Scraps 17": base_id + 1348, # ItemPickup187_2 LighthouseTerrainMain (X=104795.555 Y=-81344.758 Z=8775.158) + "Lighthouse Scraps 18": base_id + 1349, # ItemPickup34_8 Lighthouse_Main (X=100843.914 Y=-78038.539 Z=7197.542) + "Lighthouse Breaker 1": base_id + 1350, # ItemPickup13_2 LighthouseShed_Main (X=110781.164 Y=-77296.813 Z=7757.248) \!/ Existing match 6 + "Lighthouse Breaker 2": base_id + 1351, # ItemPickup14 LighthouseShed_Main (X=110899.227 Y=-77239.031 Z=7757.134) \!/ Existing match 3 + "Lighthouse Breaker 3": base_id + 1352, # ItemPickup16 LighthouseShed_Main (X=110948.547 Y=-77253.336 Z=7757.134) \!/ Existing match 2 + "Lighthouse Breaker 4": base_id + 1353, # ItemPickup17 LighthouseShed_Main (X=111001.078 Y=-77205.047 Z=7757.134) \!/ Existing match 1 + "Lighthouse Claire Mission End": base_id + 1354 # (dialog 2) -> 30_scraps_reward +} + +loc_north_mine_outside = { + "North Mine Outside Scraps 1": base_id + 1355, # ItemPickup241_31 Mine2_OutsideDetails (X=-52376.746 Y=-101857.492 Z=10542.841) + "North Mine Outside Scraps 2": base_id + 1356, # ItemPickup242_34 Mine2_OutsideDetails (X=-53786.742 Y=-102067.789 Z=10858.948) + "North Mine Outside Scraps 3": base_id + 1357, # ItemPickup239_25 Mine2_OutsideDetails (X=-57502.777 Y=-105475.336 Z=10609.405) + "North Mine Outside Scraps 4": base_id + 1358, # ItemPickup16_2 Mine2_OutsideDetails (X=-58102.102 Y=-104007.906 Z=11146.535) + "North Mine Outside Scraps 5": base_id + 1359, # ItemPickup238_20 Mine2_OutsideDetails (X=-59474.840 Y=-105053.734 Z=11213.524) + "North Mine Outside Scraps 6": base_id + 1360, # ItemPickup240_28 Mine2_OutsideDetails (X=-55011.750 Y=-104936.359 Z=9935.366) + "North Mine Outside Scraps 7": base_id + 1361, # ItemPickup236_14 Mine2_OutsideDetails (X=-55594.863 Y=-107667.594 Z=9596.611) + "North Mine Outside Scraps 8": base_id + 1362, # ItemPickup15_1 Mine2_Interior2 (X=-56632.578 Y=-109503.406 Z=9280.788) + "North Mine Outside Scraps 9": base_id + 1363, # ItemPickup234_8 Mine2_OutsideDetails (X=-54645.418 Y=-110747.602 Z=9553.452) + "North Mine Outside Scraps 10": base_id + 1364, # ItemPickup232_2 Mine2_OutsideDetails (X=-51561.340 Y=-113574.813 Z=9414.959) + "North Mine Outside Scraps 11": base_id + 1365, # ItemPickup233_5 Mine2_OutsideDetails (X=-54072.105 Y=-112672.031 Z=10077.665) + "North Mine Outside Scraps 12": base_id + 1366, # ItemPickup237_17 Mine2_OutsideDetails (X=-58042.758 Y=-108748.656 Z=9693.470) + "North Mine Outside Scraps 13": base_id + 1367, # ItemPickup235_11 Mine2_OutsideDetails (X=-55717.227 Y=-110610.414 Z=9487.879) + "North Mine Outside Scraps 14": base_id + 1368 # ItemPickup13_2 Mine2_Interior2 (X=-52235.836 Y=-114501.117 Z=9462.438) KO +} + +loc_north_mine_inside = { + "North Mine Inside Scraps 1": base_id + 1369, # ItemPickup17_2 Mine2_Interior1 (X=-58433.055 Y=-104081.570 Z=9378.083) KO + "North Mine Inside Scraps 2": base_id + 1370, # ItemPickup246_2 Mine2_Interior1 (X=-58987.199 Y=-103262.906 Z=9186.494) + "North Mine Inside Scraps 3": base_id + 1371, # ItemPickup247_5 Mine2_Interior1 (X=-58812.801 Y=-99259.570 Z=8847.714) + "North Mine Inside Scraps 4": base_id + 1372, # ItemPickup248_8 Mine2_Interior1 (X=-56634.379 Y=-99529.563 Z=8851.877) + "North Mine Inside Scraps 5": base_id + 1373, # ItemPickup22_4 Mine2_Interior1 (X=-55604.477 Y=-98342.906 Z=8842.766) + "North Mine Inside Scraps 6": base_id + 1374, # ItemPickup250_14 Mine2_Interior1 (X=-54824.535 Y=-98526.492 Z=8852.156) + "North Mine Inside Scraps 7": base_id + 1375, # ItemPickup21_14 Mine2_Interior1 (X=-54887.254 Y=-99047.141 Z=8849.855) + "North Mine Inside Scraps 8": base_id + 1376, # ItemPickup20_2 Mine2_Interior1 (X=-55610.020 Y=-101877.961 Z=9081.042) + "North Mine Inside Scraps 9": base_id + 1377, # ItemPickup19_2 Mine2_Interior1 (X=-56519.340 Y=-101375.008 Z=9001.270) + "North Mine Inside Scraps 10": base_id + 1378, # ItemPickup249_11 Mine2_Interior1 (X=-53329.922 Y=-99469.773 Z=8848.643) + "North Mine Inside Scraps 11": base_id + 1379, # ItemPickup251_17 Mine2_Interior1 (X=-52814.828 Y=-96286.969 Z=8851.372) + "North Mine Inside Scraps 12": base_id + 1380, # ItemPickup24_1 Mine2_Interior1 (X=-52605.957 Y=-96535.156 Z=8940.480) + "North Mine Inside Scraps 13": base_id + 1381, # ItemPickup23_20 Mine2_Interior1 (X=-53237.699 Y=-96609.461 Z=8846.201) + "North Mine Inside Scraps 14": base_id + 1382, # ItemPickup18_5 Mine2_Interior1 (X=-58543.488 Y=-95879.695 Z=8981.646) + "North Mine Inside Blue Egg": base_id + 1383, # Mine2_Egg Mine2_Interior2 (X=-53592.195 Y=-99177.500 Z=8975.387) + "North Mine Inside Blue Paint Can": base_id + 1384 # PaintCan_2 Mine2_Interior2 (X=-56133.391 Y=-101870.047 Z=9004.720) \!/ Existing match 5 + # "North Mine Inside Secret Gear" ItemPickup26_2 (X=-55546.859 Y=-98209.852 Z=8429.085) /!\ Inaccessible gear +} + +loc_wood_bridge = { + "Wood Bridge Scraps 1": base_id + 1385, # ItemPickup127_35 Bridge_Details (X=-66790.141 Y=-110340.367 Z=10454.417) + "Wood Bridge Scraps 2": base_id + 1386, # ItemPickup18613654 Bridge_Details (X=-68364.586 Y=-111691.625 Z=10444.172) + "Wood Bridge Scraps 3": base_id + 1387, # ItemPickup1311221 Bridge_StructureDetails (X=-69013.555 Y=-112353.977 Z=10399.942) + "Wood Bridge Scraps 4": base_id + 1388, # ItemPickup93564 Bridge_StructureDetails (X=-70398.797 Y=-112916.945 Z=10372.192) + "Wood Bridge Scraps 5": base_id + 1389, # ItemPickup161323 Bridge_Details (X=-71336.172 Y=-106966.672 Z=8430.104) + "Wood Bridge Scraps 6": base_id + 1390, # ItemPickup128_38 Bridge_Details (X=-72776.086 Y=-107813.102 Z=8305.589) + "Wood Bridge Scraps 7": base_id + 1391, # ItemPickup17975 Bridge_Details (X=-75224.648 Y=-108280.867 Z=7929.499) + "Wood Bridge Scraps 8": base_id + 1392, # ItemPickup126_32 Bridge_Details (X=-68112.172 Y=-105119.656 Z=9458.937) + "Wood Bridge Scraps 9": base_id + 1393, # ItemPickup118_8 Bridge_Details (X=-71847.625 Y=-103623.203 Z=10707.521) + "Wood Bridge Scraps 10": base_id + 1394, # ItemPickup116_2 Bridge_Details (X=-71812.219 Y=-107256.094 Z=10780.134) + "Wood Bridge Scraps 11": base_id + 1395, # ItemPickup134321 Bridge_Details (X=-72011.570 Y=-109054.547 Z=10866.852) + "Wood Bridge Scraps 12": base_id + 1396, # ItemPickup117_5 Bridge_Details (X=-72862.430 Y=-106144.852 Z=10329.061) + "Wood Bridge Scraps 13": base_id + 1397 # ItemPickup1494567 Bridge_Details (X=-71843.117 Y=-107174.133 Z=10367.116) +} + +loc_museum = { + "Museum Scraps 1": base_id + 1398, # ItemPickup119_11 Bridge_Details (X=-69687.773 Y=-100002.406 Z=10806.339) + "Museum Scraps 2": base_id + 1399, # ItemPickup120_14 Bridge_Details (X=-68035.195 Y=-99480.672 Z=11049.731) + "Museum Scraps 3": base_id + 1400, # ItemPickup125_29 Bridge_Details (X=-66912.641 Y=-99976.750 Z=11064.357) + "Museum Scraps 4": base_id + 1401, # ItemPickup13532 Bridge_HouseDetails (X=-64901.117 Y=-99624.953 Z=11176.359) + "Museum Scraps 5": base_id + 1402, # ItemPickup121_17 Bridge_Details (X=-66082.328 Y=-98105.555 Z=11089.308) + "Museum Scraps 6": base_id + 1403, # ItemPickup21765 Bridge_HouseDetails (X=-67402.742 Y=-97735.133 Z=11153.927) + "Museum Scraps 7": base_id + 1404, # ItemPickup124_26 Bridge_Details (X=-66716.031 Y=-98282.508 Z=11195.624) + "Museum Scraps 8": base_id + 1405, # ItemPickup122_20 Bridge_Details (X=-66582.703 Y=-99092.461 Z=11630.082) + "Museum Scraps 9": base_id + 1406, # ItemPickup123_23 Bridge_Details (X=-66798.164 Y=-99550.266 Z=11547.321) + "Museum Scraps 10": base_id + 1407, # ItemPickup183423 Bridge_HouseDetails (X=-66850.336 Y=-99682.844 Z=11543.618) + "Museum Scraps 11": base_id + 1408, # ItemPickup244_40 Mine2_OutsideDetails (X=-60156.828 Y=-98516.953 Z=11811.422) + "Museum Scraps 12": base_id + 1409, # ItemPickup245_43 Mine2_OutsideDetails (X=-61195.203 Y=-98262.422 Z=11779.118) + "Museum Paul Mission Start": base_id + 1410, # (dialog 6) -> remote_explosive (x8) + "Museum Paul Mission End": base_id + 1411 # (dialog 3) -> temple_key +} + +loc_barbed_shelter = { + "Barbed Shelter Gertrude Mission Start": base_id + 1412, # (dialog 4) -> broken_bob + "Barbed Shelter Scraps 1": base_id + 1413, # ItemPickup100_8 Bob_NPCHouseMain (X=-72525.500 Y=-89333.734 Z=9820.663) + "Barbed Shelter Scraps 2": base_id + 1414, # ItemPickup98_2 Bob_NPCHouseMain (X=-74870.758 Y=-88576.641 Z=9836.814) + "Barbed Shelter Scraps 3": base_id + 1415, # ItemPickup22_1 Bob_NPCHouseDetails (X=-76193.914 Y=-88038.836 Z=9818.776) + "Barbed Shelter Scraps 4": base_id + 1416, # ItemPickup99_5 Bob_NPCHouseMain (X=-74494.859 Y=-87609.969 Z=9837.866) + "Barbed Shelter Scraps 5": base_id + 1417 # ItemPickup23_3 Bob_NPCHouseDetails (X=-74826.930 Y=-88402.039 Z=9929.854) +} + +loc_west_beach = { + "West Beach Chest Scraps 1": base_id + 1418, # ItemPickup9122346 Secret11_Details (X=-85934.047 Y=-89532.547 Z=7383.054) + "West Beach Chest Scraps 2": base_id + 1419, # ItemPickup84 Secret11_Details (X=-85933.977 Y=-89532.977 Z=7369.364) + "West Beach Chest Scraps 3": base_id + 1420, # ItemPickup9099877 Secret11_Details (X=-85951.000 Y=-89527.023 Z=7367.054) + "West Beach Chest Scraps 4": base_id + 1421, # ItemPickup89086423 Secret11_Details (X=-85932.461 Y=-89533.148 Z=7354.001) + "West Beach Chest Scraps 5": base_id + 1422, # ItemPickup83 Secret11_Details (X=-85950.930 Y=-89527.453 Z=7353.365) + "West Beach Chest Scraps 6": base_id + 1423, # ItemPickup82_2 Secret11_Details (X=-85932.391 Y=-89533.578 Z=7340.312) + "West Beach Scraps 1": base_id + 1424, # ItemPickup87_13 Secret11_Details (X=-84489.945 Y=-91235.977 Z=8360.803) + "West Beach Scraps 2": base_id + 1425, # ItemPickup349_2 Secret11_Details1 (X=-84386.320 Y=-90391.789 Z=8376.434) + "West Beach Scraps 3": base_id + 1426, # ItemPickup86_10 Secret11_Details (X=-84714.773 Y=-89876.992 Z=7707.064) + "West Beach Scraps 4": base_id + 1427, # ItemPickup350_5 Secret11_Details1 (X=-85478.672 Y=-90648.414 Z=7708.377) + "West Beach Scraps 5": base_id + 1428, # ItemPickup85_7 Secret11_Details (X=-86276.633 Y=-90674.289 Z=7532.364) + "West Beach Scraps 6": base_id + 1429, # ItemPickup88_16 Secret11_Details (X=-84363.055 Y=-87497.938 Z=7582.647) + "West Beach Scraps 7": base_id + 1430, # ItemPickup351_8 Secret11_Details1 (X=-86556.266 Y=-89748.484 Z=7297.274) + "West Beach Scraps 8": base_id + 1431 # ItemPickup352_11 Secret11_Details1 (X=-83210.836 Y=-92551.953 Z=8460.213) +} + +loc_church = { + "Church Black Paint Can": base_id + 1432, # PaintCan_4 Secret5_ChurchDetails (X=-67628.172 Y=-83801.375 Z=9865.983) + "Church Scraps 1": base_id + 1433, # ItemPickup391_11 Secret5_ChurchDetails (X=-64009.039 Y=-84252.156 Z=10258.335) + "Church Scraps 2": base_id + 1434, # ItemPickup389_5 Secret5_ChurchDetails (X=-66870.719 Y=-85202.180 Z=9843.936) + "Church Scraps 3": base_id + 1435, # ItemPickup388_2 Secret5_ChurchDetails (X=-68588.352 Y=-84041.867 Z=9790.541) + "Church Scraps 4": base_id + 1436, # ItemPickup396_26 Secret5_ChurchDetails (X=-67595.797 Y=-82120.094 Z=9818.303) + "Church Scraps 5": base_id + 1437, # ItemPickup390_8 Secret5_ChurchDetails (X=-67291.000 Y=-83324.836 Z=9774.942) + "Church Scraps 6": base_id + 1438, # ItemPickup392_14 Secret5_ChurchDetails (X=-65849.070 Y=-80676.477 Z=9895.943) + "Church Scraps 7": base_id + 1439, # ItemPickup395_23 Secret5_ChurchDetails (X=-65170.266 Y=-79155.227 Z=9904.275) + "Church Scraps 8": base_id + 1440, # ItemPickup24_4 Secret5_GraveyardMain (X=-64837.563 Y=-80885.305 Z=9906.755) + "Church Scraps 9": base_id + 1441, # ItemPickup22_3 Secret5_ChurchDetails (X=-68248.359 Y=-83578.008 Z=9807.300) + "Church Scraps 10": base_id + 1442, # ItemPickup23_5 Secret5_ChurchDetails (X=-67086.102 Y=-84605.086 Z=9805.521) + "Church Scraps 11": base_id + 1443, # ItemPickup393_17 Secret5_ChurchDetails (X=-67901.930 Y=-83477.625 Z=9812.613) + "Church Scraps 12": base_id + 1444 # ItemPickup394_20 Secret5_ChurchDetails (X=-65834.344 Y=-84192.102 Z=9987.823) +} + +loc_west_cottage = { + "West Cottage Gale Mission Start": base_id + 1445, # (dialog 10) -> mountain_ruin_key + "West Cottage Scraps 1": base_id + 1446, # ItemPickup15_3 Mine3_NPCHouse (X=-74407.695 Y=-81781.250 Z=10120.775) + "West Cottage Scraps 2": base_id + 1447, # ItemPickup283_5 Mine3_NPCHouseDetails (X=-73784.695 Y=-79414.359 Z=10128.285) + "West Cottage Scraps 3": base_id + 1448, # ItemPickup13_1 Mine3_NPCHouse (X=-73992.391 Y=-78600.094 Z=10162.495) + "West Cottage Scraps 4": base_id + 1449, # ItemPickup284_8 Mine3_NPCHouseDetails (X=-71623.000 Y=-75998.023 Z=10275.477) + "West Cottage Scraps 5": base_id + 1450 # ItemPickup282_2 Mine3_NPCHouseDetails (X=-72626.453 Y=-79391.070 Z=10211.037) +} + +loc_caravan = { + "Caravan Scraps 1": base_id + 1451, # ItemPickup348_11 Secret10_PAth (X=-52638.109 Y=-43924.395 Z=10579.809) + "Caravan Scraps 2": base_id + 1452, # ItemPickup347_8 Secret10_PAth (X=-50203.695 Y=-42865.672 Z=10778.871) + "Caravan Scraps 3": base_id + 1453, # ItemPickup346_5 Secret10_PAth (X=-48467.738 Y=-42018.488 Z=10818.758) + "Caravan Scraps 4": base_id + 1454, # ItemPickup77_14 Secret10_Details (X=-46325.219 Y=-41707.512 Z=11003.229) + "Caravan Scraps 5": base_id + 1455, # ItemPickup345_2 Secret10_PAth (X=-44557.043 Y=-40652.930 Z=11076.221) + "Caravan Scraps 6": base_id + 1456, # ItemPickup76_11 Secret10_Details (X=-43380.664 Y=-38207.152 Z=11165.370) + "Caravan Scraps 7": base_id + 1457, # ItemPickup73_2 Secret10_Details (X=-42919.410 Y=-38797.738 Z=11265.633) + "Caravan Scraps 8": base_id + 1458, # ItemPickup74_5 Secret10_Details (X=-42787.523 Y=-38601.820 Z=11254.003) + "Caravan Scraps 9": base_id + 1459, # ItemPickup75_8 Secret10_Details (X=-42711.363 Y=-39141.523 Z=11173.905) + "Caravan Chest Scraps 1": base_id + 1460, # ItemPickup71561 Secret10_Details (X=-42910.668 Y=-38297.309 Z=11233.402) + "Caravan Chest Scraps 2": base_id + 1461, # ItemPickup078654 Secret10_Details (X=-42904.344 Y=-38307.332 Z=11219.678) + "Caravan Chest Scraps 3": base_id + 1462, # ItemPickup02345 Secret10_Details (X=-42904.965 Y=-38280.383 Z=11208.191) + "Caravan Chest Scraps 4": base_id + 1463, # ItemPickup-6546483648 Secret10_Details (X=-42911.680 Y=-38315.254 Z=11204.225) + "Caravan Chest Scraps 5": base_id + 1464 # ItemPickup176752623547 Secret10_Details (X=-42905.090 Y=-38279.828 Z=11192.738) +} + +loc_trailer_cabin = { + "Trailer Cabin Scraps 1": base_id + 1465, # ItemPickup493_17 TrailerCabin_Details (X=-50702.449 Y=-38850.020 Z=10810.316) + "Trailer Cabin Scraps 2": base_id + 1466, # ItemPickup489_5 TrailerCabin_Details (X=-51365.684 Y=-38502.379 Z=10875.761) + "Trailer Cabin Scraps 3": base_id + 1467, # ItemPickup491_11 TrailerCabin_Details (X=-52397.570 Y=-37530.145 Z=10873.624) + "Trailer Cabin Scraps 4": base_id + 1468, # ItemPickup490_8 TrailerCabin_Details (X=-50625.746 Y=-37916.758 Z=10886.909) + "Trailer Cabin Scraps 5": base_id + 1469, # ItemPickup488_2 TrailerCabin_Details (X=-51201.051 Y=-37467.137 Z=10910.795) + "Trailer Cabin Scraps 6": base_id + 1470 # ItemPickup492_14 TrailerCabin_Details (X=-51891.320 Y=-40549.492 Z=10675.211) +} + +loc_towers = { + "Towers Scraps 1": base_id + 1471, # ItemPickup486_32 Towers_Environment_Details (X=-24434.766 Y=-25708.373 Z=11200.865) + "Towers Scraps 2": base_id + 1472, # ItemPickup483_23 Towers_Environment_Details (X=-20970.262 Y=-25678.754 Z=11731.241) + "Towers Scraps 3": base_id + 1473, # ItemPickup481_17 Towers_Environment_Details (X=-19812.230 Y=-27768.301 Z=12051.623) + "Towers Scraps 4": base_id + 1474, # ItemPickup484_26 Towers_Environment_Details (X=-19940.912 Y=-25411.576 Z=12035.366) + "Towers Scraps 5": base_id + 1475, # ItemPickup41_17 Towers_Environment (X=-18596.791 Y=-25100.035 Z=12290.350) + "Towers Scraps 6": base_id + 1476, # ItemPickup482_20 Towers_Environment_Details (X=-23302.396 Y=-23270.324 Z=12036.164) + "Towers Scraps 7": base_id + 1477, # ItemPickup487_35 Towers_Environment_Details (X=-22955.039 Y=-27576.859 Z=11211.258) + "Towers Scraps 8": base_id + 1478, # ItemPickup478_8 Towers_Environment_Details (X=-21485.520 Y=-29634.893 Z=11787.103) + "Towers Scraps 9": base_id + 1479, # ItemPickup477_5 Towers_Environment_Details (X=-23667.957 Y=-29825.240 Z=12035.269) + "Towers Scraps 10": base_id + 1480, # ItemPickup39_11 Towers_Environment (X=-25361.008 Y=-29794.301 Z=12026.073) + "Towers Scraps 11": base_id + 1481, # ItemPickup476_2 Towers_Environment_Details (X=-26549.584 Y=-32768.133 Z=12289.732) + "Towers Scraps 12": base_id + 1482, # ItemPickup38_8 Towers_Environment (X=-27240.127 Y=-27404.748 Z=12027.208) + "Towers Scraps 13": base_id + 1483, # ItemPickup40_14 Towers_Environment (X=-23231.639 Y=-27799.158 Z=11829.792) + "Towers Scraps 14": base_id + 1484, # ItemPickup485_29 Towers_Environment_Details (X=-22949.568 Y=-26146.012 Z=11702.730) + "Towers Scraps 15": base_id + 1485, # ItemPickup479_11 Towers_Environment_Details (X=-19726.715 Y=-32464.682 Z=12118.678) + "Towers Scraps 16": base_id + 1486, # ItemPickup1366543 Tower_BuildingsExteriorDetails (X=-23495.104 Y=-27644.689 Z=11872.844) + "Towers Scraps 17": base_id + 1487, # ItemPickup139978 Tower_BuildingsExteriorDetails (X=-23512.971 Y=-27493.051 Z=12218.543) + "Towers Scraps 18": base_id + 1488, # ItemPickup42_20 Towers_Environment (X=-22731.439 Y=-26331.393 Z=12102.758) + "Towers Scraps 19": base_id + 1489, # ItemPickup131123 Tower_BuildingsExteriorDetails (X=-22599.641 Y=-26454.590 Z=11752.040) + "Towers Scraps 20": base_id + 1490, # ItemPickup196987 Tower_BuildingsExteriorDetails (X=-22589.721 Y=-26397.414 Z=12571.282) + "Towers Scraps 21": base_id + 1491, # ItemPickup138787 Tower_BuildingsExteriorDetails (X=-22163.268 Y=-26775.938 Z=13107.048) + "Towers Scraps 22": base_id + 1492, # ItemPickup43_23 Towers_Environment (X=-21996.184 Y=-26754.393 Z=13105.997) + "Towers Scraps 23": base_id + 1493, # ItemPickup837454 Tower_BuildingsExteriorDetails (X=-24068.221 Y=-27874.443 Z=12819.666) + "Towers Scraps 24": base_id + 1494, # ItemPickup44_29 Towers_Environment (X=-23525.330 Y=-27770.035 Z=12612.871) + "Towers Scraps 25": base_id + 1495, # ItemPickup18932 Tower_BuildingsExteriorDetails (X=-23472.215 Y=-27617.404 Z=13213.256) + "Towers Scraps 26": base_id + 1496, # ItemPickup188348 Tower_BuildingsExteriorDetails (X=-23981.588 Y=-27984.385 Z=13219.854) + "Towers Scraps 27": base_id + 1497, # ItemPickup480_14 Towers_Environment_Details (X=-18696.230 Y=-34511.277 Z=12704.238) + "Towers Lime Paint Can": base_id + 1498, # PaintCan_2 Towers_BuildingsDetails (X=-22288.555 Y=-26022.281 Z=11835.892) \!/ Existing match 5 + "Towers Employment Contracts": base_id + 1499, # Towers_Files_Pickup Tower_BuildingsExteriorDetails (X=-24081.414 Y=-27637.459 Z=13679.163) + "Towers Ronny Mission End": base_id + 1500 # (dialog 3) -> 1_scraps_reward +} + +loc_north_beach = { + "North Beach Chest Scraps 1": base_id + 1501, # ItemPickup9254 Secret3_CampDetails (X=-74444.648 Y=-130627.672 Z=8793.757) + "North Beach Chest Scraps 2": base_id + 1502, # ItemPickup14523 Secret3_CampDetails (X=-74426.539 Y=-130626.547 Z=8781.948) + "North Beach Chest Scraps 3": base_id + 1503, # ItemPickup084537 Secret3_CampDetails (X=-74448.852 Y=-130632.367 Z=8772.555) + "North Beach Chest Scraps 4": base_id + 1504, # ItemPickup17754234 Secret3_CampDetails (X=-74425.523 Y=-130622.875 Z=8755.526) + "North Beach Scraps 1": base_id + 1505, # ItemPickup376_5 Secret3_CampDetails (X=-75003.078 Y=-131084.016 Z=8729.731) + "North Beach Scraps 2": base_id + 1506, # ItemPickup378_11 Secret3_CampDetails (X=-75477.758 Y=-129413.750 Z=9082.617) + "North Beach Scraps 3": base_id + 1507, # ItemPickup377_8 Secret3_CampDetails (X=-75608.453 Y=-130483.430 Z=8909.659) + "North Beach Scraps 4": base_id + 1508, # ItemPickup375_2 Secret3_CampDetails (X=-74143.469 Y=-131117.953 Z=8752.130) + "North Beach Scraps 5": base_id + 1509, # ItemPickup387_6 Secret4_BeachHouseMain (X=-80847.078 Y=-135628.719 Z=7915.444) + "North Beach Scraps 6": base_id + 1510, # ItemPickup386_3 Secret4_BeachHouseMain (X=-84044.789 Y=-137591.000 Z=7359.172) + "North Beach Scraps 7": base_id + 1511, # ItemPickup379_2 Secret4_BeachHouseDetails (X=-83992.836 Y=-132933.531 Z=7941.225) + "North Beach Scraps 8": base_id + 1512, # ItemPickup380_5 Secret4_BeachHouseDetails (X=-87355.734 Y=-134216.438 Z=7237.310) + "North Beach Scraps 9": base_id + 1513, # ItemPickup384_17 Secret4_BeachHouseDetails (X=-89213.844 Y=-134625.922 Z=7185.133) + "North Beach Scraps 10": base_id + 1514, # ItemPickup25_0 Secret4_BeachHouseDetails (X=-88423.430 Y=-135922.969 Z=7290.801) + "North Beach Scraps 11": base_id + 1515, # ItemPickup381_8 Secret4_BeachHouseDetails (X=-87668.977 Y=-136850.359 Z=7275.346) + "North Beach Scraps 12": base_id + 1516, # ItemPickup383_14 Secret4_BeachHouseDetails (X=-90241.328 Y=-136381.000 Z=7199.622) + "North Beach Scraps 13": base_id + 1517, # ItemPickup27_8 Secret4_BeachHouseDetails (X=-91728.680 Y=-135288.203 Z=7319.699) + "North Beach Scraps 14": base_id + 1518, # ItemPickup26_2 Secret4_BeachHouseDetails (X=-88789.039 Y=-135461.719 Z=7305.800) + "North Beach Scraps 15": base_id + 1519, # ItemPickup382_11 Secret4_BeachHouseDetails (X=-88572.078 Y=-135970.734 Z=7302.674) + "North Beach Teal Paint Can": base_id + 1520 # PaintCan_2 Secret4_BeachHouseDetails (X=-91706.805 Y=-134988.453 Z=7347.827) \!/ Existing match 5 + # "North Beach Scraps Glitch 1" ItemPickup385_20 (X=-77651.938 Y=-139721.453 Z=7261.729) /!\ Glitched scrap +} + +loc_mine_shaft = { + "Mine Shaft Chest Scraps 1": base_id + 1521, # ItemPickup0934569 Secret13_Details (X=-17360.789 Y=-74064.367 Z=8038.313) + "Mine Shaft Chest Scraps 2": base_id + 1522, # ItemPickup17234455622 Secret13_Details (X=-17360.814 Y=-74064.367 Z=8024.187) + "Mine Shaft Chest Scraps 3": base_id + 1523, # ItemPickup856743 Secret13_Details (X=-17361.059 Y=-74049.234 Z=8015.940) + "Mine Shaft Chest Scraps 4": base_id + 1524, # ItemPickup16456456 Secret13_Details (X=-17336.465 Y=-74087.063 Z=8009.707) + "Mine Shaft Chest Scraps 5": base_id + 1525, # ItemPickup234743 Secret13_Details (X=-17349.941 Y=-74075.484 Z=8004.179) + "Mine Shaft Chest Scraps 6": base_id + 1526, # ItemPickup1434563456 Secret13_Details (X=-17361.084 Y=-74049.234 Z=8001.814) + "Mine Shaft Chest Scraps 7": base_id + 1527, # ItemPickup13634563456 Secret13_Details (X=-17349.967 Y=-74075.484 Z=7990.054) + "Mine Shaft Scraps 1": base_id + 1528, # ItemPickup369_23 Secret13_Details (X=-16985.645 Y=-70377.273 Z=10837.127) + "Mine Shaft Scraps 2": base_id + 1529, # ItemPickup368_20 Secret13_Details (X=-18292.045 Y=-71003.563 Z=10975.308) + "Mine Shaft Scraps 3": base_id + 1530, # ItemPickup367_17 Secret13_Details (X=-16150.797 Y=-72075.289 Z=10609.141) + "Mine Shaft Scraps 4": base_id + 1531, # ItemPickup24456463 Secret13_EntranceDetails1 (X=-18404.480 Y=-71894.367 Z=10968.230) + "Mine Shaft Scraps 5": base_id + 1532, # ItemPickup2565644 Secret13_Details (X=-17777.268 Y=-71467.172 Z=10441.745) + "Mine Shaft Scraps 6": base_id + 1533, # ItemPickup366_14 Secret13_Details (X=-17630.971 Y=-72800.641 Z=8842.322) + "Mine Shaft Scraps 7": base_id + 1534, # ItemPickup18_8 Secret13_Details (X=-17979.719 Y=-73413.563 Z=8118.260) + "Mine Shaft Scraps 8": base_id + 1535, # ItemPickup21_11 Secret13_Details (X=-16554.467 Y=-74139.781 Z=7892.738) + "Mine Shaft Scraps 9": base_id + 1536, # ItemPickup365_11 Secret13_Details (X=-16343.033 Y=-74617.555 Z=7298.177) + "Mine Shaft Scraps 10": base_id + 1537, # ItemPickup22123 Secret13_Details (X=-12390.332 Y=-77620.320 Z=7324.504) + "Mine Shaft Scraps 11": base_id + 1538, # ItemPickup364_8 Secret13_Details (X=-10969.702 Y=-77961.477 Z=7297.171) + "Mine Shaft Scraps 12": base_id + 1539, # ItemPickup363_5 Secret13_Details (X=-9888.596 Y=-78208.930 Z=7269.473) + "Mine Shaft Scraps 13": base_id + 1540, # ItemPickup362_2 Secret13_Details (X=-8865.696 Y=-79063.977 Z=7247.677) + "Mine Shaft Scraps 14": base_id + 1541 # ItemPickup238976 Secret13_ExitDetails (X=-8143.984 Y=-79764.617 Z=7222.096) +} + +loc_mob_camp = { + "Mob Camp Key": base_id + 1542, # ItemPickup29_0 Bob_CampDetails2 (X=-29114.480 Y=-53608.520 Z=12839.528) + "Mob Camp Scraps 1": base_id + 1543, # ItemPickup25_5 Bob_CampDetails2 (X=-27373.525 Y=-53008.668 Z=12706.465) + "Mob Camp Scraps 2": base_id + 1544, # ItemPickup26_1 Bob_CampDetails2 (X=-28786.941 Y=-53009.762 Z=12760.727) + "Mob Camp Scraps 3": base_id + 1545, # ItemPickup13_14 Mine3_Mountain (X=-29650.207 Y=-53328.070 Z=12724.598) + "Mob Camp Scraps 4": base_id + 1546, # ItemPickup90_5 Bob_CampDetails2 (X=-31515.057 Y=-55533.324 Z=12344.274) + "Mob Camp Scraps 5": base_id + 1547, # ItemPickup49513294 Mine3_Mountain (X=-31847.229 Y=-55152.352 Z=11574.255) + "Mob Camp Scraps 6": base_id + 1548, # ItemPickup92_14 Bob_CampDetails2 (X=-31323.533 Y=-55432.871 Z=11245.139) + "Mob Camp Scraps 7": base_id + 1549, # ItemPickup91_8 Bob_CampDetails2 (X=-31583.443 Y=-55475.805 Z=11234.112) + "Mob Camp Scraps 8": base_id + 1550, # ItemPickup95_23 Bob_CampDetails2 (X=-32925.406 Y=-57157.605 Z=11086.322) + "Mob Camp Scraps 9": base_id + 1551, # ItemPickup96_26 Bob_CampDetails2 (X=-33052.488 Y=-58560.098 Z=11101.021) + "Mob Camp Scraps 10": base_id + 1552, # ItemPickup13121212 Mine3_Mountain (X=-32422.406 Y=-60145.063 Z=11203.182) + "Mob Camp Scraps 11": base_id + 1553, # ItemPickup93_17 Bob_CampDetails2 (X=-30891.457 Y=-60046.465 Z=11237.567) + "Mob Camp Scraps 12": base_id + 1554, # ItemPickup97_29 Bob_CampDetails2 (X=-31888.428 Y=-59222.645 Z=11179.302) + "Mob Camp Scraps 13": base_id + 1555, # ItemPickup62156 Mine3_Mountain (X=-31161.750 Y=-57410.789 Z=11279.820) + "Mob Camp Scraps 14": base_id + 1556, # ItemPickup24_3 Bob_CampDetails2 (X=-31256.545 Y=-59865.809 Z=11904.155) + "Mob Camp Scraps 15": base_id + 1557, # ItemPickup27_0 Bob_CampDetails2 (X=-31757.953 Y=-57179.258 Z=11295.150) + "Mob Camp Scraps 16": base_id + 1558 # ItemPickup89_2 Bob_CampDetails2 (X=-29137.043 Y=-54824.797 Z=12418.673) +} + +loc_mob_camp_locked_room = { + "Mob Camp Locked Room Scraps 1": base_id + 1559, # ItemPickup94_20 Bob_CampDetails2 (X=-31736.459 Y=-59761.465 Z=11211.379) + "Mob Camp Locked Room Scraps 2": base_id + 1560, # ItemPickup28_14 Bob_CampDetails2 (X=-32150.889 Y=-59879.594 Z=11297.058) + "Mob Camp Locked Room Stolen Bob": base_id + 1561 # Bob_Clickbox (X=-31771.172 Y=-59892.449 Z=11323.562) +} + +loc_mine_elevator_exit = { + "Mine Elevator Exit Scraps 1": base_id + 1562, # ItemPickup266_19 Mine3_ExitCampDetails (X=-29587.271 Y=-42650.797 Z=12515.042) + "Mine Elevator Exit Scraps 2": base_id + 1563, # ItemPickup265_16 Mine3_ExitCampDetails (X=-30727.555 Y=-42715.438 Z=12485.763) + "Mine Elevator Exit Scraps 3": base_id + 1564, # ItemPickup267_22 Mine3_ExitCampDetails (X=-29814.680 Y=-43722.777 Z=12518.878) + "Mine Elevator Exit Scraps 4": base_id + 1565, # ItemPickup261_2 Mine3_ExitCampDetails (X=-30983.000 Y=-42943.754 Z=12474.396) + "Mine Elevator Exit Scraps 5": base_id + 1566, # ItemPickup262_5 Mine3_ExitCampDetails (X=-31824.576 Y=-43997.270 Z=12345.908) + "Mine Elevator Exit Scraps 6": base_id + 1567, # ItemPickup268_25 Mine3_ExitCampDetails (X=-32553.924 Y=-44761.855 Z=12341.698) + "Mine Elevator Exit Scraps 7": base_id + 1568, # ItemPickup263_10 Mine3_ExitCampDetails (X=-33598.023 Y=-44369.297 Z=12438.430) + "Mine Elevator Exit Scraps 8": base_id + 1569, # ItemPickup264_13 Mine3_ExitCampDetails (X=-31947.459 Y=-42017.137 Z=12384.311) + "Mine Elevator Exit Scraps 9": base_id + 1570 # ItemPickup269_28 Mine3_ExitCampDetails (X=-30127.123 Y=-46004.891 Z=12229.104) +} + +loc_mountain_ruin_outside = { + "Mountain Ruin Outside Scraps 1": base_id + 1571, # ItemPickup112345556 Mine3_Outside (X=-2218.456 Y=-43914.789 Z=11238.952) + "Mountain Ruin Outside Scraps 2": base_id + 1572, # ItemPickup35621 Mine3_Outside (X=-2402.206 Y=-45494.766 Z=11244.650) + "Mountain Ruin Outside Scraps 3": base_id + 1573, # ItemPickup13000 Mine3_Outside (X=-2781.385 Y=-47365.313 Z=11235.389) + "Mountain Ruin Outside Scraps 4": base_id + 1574, # ItemPickup995959 Mine3_Outside (X=-2961.431 Y=-45445.973 Z=11255.289) + "Mountain Ruin Outside Scraps 5": base_id + 1575, # ItemPickup136999 Mine3_Outside (X=-5873.435 Y=-46300.633 Z=11228.667) + "Mountain Ruin Outside Scraps 6": base_id + 1576, # ItemPickup1589994 Mine3_Outside (X=-1823.357 Y=-47071.813 Z=11161.523) + "Mountain Ruin Outside Scraps 7": base_id + 1577, # ItemPickup09871230948 Mine3_Outside (X=-3478.155 Y=-49094.965 Z=11083.230) + "Mountain Ruin Outside Scraps 8": base_id + 1578, # ItemPickup258_20 Mine3_Camp (X=-4606.678 Y=-50246.180 Z=11613.938) + "Mountain Ruin Outside Scraps 9": base_id + 1579, # ItemPickup257_17 Mine3_Camp (X=-5454.638 Y=-53508.004 Z=12062.944) + "Mountain Ruin Outside Scraps 10": base_id + 1580, # ItemPickup18_3 Mine3_Camp (X=-8192.042 Y=-53726.535 Z=11947.394) + "Mountain Ruin Outside Scraps 11": base_id + 1581, # ItemPickup252_2 Mine3_Camp (X=-9409.834 Y=-53970.621 Z=11923.256) + "Mountain Ruin Outside Scraps 12": base_id + 1582, # ItemPickup254_8 Mine3_Camp (X=-8977.424 Y=-57134.637 Z=12232.596) + "Mountain Ruin Outside Scraps 13": base_id + 1583, # ItemPickup19_1 Mine3_Camp (X=-10449.292 Y=-56481.938 Z=12274.706) + "Mountain Ruin Outside Scraps 14": base_id + 1584, # ItemPickup255_11 Mine3_Camp (X=-10490.690 Y=-56584.301 Z=12281.096) + "Mountain Ruin Outside Scraps 15": base_id + 1585, # ItemPickup256_14 Mine3_Camp (X=-11600.937 Y=-55831.191 Z=12388.329) + "Mountain Ruin Outside Scraps 16": base_id + 1586, # ItemPickup259_23 Mine3_Camp (X=-3307.077 Y=-49973.461 Z=11282.041) + "Mountain Ruin Outside Scraps 17": base_id + 1587 # ItemPickup260_26 Mine3_Camp (X=-8878.345 Y=-49816.922 Z=13700.768) +} + +loc_mountain_ruin_inside = { + "Mountain Ruin Inside Scraps 1": base_id + 1588, # ItemPickup253_5 Mine3_Camp (X=-10647.446 Y=-52039.848 Z=11925.344) + "Mountain Ruin Inside Scraps 2": base_id + 1589, # ItemPickup270_2 Mine3_Interior1 (X=-12834.990 Y=-48683.176 Z=10200.083) + "Mountain Ruin Inside Scraps 3": base_id + 1590, # ItemPickup271_5 Mine3_Interior1 (X=-15748.594 Y=-44925.523 Z=10199.975) + "Mountain Ruin Inside Scraps 4": base_id + 1591, # ItemPickup20_3 Mine3_Interior1 (X=-15312.152 Y=-43957.055 Z=10350.783) + "Mountain Ruin Inside Scraps 5": base_id + 1592, # ItemPickup273_11 Mine3_Interior1 (X=-16709.586 Y=-44997.316 Z=10198.888) + "Mountain Ruin Inside Scraps 6": base_id + 1593, # ItemPickup272_8 Mine3_Interior1 (X=-17412.561 Y=-46041.977 Z=10349.650) + "Mountain Ruin Inside Scraps 7": base_id + 1594, # ItemPickup274_14 Mine3_Interior1 (X=-17452.596 Y=-43804.941 Z=10201.436) + "Mountain Ruin Inside Scraps 8": base_id + 1595, # ItemPickup21_2 Mine3_Interior1 (X=-18119.473 Y=-42001.453 Z=10198.855) + "Mountain Ruin Inside Scraps 9": base_id + 1596, # ItemPickup276_20 Mine3_Interior1 (X=-18975.068 Y=-42906.488 Z=10279.690) + "Mountain Ruin Inside Scraps 10": base_id + 1597, # ItemPickup277_26 Mine3_Interior1 (X=-19727.902 Y=-41581.039 Z=10199.614) + "Mountain Ruin Inside Scraps 11": base_id + 1598, # ItemPickup275_17 Mine3_Interior1 (X=-19187.891 Y=-40516.941 Z=10201.049) + "Mountain Ruin Inside Scraps 12": base_id + 1599, # ItemPickup278_29 Mine3_Interior1 (X=-22470.986 Y=-41602.875 Z=10073.847) + "Mountain Ruin Inside Scraps 13": base_id + 1600, # ItemPickup279_2 Mine3_Interior2 (X=-23717.383 Y=-42597.141 Z=7455.452) + "Mountain Ruin Inside Scraps 14": base_id + 1601, # ItemPickup22_7 Mine3_Interior2 (X=-24494.582 Y=-44598.086 Z=7433.633) + "Mountain Ruin Inside Scraps 15": base_id + 1602, # ItemPickup280_5 Mine3_Interior2 (X=-26783.293 Y=-42331.145 Z=7446.357) + "Mountain Ruin Inside Scraps 16": base_id + 1603, # ItemPickup281_8 Mine3_Interior2 (X=-28636.996 Y=-46745.340 Z=7430.463) + "Mountain Ruin Inside Scraps 17": base_id + 1604, # ItemPickup23_1 Mine3_Interior2 (X=-27752.643 Y=-47453.973 Z=7445.047) + "Mountain Ruin Inside Red Egg": base_id + 1605, # Mine3_EggPickup Mine3_Interior2 (X=-28254.400 Y=-45702.844 Z=7551.568) + "Mountain Ruin Inside Red Paint Can": base_id + 1606 # PaintCan_2 Mine3_Interior2 (X=-31391.293 Y=-44953.223 Z=7448.648) \!/ Existing match 5 +} + +loc_pickle_val = { + "Pickle Val Scraps 1": base_id + 1607, # ItemPickup56_2 Pickles_HouseDetails (X=60402.582 Y=25252.434 Z=11151.982) + "Pickle Val Scraps 2": base_id + 1608, # ItemPickup57_5 Pickles_HouseDetails (X=58717.516 Y=24457.180 Z=11343.938) + "Pickle Val Scraps 3": base_id + 1609, # ItemPickup311_14 Pickles_EnvironmentDetails (X=56455.688 Y=22324.875 Z=11655.192) + "Pickle Val Scraps 4": base_id + 1610, # ItemPickup310_11 Pickles_EnvironmentDetails (X=52888.387 Y=22541.955 Z=12428.012) + "Pickle Val Scraps 5": base_id + 1611, # ItemPickup58_2 Pickles_EnvironmentDetails (X=50374.863 Y=22073.027 Z=12591.468) + "Pickle Val Scraps 6": base_id + 1612, # ItemPickup309_8 Pickles_EnvironmentDetails (X=45985.988 Y=23063.826 Z=13043.497) + "Pickle Val Scraps 7": base_id + 1613, # ItemPickup316_27 Pickles_EnvironmentDetails (X=45533.469 Y=24876.168 Z=13015.539) + "Pickle Val Scraps 8": base_id + 1614, # ItemPickup317_30 Pickles_EnvironmentDetails (X=44928.848 Y=30913.396 Z=14273.230) + "Pickle Val Scraps 9": base_id + 1615, # ItemPickup321_42 Pickles_EnvironmentDetails (X=41572.684 Y=37403.539 Z=13527.379) + "Pickle Val Scraps 10": base_id + 1616, # ItemPickup61_11 Pickles_EnvironmentDetails (X=42266.566 Y=30556.238 Z=13584.196) + "Pickle Val Scraps 11": base_id + 1617, # ItemPickup314_21 Pickles_EnvironmentDetails (X=43356.219 Y=29465.746 Z=13449.486) + "Pickle Val Scraps 12": base_id + 1618, # ItemPickup323_48 Pickles_EnvironmentDetails (X=40893.461 Y=30669.398 Z=13465.039) + "Pickle Val Scraps 13": base_id + 1619, # ItemPickup318_33 Pickles_EnvironmentDetails (X=41276.863 Y=32313.068 Z=13480.846) + "Pickle Val Scraps 14": base_id + 1620, # ItemPickup319_36 Pickles_EnvironmentDetails (X=38630.031 Y=30471.996 Z=13571.207) + "Pickle Val Scraps 15": base_id + 1621, # ItemPickup320_39 Pickles_EnvironmentDetails (X=38596.938 Y=30050.293 Z=13559.574) + "Pickle Val Scraps 16": base_id + 1622, # ItemPickup60_8 Pickles_EnvironmentDetails (X=42042.520 Y=25136.820 Z=13077.339) + "Pickle Val Scraps 17": base_id + 1623, # ItemPickup308_5 Pickles_EnvironmentDetails (X=43770.914 Y=23307.234 Z=12374.002) + "Pickle Val Scraps 18": base_id + 1624, # ItemPickup59_5 Pickles_EnvironmentDetails (X=44672.641 Y=20936.520 Z=12198.017) + "Pickle Val Scraps 19": base_id + 1625, # ItemPickup307_2 Pickles_EnvironmentDetails (X=42844.730 Y=22869.387 Z=12832.900) + "Pickle Val Scraps 20": base_id + 1626, # ItemPickup315_24 Pickles_EnvironmentDetails (X=43397.758 Y=26367.248 Z=13005.097) + "Pickle Val Scraps 21": base_id + 1627, # ItemPickup322_45 Pickles_EnvironmentDetails (X=39352.430 Y=32668.316 Z=14494.778) + "Pickle Val Scraps 22": base_id + 1628, # ItemPickup313 Pickles_EnvironmentDetails (X=59688.781 Y=25266.756 Z=11425.324) + "Pickle Val Scraps 23": base_id + 1629, # ItemPickup312_17 Pickles_EnvironmentDetails (X=59197.871 Y=24760.773 Z=11425.324) + "Pickle Val Purple Paint Can": base_id + 1630, # PaintCan_7 Pickles_EnvironmentDetails (X=40394.855 Y=31546.465 Z=13472.573) + "Pickle Val Jar of Pickles": base_id + 1631, # Pickles_Pickup Pickles_Cave (X=38227.535 Y=30234.848 Z=13593.506) + "Pickle Val Pickle Lady Mission End": base_id + 1632 # (dialog 4) -> 30_scraps_reward +} + +loc_shrine_near_temple = { + "Shrine Near Temple Scraps 1": base_id + 1633, # ItemPickup3 Photorealistic_Island (X=-4675.183 Y=-21143.846 Z=11984.782) + "Shrine Near Temple Scraps 2": base_id + 1634, # ItemPickup_2 Photorealistic_Island (X=-4994.117 Y=-20496.621 Z=11874.112) + "Shrine Near Temple Scraps 3": base_id + 1635 # ItemPickup2 Photorealistic_Island (X=-4196.896 Y=-20477.025 Z=11882.833) +} + +loc_morse_bunker = { + "Morse Bunker Chest Scraps 1": base_id + 1636, # ItemPickup6512 Secret6_BunkerDetails (X=-47961.078 Y=-85433.031 Z=10615.777) + "Morse Bunker Chest Scraps 2": base_id + 1637, # ItemPickup9363 Secret6_BunkerDetails (X=-47958.617 Y=-85444.805 Z=10604.365) + "Morse Bunker Chest Scraps 3": base_id + 1638, # ItemPickup921436 Secret6_BunkerDetails (X=-47953.637 Y=-85426.172 Z=10592.347) + "Morse Bunker Chest Scraps 4": base_id + 1639, # ItemPickup0128704 Secret6_BunkerDetails (X=-47958.691 Y=-85444.805 Z=10587.060) + "Morse Bunker Chest Scraps 5": base_id + 1640, # ItemPickup64_8 Secret6_BunkerDetails (X=-47953.617 Y=-85426.172 Z=10574.149) + "Morse Bunker Scraps 1": base_id + 1641, # ItemPickup397_2 Secret6_BunkerDetails (X=-48336.863 Y=-85458.453 Z=10574.537) + "Morse Bunker Scraps 2": base_id + 1642, # ItemPickup62_2 Secret6_BunkerDetails (X=-48253.844 Y=-84944.609 Z=10573.793) + "Morse Bunker Scraps 3": base_id + 1643, # ItemPickup63_5 Secret6_BunkerDetails (X=-47272.422 Y=-84549.945 Z=10543.671) + "Morse Bunker Scraps 4": base_id + 1644, # ItemPickup398_5 Secret6_BunkerDetails (X=-47080.836 Y=-85268.281 Z=10564.355) + "Morse Bunker Scraps 5": base_id + 1645, # ItemPickup406_31 Secret6_BunkerDetails (X=-47913.855 Y=-85234.258 Z=10819.314) + "Morse Bunker Scraps 6": base_id + 1646, # ItemPickup405_28 Secret6_BunkerDetails (X=-46410.227 Y=-83293.742 Z=10361.746) + "Morse Bunker Scraps 7": base_id + 1647, # ItemPickup399_8 Secret6_BunkerDetails (X=-45204.199 Y=-84841.211 Z=10329.200) + "Morse Bunker Scraps 8": base_id + 1648, # ItemPickup401_14 Secret6_BunkerDetails (X=-43895.801 Y=-83794.750 Z=10265.661) + "Morse Bunker Scraps 9": base_id + 1649, # ItemPickup402_17 Secret6_BunkerDetails (X=-45163.078 Y=-80832.828 Z=10090.777) + "Morse Bunker Scraps 10": base_id + 1650, # ItemPickup403_20 Secret6_BunkerDetails (X=-46782.027 Y=-82284.805 Z=10289.180) + "Morse Bunker Scraps 11": base_id + 1651, # ItemPickup404_23 Secret6_BunkerDetails (X=-49240.047 Y=-83654.961 Z=10898.540) + "Morse Bunker Scraps 12": base_id + 1652, # ItemPickup407_34 Secret6_BunkerDetails (X=-46571.930 Y=-85962.773 Z=10697.339) + "Morse Bunker Scraps 13": base_id + 1653 # ItemPickup400_11 Secret6_BunkerDetails (X=-43472.793 Y=-85983.805 Z=10310.322) +} + +loc_prism_temple = { + "Prism Temple Chest Scraps 1": base_id + 1654, # ItemPickup16632 MainShrine_DetailsREPAIRED (X=12659.641 Y=-27827.016 Z=10930.621) + "Prism Temple Chest Scraps 2": base_id + 1655, # ItemPickup148864 MainShrine_DetailsREPAIRED (X=12648.021 Y=-27825.189 Z=10916.296) + "Prism Temple Chest Scraps 3": base_id + 1656, # ItemPickup13123 MainShrine_DetailsREPAIRED (X=12665.557 Y=-27836.633 Z=10905.999) + "Prism Temple Scraps 1": base_id + 1657, # ItemPickup225_77 MainShrine_ExteriorDetails (X=5281.087 Y=-16620.387 Z=10520.609) + "Prism Temple Scraps 2": base_id + 1658, # ItemPickup223_71 MainShrine_ExteriorDetails (X=15032.147 Y=-16788.352 Z=10992.200) + "Prism Temple Scraps 3": base_id + 1659, # ItemPickup222_68 MainShrine_ExteriorDetails (X=16591.920 Y=-18725.771 Z=11004.751) + "Prism Temple Scraps 4": base_id + 1660, # ItemPickup135123 MainShrine_DetailsREPAIRED (X=17940.854 Y=-20726.746 Z=10999.944) + "Prism Temple Scraps 5": base_id + 1661, # ItemPickup220_62 MainShrine_ExteriorDetails (X=18187.346 Y=-21390.066 Z=11025.650) + "Prism Temple Scraps 6": base_id + 1662, # ItemPickup218_56 MainShrine_ExteriorDetails (X=19218.670 Y=-24017.619 Z=10906.966) + "Prism Temple Scraps 7": base_id + 1663, # ItemPickup209_29 MainShrine_ExteriorDetails (X=7710.977 Y=-23469.254 Z=11012.888) + "Prism Temple Scraps 8": base_id + 1664, # ItemPickup138765 MainShrine_DetailsREPAIRED (X=8160.002 Y=-22335.266 Z=11016.638) + "Prism Temple Scraps 9": base_id + 1665, # ItemPickup210_32 MainShrine_ExteriorDetails (X=8637.903 Y=-24295.850 Z=10929.299) + "Prism Temple Scraps 10": base_id + 1666, # ItemPickup1112 MainShrine_DetailsREPAIRED (X=7923.367 Y=-25204.055 Z=10832.877) + "Prism Temple Scraps 11": base_id + 1667, # ItemPickup214_44 MainShrine_ExteriorDetails (X=10694.420 Y=-27246.365 Z=10569.074) + "Prism Temple Scraps 12": base_id + 1668, # ItemPickup215_47 MainShrine_ExteriorDetails (X=12892.631 Y=-26743.068 Z=10868.578) + "Prism Temple Scraps 13": base_id + 1669, # ItemPickup213_41 MainShrine_ExteriorDetails (X=12483.535 Y=-27253.867 Z=10876.461) + "Prism Temple Scraps 14": base_id + 1670, # ItemPickup212_38 MainShrine_ExteriorDetails (X=13259.813 Y=-27092.033 Z=10887.968) + "Prism Temple Scraps 15": base_id + 1671, # ItemPickup211_35 MainShrine_ExteriorDetails (X=9303.245 Y=-25057.908 Z=10943.273) + "Prism Temple Scraps 16": base_id + 1672, # ItemPickup201_2 MainShrine_ExteriorDetails (X=11750.875 Y=-22999.371 Z=12426.734) + "Prism Temple Scraps 17": base_id + 1673, # ItemPickup203_8 MainShrine_ExteriorDetails (X=12966.615 Y=-23568.324 Z=12519.387) + "Prism Temple Scraps 18": base_id + 1674, # ItemPickup204_11 MainShrine_ExteriorDetails (X=14093.343 Y=-22393.182 Z=12426.847) + "Prism Temple Scraps 19": base_id + 1675, # ItemPickup206_17 MainShrine_ExteriorDetails (X=13767.980 Y=-21269.568 Z=12425.791) + "Prism Temple Scraps 20": base_id + 1676, # ItemPickup207_23 MainShrine_ExteriorDetails (X=12882.754 Y=-20027.527 Z=12516.095) + "Prism Temple Scraps 21": base_id + 1677, # ItemPickup114535 MainShrine_DetailsREPAIRED (X=11883.399 Y=-20801.344 Z=12428.452) + "Prism Temple Scraps 22": base_id + 1678, # ItemPickup208_26 MainShrine_ExteriorDetails (X=13281.792 Y=-21302.344 Z=12902.728) + "Prism Temple Scraps 23": base_id + 1679, # ItemPickup205_14 MainShrine_ExteriorDetails (X=14190.678 Y=-23671.621 Z=11781.533) + "Prism Temple Scraps 24": base_id + 1680, # ItemPickup8903 MainShrine_DetailsREPAIRED (X=14311.736 Y=-22347.758 Z=11765.781) + "Prism Temple Scraps 25": base_id + 1681, # ItemPickup654 MainShrine_DetailsREPAIRED (X=13826.154 Y=-19923.131 Z=11755.189) + "Prism Temple Scraps 26": base_id + 1682, # ItemPickup224_74 MainShrine_ExteriorDetails (X=12443.228 Y=-18577.926 Z=11240.455) + "Prism Temple Scraps 27": base_id + 1683, # ItemPickup202_5 MainShrine_ExteriorDetails (X=10993.180 Y=-23783.047 Z=11754.121) + "Prism Temple Scraps 28": base_id + 1684, # ItemPickup13098 MainShrine_DetailsREPAIRED (X=16762.963 Y=-23634.342 Z=11031.588) + "Prism Temple Scraps 29": base_id + 1685, # ItemPickup221_65 MainShrine_ExteriorDetails (X=17804.979 Y=-23512.395 Z=11066.884) + "Prism Temple Scraps 30": base_id + 1686, # ItemPickup17123123565 MainShrine_DetailsREPAIRED (X=16998.229 Y=-23241.652 Z=11055.539) + "Prism Temple Scraps 31": base_id + 1687, # ItemPickup10812783 MainShrine_DetailsREPAIRED (X=17613.518 Y=-23799.813 Z=11057.277) + "Prism Temple Scraps 32": base_id + 1688, # ItemPickup216_50 MainShrine_ExteriorDetails (X=15342.375 Y=-24807.357 Z=11024.192) + "Prism Temple Scraps 33": base_id + 1689, # ItemPickup217_53 MainShrine_ExteriorDetails (X=15963.284 Y=-24834.156 Z=11021.444) + "Prism Temple Scraps 34": base_id + 1690 # ItemPickup219_59 MainShrine_ExteriorDetails (X=21563.559 Y=-23705.184 Z=10895.696) +} + + +# All locations +location_table: dict[str, int] = { + **loc_start_camp, + **loc_tony_tiddle_mission, + **loc_barn, + **loc_candice_mission, + **loc_tutorial_house, + **loc_swamp_edges, + **loc_swamp_mission, + **loc_junkyard_area, + **loc_south_house, + **loc_junkyard_shed, + **loc_military_base, + **loc_south_mine_outside, + **loc_south_mine_inside, + **loc_middle_station, + **loc_canyon, + **loc_watchtower, + **loc_boulder_field, + **loc_haunted_house, + **loc_santiago_house, + **loc_port, + **loc_trench_house, + **loc_doll_woods, + **loc_lost_stairs, + **loc_east_house, + **loc_rockets_testing_ground, + **loc_rockets_testing_bunker, + **loc_workshop, + **loc_east_tower, + **loc_lighthouse, + **loc_north_mine_outside, + **loc_north_mine_inside, + **loc_wood_bridge, + **loc_museum, + **loc_barbed_shelter, + **loc_west_beach, + **loc_church, + **loc_west_cottage, + **loc_caravan, + **loc_trailer_cabin, + **loc_towers, + **loc_north_beach, + **loc_mine_shaft, + **loc_mob_camp, + **loc_mob_camp_locked_room, + **loc_mine_elevator_exit, + **loc_mountain_ruin_outside, + **loc_mountain_ruin_inside, + **loc_prism_temple, + **loc_pickle_val, + **loc_shrine_near_temple, + **loc_morse_bunker +} diff --git a/worlds/cccharles/Options.py b/worlds/cccharles/Options.py new file mode 100644 index 00000000..2ce1fc7a --- /dev/null +++ b/worlds/cccharles/Options.py @@ -0,0 +1,7 @@ +from dataclasses import dataclass +from Options import PerGameCommonOptions, StartInventoryPool + + +@dataclass +class CCCharlesOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/cccharles/Regions.py b/worlds/cccharles/Regions.py new file mode 100644 index 00000000..42230145 --- /dev/null +++ b/worlds/cccharles/Regions.py @@ -0,0 +1,290 @@ +from BaseClasses import MultiWorld, Region, ItemClassification +from .Items import CCCharlesItem +from .Options import CCCharlesOptions +from .Locations import ( + CCCharlesLocation, loc_start_camp, loc_tony_tiddle_mission, loc_barn, loc_candice_mission, \ + loc_tutorial_house, loc_swamp_edges, loc_swamp_mission, loc_junkyard_area, loc_south_house, \ + loc_junkyard_shed, loc_military_base, loc_south_mine_outside, loc_south_mine_inside, \ + loc_middle_station, loc_canyon, loc_watchtower, loc_boulder_field, loc_haunted_house, \ + loc_santiago_house, loc_port, loc_trench_house, loc_doll_woods, loc_lost_stairs, loc_east_house, \ + loc_rockets_testing_ground, loc_rockets_testing_bunker, loc_workshop, loc_east_tower, \ + loc_lighthouse, loc_north_mine_outside, loc_north_mine_inside, loc_wood_bridge, loc_museum, \ + loc_barbed_shelter, loc_west_beach, loc_church, loc_west_cottage, loc_caravan, loc_trailer_cabin, \ + loc_towers, loc_north_beach, loc_mine_shaft, loc_mob_camp, loc_mob_camp_locked_room, \ + loc_mine_elevator_exit, loc_mountain_ruin_outside, loc_mountain_ruin_inside, loc_prism_temple, \ + loc_pickle_val, loc_shrine_near_temple, loc_morse_bunker +) + + +def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> None: + menu_region = Region("Menu", player, world, "Aranearum") + world.regions.append(menu_region) + + start_camp_region = Region("Start Camp", player, world) + start_camp_region.add_locations(loc_start_camp, CCCharlesLocation) + world.regions.append(start_camp_region) + + tony_tiddle_mission_region = Region("Tony Tiddle Mission", player, world) + tony_tiddle_mission_region.add_locations(loc_tony_tiddle_mission, CCCharlesLocation) + world.regions.append(tony_tiddle_mission_region) + + barn_region = Region("Barn", player, world) + barn_region.add_locations(loc_barn, CCCharlesLocation) + world.regions.append(barn_region) + + candice_mission_region = Region("Candice Mission", player, world) + candice_mission_region.add_locations(loc_candice_mission, CCCharlesLocation) + world.regions.append(candice_mission_region) + + tutorial_house_region = Region("Tutorial House", player, world) + tutorial_house_region.add_locations(loc_tutorial_house, CCCharlesLocation) + world.regions.append(tutorial_house_region) + + swamp_edges_region = Region("Swamp Edges", player, world) + swamp_edges_region.add_locations(loc_swamp_edges, CCCharlesLocation) + world.regions.append(swamp_edges_region) + + swamp_mission_region = Region("Swamp Mission", player, world) + swamp_mission_region.add_locations(loc_swamp_mission, CCCharlesLocation) + world.regions.append(swamp_mission_region) + + junkyard_area_region = Region("Junkyard Area", player, world) + junkyard_area_region.add_locations(loc_junkyard_area, CCCharlesLocation) + world.regions.append(junkyard_area_region) + + south_house_region = Region("South House", player, world) + south_house_region.add_locations(loc_south_house, CCCharlesLocation) + world.regions.append(south_house_region) + + junkyard_shed_region = Region("Junkyard Shed", player, world) + junkyard_shed_region.add_locations(loc_junkyard_shed, CCCharlesLocation) + world.regions.append(junkyard_shed_region) + + military_base_region = Region("Military Base", player, world) + military_base_region.add_locations(loc_military_base, CCCharlesLocation) + world.regions.append(military_base_region) + + south_mine_outside_region = Region("South Mine Outside", player, world) + south_mine_outside_region.add_locations(loc_south_mine_outside, CCCharlesLocation) + world.regions.append(south_mine_outside_region) + + south_mine_inside_region = Region("South Mine Inside", player, world) + south_mine_inside_region.add_locations(loc_south_mine_inside, CCCharlesLocation) + world.regions.append(south_mine_inside_region) + + middle_station_region = Region("Middle Station", player, world) + middle_station_region.add_locations(loc_middle_station, CCCharlesLocation) + world.regions.append(middle_station_region) + + canyon_region = Region("Canyon", player, world) + canyon_region.add_locations(loc_canyon, CCCharlesLocation) + world.regions.append(canyon_region) + + watchtower_region = Region("Watchtower", player, world) + watchtower_region.add_locations(loc_watchtower, CCCharlesLocation) + world.regions.append(watchtower_region) + + boulder_field_region = Region("Boulder Field", player, world) + boulder_field_region.add_locations(loc_boulder_field, CCCharlesLocation) + world.regions.append(boulder_field_region) + + haunted_house_region = Region("Haunted House", player, world) + haunted_house_region.add_locations(loc_haunted_house, CCCharlesLocation) + world.regions.append(haunted_house_region) + + santiago_house_region = Region("Santiago House", player, world) + santiago_house_region.add_locations(loc_santiago_house, CCCharlesLocation) + world.regions.append(santiago_house_region) + + port_region = Region("Port", player, world) + port_region.add_locations(loc_port, CCCharlesLocation) + world.regions.append(port_region) + + trench_house_region = Region("Trench House", player, world) + trench_house_region.add_locations(loc_trench_house, CCCharlesLocation) + world.regions.append(trench_house_region) + + doll_woods_region = Region("Doll Woods", player, world) + doll_woods_region.add_locations(loc_doll_woods, CCCharlesLocation) + world.regions.append(doll_woods_region) + + lost_stairs_region = Region("Lost Stairs", player, world) + lost_stairs_region.add_locations(loc_lost_stairs, CCCharlesLocation) + world.regions.append(lost_stairs_region) + + east_house_region = Region("East House", player, world) + east_house_region.add_locations(loc_east_house, CCCharlesLocation) + world.regions.append(east_house_region) + + rockets_testing_ground_region = Region("Rockets Testing Ground", player, world) + rockets_testing_ground_region.add_locations(loc_rockets_testing_ground, CCCharlesLocation) + world.regions.append(rockets_testing_ground_region) + + rockets_testing_bunker_region = Region("Rockets Testing Bunker", player, world) + rockets_testing_bunker_region.add_locations(loc_rockets_testing_bunker, CCCharlesLocation) + world.regions.append(rockets_testing_bunker_region) + + workshop_region = Region("Workshop", player, world) + workshop_region.add_locations(loc_workshop, CCCharlesLocation) + world.regions.append(workshop_region) + + east_tower_region = Region("East Tower", player, world) + east_tower_region.add_locations(loc_east_tower, CCCharlesLocation) + world.regions.append(east_tower_region) + + lighthouse_region = Region("Lighthouse", player, world) + lighthouse_region.add_locations(loc_lighthouse, CCCharlesLocation) + world.regions.append(lighthouse_region) + + north_mine_outside_region = Region("North Mine Outside", player, world) + north_mine_outside_region.add_locations(loc_north_mine_outside, CCCharlesLocation) + world.regions.append(north_mine_outside_region) + + north_mine_inside_region = Region("North Mine Inside", player, world) + north_mine_inside_region.add_locations(loc_north_mine_inside, CCCharlesLocation) + world.regions.append(north_mine_inside_region) + + wood_bridge_region = Region("Wood Bridge", player, world) + wood_bridge_region.add_locations(loc_wood_bridge, CCCharlesLocation) + world.regions.append(wood_bridge_region) + + museum_region = Region("Museum", player, world) + museum_region.add_locations(loc_museum, CCCharlesLocation) + world.regions.append(museum_region) + + barbed_shelter_region = Region("Barbed Shelter", player, world) + barbed_shelter_region.add_locations(loc_barbed_shelter, CCCharlesLocation) + world.regions.append(barbed_shelter_region) + + west_beach_region = Region("West Beach", player, world) + west_beach_region.add_locations(loc_west_beach, CCCharlesLocation) + world.regions.append(west_beach_region) + + church_region = Region("Church", player, world) + church_region.add_locations(loc_church, CCCharlesLocation) + world.regions.append(church_region) + + west_cottage_region = Region("West Cottage", player, world) + west_cottage_region.add_locations(loc_west_cottage, CCCharlesLocation) + world.regions.append(west_cottage_region) + + caravan_region = Region("Caravan", player, world) + caravan_region.add_locations(loc_caravan, CCCharlesLocation) + world.regions.append(caravan_region) + + trailer_cabin_region = Region("Trailer Cabin", player, world) + trailer_cabin_region.add_locations(loc_trailer_cabin, CCCharlesLocation) + world.regions.append(trailer_cabin_region) + + towers_region = Region("Towers", player, world) + towers_region.add_locations(loc_towers, CCCharlesLocation) + world.regions.append(towers_region) + + north_beach_region = Region("North beach", player, world) + north_beach_region.add_locations(loc_north_beach, CCCharlesLocation) + world.regions.append(north_beach_region) + + mine_shaft_region = Region("Mine Shaft", player, world) + mine_shaft_region.add_locations(loc_mine_shaft, CCCharlesLocation) + world.regions.append(mine_shaft_region) + + mob_camp_region = Region("Mob Camp", player, world) + mob_camp_region.add_locations(loc_mob_camp, CCCharlesLocation) + world.regions.append(mob_camp_region) + + mob_camp_locked_room_region = Region("Mob Camp Locked Room", player, world) + mob_camp_locked_room_region.add_locations(loc_mob_camp_locked_room, CCCharlesLocation) + world.regions.append(mob_camp_locked_room_region) + + mine_elevator_exit_region = Region("Mine Elevator Exit", player, world) + mine_elevator_exit_region.add_locations(loc_mine_elevator_exit, CCCharlesLocation) + world.regions.append(mine_elevator_exit_region) + + mountain_ruin_outside_region = Region("Mountain Ruin Outside", player, world) + mountain_ruin_outside_region.add_locations(loc_mountain_ruin_outside, CCCharlesLocation) + world.regions.append(mountain_ruin_outside_region) + + mountain_ruin_inside_region = Region("Mountain Ruin Inside", player, world) + mountain_ruin_inside_region.add_locations(loc_mountain_ruin_inside, CCCharlesLocation) + world.regions.append(mountain_ruin_inside_region) + + prism_temple_region = Region("Prism Temple", player, world) + prism_temple_region.add_locations(loc_prism_temple, CCCharlesLocation) + world.regions.append(prism_temple_region) + + pickle_val_region = Region("Pickle Val", player, world) + pickle_val_region.add_locations(loc_pickle_val, CCCharlesLocation) + world.regions.append(pickle_val_region) + + shrine_near_temple_region = Region("Shrine Near Temple", player, world) + shrine_near_temple_region.add_locations(loc_shrine_near_temple, CCCharlesLocation) + world.regions.append(shrine_near_temple_region) + + morse_bunker_region = Region("Morse Bunker", player, world) + morse_bunker_region.add_locations(loc_morse_bunker, CCCharlesLocation) + world.regions.append(morse_bunker_region) + + # Place "Victory" event at "Final Boss" location + loc_final_boss = CCCharlesLocation(player, "Final Boss", None, prism_temple_region) + loc_final_boss.place_locked_item(CCCharlesItem("Victory", ItemClassification.progression, None, player)) + prism_temple_region.locations.append(loc_final_boss) + + # Connect the Regions by named Entrances that must have access Rules + menu_region.connect(start_camp_region) + menu_region.connect(tony_tiddle_mission_region) + menu_region.connect(barn_region) + tony_tiddle_mission_region.connect(barn_region, "Barn Door") + menu_region.connect(candice_mission_region) + menu_region.connect(tutorial_house_region) + candice_mission_region.connect(tutorial_house_region, "Tutorial House Door") + menu_region.connect(swamp_edges_region) + menu_region.connect(swamp_mission_region) + menu_region.connect(junkyard_area_region) + menu_region.connect(south_house_region) + menu_region.connect(junkyard_shed_region) + menu_region.connect(military_base_region) + menu_region.connect(south_mine_outside_region) + menu_region.connect(south_mine_inside_region) + south_mine_outside_region.connect(south_mine_inside_region, "South Mine Gate") + menu_region.connect(middle_station_region) + menu_region.connect(canyon_region) + menu_region.connect(watchtower_region) + menu_region.connect(boulder_field_region) + menu_region.connect(haunted_house_region) + menu_region.connect(santiago_house_region) + menu_region.connect(port_region) + menu_region.connect(trench_house_region) + menu_region.connect(doll_woods_region) + menu_region.connect(lost_stairs_region) + menu_region.connect(east_house_region) + menu_region.connect(rockets_testing_ground_region) + menu_region.connect(rockets_testing_bunker_region) + rockets_testing_ground_region.connect(rockets_testing_bunker_region, "Stuck Bunker Door") + menu_region.connect(workshop_region) + menu_region.connect(east_tower_region) + menu_region.connect(lighthouse_region) + menu_region.connect(north_mine_outside_region) + menu_region.connect(north_mine_inside_region) + north_mine_outside_region.connect(north_mine_inside_region, "North Mine Gate") + menu_region.connect(wood_bridge_region) + menu_region.connect(museum_region) + menu_region.connect(barbed_shelter_region) + menu_region.connect(west_beach_region) + menu_region.connect(church_region) + menu_region.connect(west_cottage_region) + menu_region.connect(caravan_region) + menu_region.connect(trailer_cabin_region) + menu_region.connect(towers_region) + menu_region.connect(north_beach_region) + menu_region.connect(mine_shaft_region) + menu_region.connect(mob_camp_region) + menu_region.connect(mob_camp_locked_room_region) + mob_camp_region.connect(mob_camp_locked_room_region, "Mob Camp Locked Door") + menu_region.connect(mine_elevator_exit_region) + menu_region.connect(mountain_ruin_outside_region) + menu_region.connect(mountain_ruin_inside_region) + mountain_ruin_outside_region.connect(mountain_ruin_inside_region, "Mountain Ruin Gate") + menu_region.connect(prism_temple_region) + menu_region.connect(pickle_val_region) + menu_region.connect(shrine_near_temple_region) + menu_region.connect(morse_bunker_region) diff --git a/worlds/cccharles/Rules.py b/worlds/cccharles/Rules.py new file mode 100644 index 00000000..979aacd5 --- /dev/null +++ b/worlds/cccharles/Rules.py @@ -0,0 +1,215 @@ +from BaseClasses import MultiWorld +from ..generic.Rules import set_rule +from .Options import CCCharlesOptions + +# Go mode: Green Egg + Blue Egg + Red Egg + Temple Key + Bug Spray (+ Remote Explosive x8 but the base game ignores it) + +def set_rules(world: MultiWorld, options: CCCharlesOptions, player: int) -> None: + # Tony Tiddle + set_rule(world.get_entrance("Barn Door", player), + lambda state: state.has("Barn Key", player)) + + # Candice + set_rule(world.get_entrance("Tutorial House Door", player), + lambda state: state.has("Candice's Key", player)) + + # Lizbeth Murkwater + set_rule(world.get_location("Swamp Lizbeth Murkwater Mission End", player), + lambda state: state.has("Dead Fish", player)) + + # Daryl + set_rule(world.get_location("Junkyard Area Chest Ancient Tablet", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Junkyard Area Daryl Mission End", player), + lambda state: state.has("Ancient Tablet", player)) + + # South House + set_rule(world.get_location("South House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # South Mine + set_rule(world.get_entrance("South Mine Gate", player), + lambda state: state.has("South Mine Key", player)) + + set_rule(world.get_location("South Mine Inside Green Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Theodore + set_rule(world.get_location("Middle Station Theodore Mission End", player), + lambda state: state.has("Blue Box", player)) + + # Watchtower + set_rule(world.get_location("Watchtower Pink Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Sasha + set_rule(world.get_location("Haunted House Sasha Mission End", player), + lambda state: state.has("Page Drawing", player, 8)) + + # Santiago + set_rule(world.get_location("Port Santiago Mission End", player), + lambda state: state.has("Journal", player)) + + # Trench House + set_rule(world.get_location("Trench House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # East House + set_rule(world.get_location("East House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Rocket Testing Bunker + set_rule(world.get_entrance("Stuck Bunker Door", player), + lambda state: state.has("Timed Dynamite", player)) + + # John Smith + set_rule(world.get_location("Workshop John Smith Mission End", player), + lambda state: state.has("Box of Rockets", player)) + + # Claire + set_rule(world.get_location("Lighthouse Claire Mission End", player), + lambda state: state.has("Breaker", player, 4)) + + # North Mine + set_rule(world.get_entrance("North Mine Gate", player), + lambda state: state.has("North Mine Key", player)) + + set_rule(world.get_location("North Mine Inside Blue Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Paul + set_rule(world.get_location("Museum Paul Mission End", player), + lambda state: state.has("Remote Explosive x8", player)) + # lambda state: state.has("Remote Explosive", player, 8)) # TODO: Add an option to split remote explosives + + # West Beach + set_rule(world.get_location("West Beach Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # Caravan + set_rule(world.get_location("Caravan Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Ronny + set_rule(world.get_location("Towers Ronny Mission End", player), + lambda state: state.has("Employment Contracts", player)) + + # North Beach + set_rule(world.get_location("North Beach Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + + # Mine Shaft + set_rule(world.get_location("Mine Shaft Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 7", player), + lambda state: state.has("Lockpicks", player)) + + # Mob Camp + set_rule(world.get_entrance("Mob Camp Locked Door", player), + lambda state: state.has("Mob Camp Key", player)) + + set_rule(world.get_location("Mob Camp Locked Room Stolen Bob", player), + lambda state: state.has("Broken Bob", player)) + + # Mountain Ruin + set_rule(world.get_entrance("Mountain Ruin Gate", player), + lambda state: state.has("Mountain Ruin Key", player)) + + set_rule(world.get_location("Mountain Ruin Inside Red Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Prism Temple + set_rule(world.get_location("Prism Temple Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Prism Temple Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Prism Temple Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + + # Pickle Lady + set_rule(world.get_location("Pickle Val Jar of Pickles", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Pickle Val Pickle Lady Mission End", player), + lambda state: state.has("Jar of Pickles", player)) + + # Morse Bunker + set_rule(world.get_location("Morse Bunker Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Add rules to reach the "Go mode" + set_rule(world.get_location("Final Boss", player), + lambda state: state.has("Temple Key", player) + and state.has("Green Egg", player) + and state.has("Blue Egg", player) + and state.has("Red Egg", player)) + world.completion_condition[player] = lambda state: state.has("Victory", player) diff --git a/worlds/cccharles/__init__.py b/worlds/cccharles/__init__.py new file mode 100644 index 00000000..6d40c017 --- /dev/null +++ b/worlds/cccharles/__init__.py @@ -0,0 +1,171 @@ +from .Items import CCCharlesItem, unique_item_dict, full_item_list, item_groups +from .Locations import location_table +from .Options import CCCharlesOptions +from .Rules import set_rules +from .Regions import create_regions +from BaseClasses import Tutorial, ItemClassification +from worlds.AutoWorld import World, WebWorld + + +class CCCharlesWeb(WebWorld): + """ + Choo-Choo Charles is a horror game. + A devil spider train from hell called Charles chases any person it finds on an island. + The goal is to gather scraps to upgrade a train to fight Charles and travel by train to find 3 eggs + to lead Charles to a brutal death and save the island. + """ + + theme = "stone" + + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to setup Choo-Choo Charles for the Archipelago MultiWorld Randomizer.", + "English", + "setup_en.md", + "setup/en", + ["Yaranorgoth"] + ) + + setup_fr = Tutorial( + "Guide d'Installation Multiworld", + "Un guide pour mettre en place Choo-Choo Charles pour le Randomiseur Multiworld Archipelago", + "Français", + "setup_fr.md", + "setup/fr", + ["Yaranorgoth"] + ) + + tutorials = [setup_en, setup_fr] + + game_info_languages = ["en", "fr"] + rich_text_options_doc = True + + +class CCCharlesWorld(World): + """ + An independent 3D horror game, taking place on an island. + The main gameplay consists of traveling and fighting a monster on board a train. + Upgrading the train requires leaving the train to gather resources with the threat of encountering the monster. + """ + + game = "Choo-Choo Charles" + + web = CCCharlesWeb() + + item_name_to_id = unique_item_dict + location_name_to_id = location_table + item_name_groups = item_groups + + # Options the player can set + options_dataclass = CCCharlesOptions + # Typing hints for all the options we defined + options: CCCharlesOptions + + topology_present = False # Hide path to required location checks in spoiler + + def create_regions(self) -> None: + create_regions(self.multiworld, self.options, self.player) + + def create_item(self, name: str) -> CCCharlesItem: + item_id = unique_item_dict[name] + + match name: + case "Scraps": + classification = ItemClassification.useful + case "30 Scraps Reward": + classification = ItemClassification.useful + case "25 Scraps Reward": + classification = ItemClassification.useful + case "35 Scraps Reward": + classification = ItemClassification.useful + case "40 Scraps Reward": + classification = ItemClassification.useful + case "South Mine Key": + classification = ItemClassification.progression + case "North Mine Key": + classification = ItemClassification.progression + case "Mountain Ruin Key": + classification = ItemClassification.progression + case "Barn Key": + classification = ItemClassification.progression + case "Candice's Key": + classification = ItemClassification.progression + case "Dead Fish": + classification = ItemClassification.progression + case "Lockpicks": + classification = ItemClassification.progression + case "Ancient Tablet": + classification = ItemClassification.progression + case "Blue Box": + classification = ItemClassification.progression + case "Page Drawing": + classification = ItemClassification.progression + case "Journal": + classification = ItemClassification.progression + case "Timed Dynamite": + classification = ItemClassification.progression + case "Box of Rockets": + classification = ItemClassification.progression + case "Breaker": + classification = ItemClassification.progression + case "Broken Bob": + classification = ItemClassification.progression + case "Employment Contracts": + classification = ItemClassification.progression + case "Mob Camp Key": + classification = ItemClassification.progression + case "Jar of Pickles": + classification = ItemClassification.progression + case "Orange Paint Can": + classification = ItemClassification.filler + case "Green Paint Can": + classification = ItemClassification.filler + case "White Paint Can": + classification = ItemClassification.filler + case "Pink Paint Can": + classification = ItemClassification.filler + case "Grey Paint Can": + classification = ItemClassification.filler + case "Blue Paint Can": + classification = ItemClassification.filler + case "Black Paint Can": + classification = ItemClassification.filler + case "Lime Paint Can": + classification = ItemClassification.filler + case "Teal Paint Can": + classification = ItemClassification.filler + case "Red Paint Can": + classification = ItemClassification.filler + case "Purple Paint Can": + classification = ItemClassification.filler + case "The Boomer": + classification = ItemClassification.filler + case "Bob": + classification = ItemClassification.filler + case "Green Egg": + classification = ItemClassification.progression + case "Blue Egg": + classification = ItemClassification.progression + case "Red Egg": + classification = ItemClassification.progression + case "Remote Explosive": + classification = ItemClassification.progression + case "Remote Explosive x8": + classification = ItemClassification.progression + case "Temple Key": + classification = ItemClassification.progression + case "Bug Spray": + classification = ItemClassification.progression + case _: # Should not occur + raise Exception("Unexpected case met: classification cannot be set for unknown item \"" + name + "\"") + + return CCCharlesItem(name, classification, item_id, self.player) + + def create_items(self) -> None: + self.multiworld.itempool += [self.create_item(item) for item in full_item_list] + + def set_rules(self) -> None: + set_rules(self.multiworld, self.options, self.player) + + def get_filler_item_name(self) -> str: + return "Scraps" diff --git a/worlds/cccharles/docs/en_Choo-Choo Charles.md b/worlds/cccharles/docs/en_Choo-Choo Charles.md new file mode 100644 index 00000000..6d8ed39e --- /dev/null +++ b/worlds/cccharles/docs/en_Choo-Choo Charles.md @@ -0,0 +1,39 @@ +# Choo-Choo Charles + +## Game page in other languages +* [Français](fr) + +## Where is the options page? +The [Player Options page](../player-options) contains all the options to configure and export a yaml config file. + +## What does randomization do to this game? +All scraps or any collectable item on the ground (except from Loot Crates) and items received from NPCs missions are considered as locations to check. + +## What is the goal of Choo-Choo Charles when randomized? +Beating the evil train from Hell named "Charles". + +## How is the game managed in Nightmare mode? +At death, the player has to restart a brand-new game, giving him the choice to stay under the Nightmare mode or continuing with the Normal mode if considered too hard. +In this case, all collected items will be redistributed in the inventory and the missions states will be kept. +The Deathlink is not implemented yet. When this option will be available, a choice will be provided to: +* Disable the Deathlink +* Enable the soft Deathlink with respawn at Player Train when a Deathlink event is received +* Enable the hard Deathlink with removal of the game save when a Deathlink event is received + +## What does another world's item look like in Choo-Choo Charles? +Items appearance are kept unchanged. +Any hint that cannot be normally represented in the game is replaced by the miniaturized "DeathDuck" Easter Egg that can be seen out from the physical wall limits of the original game. + +## How is the player informed by an item transmission and hints? +A message appears in game to inform what item is sent or received, including which world and what player the item comes from. +The same method is used for hints. + +## Is it possible to use hints in the game? +No, this is a work in progress. +The following options will be possible once the implementations are available: + +At any moment, the player can press one of the following keys to display a console in the game: +* "~" or "`" (qwerty) +* "²" (azerty) +* "F10" +Then, a hint can be revealed by typing "/hint [player] ". diff --git a/worlds/cccharles/docs/fr_Choo-Choo Charles.md b/worlds/cccharles/docs/fr_Choo-Choo Charles.md new file mode 100644 index 00000000..42f0c483 --- /dev/null +++ b/worlds/cccharles/docs/fr_Choo-Choo Charles.md @@ -0,0 +1,36 @@ +# Choo-Choo Charles + +## Où est la page d'options ? +La [page d'options du joueur pour ce jeu](../player-options) contient toutes les options pour configurer et exporter un fichier de configuration yaml. + +## Qu'est ce que la randomisation fait au jeu ? +Tous les débrits ou n'importe quel objet ramassable au sol (excepté les Caisses à Butin) et objets reçus par les missions de PNJs sont considérés comme emplacements à vérifier. + +## Quel est le but de Choo-Choo Charles lorsqu'il est randomisé ? +Vaincre le train démoniaque de l'Enfer nommé "Charles". + +## Comment le jeu est-il géré en mode Nightmare ? +À sa mort, le joueur doit relancer une toute nouvelle partie, lui donnant la possisilité de rester en mode Nightmare ou de poursuivre la partie en mode Normal s'il considère la partie trop difficile. +Dans ce cas, tous les objets collectés seront redistribués dans l'inventaire et les états des missions seront conservés. +Le Deathlink n'est pas implémenté pour l'instant. Lorsque cette option sera disponible, un choix sera fourni pour : +* Désactiver le Deathlink +* Activer le Deathlink modéré avec réapparition au Train du Joueur lorsqu'un évènement Deathlink est reçu +* Activer le Deathlink strict avec suppression de la sauvegarde lorsqu'un évènement Deathlink est reçu + +## À quoi ressemble un objet d'un autre monde dans Choo-Choo Charles ? +Les apparances des objets sont conservés. +Tout indice qui ne peut pas être représenté normalement dans le jeu est remplacé par l'Easter Egg "DeadDuck" miniaturisé qui peut être vu en dehors des limites murales physiques du jeu original. + +## Comment le joueur est-il informé par une transmission d'objet et des indices ? +Un message apparaît en jeu pour informer quel objet est envoyé ou reçu, incluant de quel monde et de quel joueur vient l'objet. +La même méthode est utilisée pour les indices. + +## Est-il possible d'utiliser les indices dans le jeu ? +Non, ceci est un travail en cours. +Les options suivantes seront possibles une fois les implémentations disponibles : + +À n'importe quel moment, le joueur peu appuyer sur l'une des touches suivantes pour afficher la console dans le jeu : +* "~" (qwerty) +* "²" (azerty) +* "F10" +Puis, un indice peut être révélé en tapant "/hint [player] " diff --git a/worlds/cccharles/docs/setup_en.md b/worlds/cccharles/docs/setup_en.md new file mode 100644 index 00000000..8df0188c --- /dev/null +++ b/worlds/cccharles/docs/setup_en.md @@ -0,0 +1,52 @@ +# Choo-Choo Charles MultiWorld Setup Guide +This page is a simplified guide of the [Choo-Choo Charles Multiworld Randomizer Mod page](https://github.com/lgbarrere/CCCharles-Random?tab=readme-ov-file#cccharles-random). + +## Requirements and Required Softwares +* A computer running Windows (the Mod is not handled by Linux or Mac) +* [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +* A legal copy of the Choo-Choo Charles original game (can be found on [Steam](https://store.steampowered.com/app/1766740/ChooChoo_Charles/)) + +## Mod Installation for playing +### Mod Download +All the required files of the Mod can be found in the [Releases](https://github.com/lgbarrere/CCCharles-Random/releases). +To use the Mod, download and unzip **CCCharles_Random.zip** somewhere safe, then follow the instructions in the next sections of this guide. This archive contains: +* The **Obscure/** folder loading the Mod itself, it runs the code handling all the randomized elements +* The **cccharles.apworld** file containing the randomization logic, used by the host to generate a random seed with the others games + +### Game Setup +The Mod can be installed and played by following these steps (see the [Mod Download](setup_en#mod-download) section to get **CCCharles_Random.zip**): +1. Copy the **Obscure/** folder from **CCCharles_Random.zip** to **\** (where the **Obscure/** folder and **Obscure.exe** are placed) +2. Launch the game, if "OFFLINE" is visible in the upper-right corner of the screen, the Mod is working + +### Create a Config (.yaml) File +The purpose of a YAML file is described in the [Basic Multiworld Setup Guide](https://archipelago.gg/tutorial/Archipelago/setup/en#generating-a-game). + +The [Player Options page](/games/Choo-Choo%20Charles/player-options) allows to configure personal options and export a config YAML file. + +## Joining a MultiWorld Game +Before playing, it is highly recommended to check out the **[Known Issues](setup_en#known-issues)** section +* The game console must be opened to type Archipelago commands, press "F10" key or "`" (or "~") key in querty ("²" key in azerty) +* Type ``/connect `` with \ and \ found on the hosting Archipelago web page in the form ``archipelago.gg:XXXXX`` and ``CCCharles`` +* Disconnection is automatic at game closure but can be manually done with ``/disconnect`` + +## Hosting a MultiWorld or Single-Player Game +See the [Mod Download](setup_en#mod-download) section to get the **cccharles.apworld** file. + +In this section, **Archipelago/** refers to the path where [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) is installed locally. + +Follow these steps to host a remote multiplayer or a local single-player session: +1. Double-click the **cccharles.apworld** to automatically install the world randomization logic +2. Put the **CCCharles.yaml** to **Archipelago/Players/** with the YAML of each player to host +3. Launch the Archipelago launcher and click "Generate" to configure a game with the YAMLs in **Archipelago/output/** +4. For a multiplayer session, go to the [Archipelago HOST GAME page](https://archipelago.gg/uploads) +5. Click "Upload File" and select the generated **AP_\.zip** in **Archipelago/output/** +6. Send the generated room page to each player + +For a local single-player session, click "Host" in the Archipelago launcher by using the generated **AP_\.zip** in **Archipelago/output/** + +## Known Issues +### Major issues +No major issue found. + +### Minor issues +* The current version of the command parser does not accept console commands with a player names containing whitespaces. It is recommended to use underscores "_" instead, for instance: CCCharles_Player_1. diff --git a/worlds/cccharles/docs/setup_fr.md b/worlds/cccharles/docs/setup_fr.md new file mode 100644 index 00000000..386ec025 --- /dev/null +++ b/worlds/cccharles/docs/setup_fr.md @@ -0,0 +1,52 @@ +# Guide d'Installation du MultiWorld Choo-Choo Charles +Cette page est un guide simplifié de la [page du Mod Randomiseur Multiworld de Choo-Choo Charles](https://github.com/lgbarrere/CCCharles-Random?tab=readme-ov-file#cccharles-random). + +## Exigences et Logiciels Nécessaires +* Un ordinateur utilisant Windows (le Mod n'est pas utilisable sous Linux ou Mac) +* [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +* Une copie légale du jeu original Choo-Choo Charles (peut être trouvé sur [Steam](https://store.steampowered.com/app/1766740/ChooChoo_Charles/) + +## Installation du Mod pour jouer +### Téléchargement du Mod +Tous les fichiers nécessaires du Mod se trouvent dans les [Releases](https://github.com/lgbarrere/CCCharles-Random/releases). +Pour utiliser le Mod, télécharger et désarchiver **CCCharles_Random.zip** à un endroit sûr, puis suivre les instructions dans les sections suivantes de ce guide. Cette archive contient : +* Le dossier **Obscure/** qui charge le Mod lui-même, il lance le code qui gère tous les éléments randomisés +* Le fichier **cccharles.apworld** qui contient la logique de randomisation, utilisé par l'hôte pour générer une graine aléatoire avec les autres jeux + +### Préparation du Jeu +Le Mod peut être installé et joué en suivant les étapes suivantes (voir la section [Téléchargement du Mod](setup_fr#téléchargement-du-mod) pour récupérer **CCCharles_Random.zip**) : +1. Copier le dossier **Obscure/** de **CCCharles_Random.zip** vers **\** (où se situent le dossier **Obscure/** et **Obscure.exe**) +2. Lancer le jeu, si "OFFLINE" est visible dans le coin en haut à droite de l'écran, le Mod est actif + +### Créer un Fichier de Configuration (.yaml) +L'objectif d'un fichier YAML est décrit dans le [Guide d'Installation Basique du Multiworld](https://archipelago.gg/tutorial/Archipelago/setup/en#generating-a-game) (en anglais). + +La [page d'Options Joueur](/games/Choo-Choo%20Charles/player-options) permet de configurer des options personnelles et exporter un fichier de configuration YAML. + +## Rejoindre une Partie MultiWorld +Avant de jouer, il est fortement recommandé de consulter la section **[Problèmes Connus](setup_fr#probl%C3%A8mes-connus)**. +* La console du jeu doit être ouverte pour taper des commandes Archipelago, appuyer sur la touche "F10" ou "`" (ou "~") en querty (touche "²" en azerty) +* Taper ``/connect `` avec \ et \ trouvés sur la page web d'hébergement Archipelago sous la forme ``archipelago.gg:XXXXX`` et ``CCCharles`` +* La déconnexion est automatique à la fermeture du jeu mais peut être faite manuellement avec ``/disconnect`` + +## Héberger une partie MultiWorld ou un Seul Joueur +Voir la section [Téléchargement du Mod](setup_fr#téléchargement-du-mod) pour récupérer le fichier **cccharles.apworld**. + +Dans cette section, **Archipelago/** fait référence au chemin d'accès où [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) est installé localement. + +Suivre ces étapes pour héberger une session multijoueur à distance ou locale pour un seul joueur : +1. Double-cliquer sur **cccharles.apworld** pour installer automatiquement la logique de randomisation du monde +2. Placer le **CCCharles.yaml** dans **Archipelago/Players/** avec le YAML de chaque joueur à héberger +3. Exécuter le lanceur Archipelago et cliquer sur "Generate" pour configurer une partie avec les YAML dans **Archipelago/output/** +4. Pour une session multijoueur, aller à la [page Archipelago HOST GAME](https://archipelago.gg/uploads) +5. Cliquer sur "Upload File" et selectionner le **AP_\.zip** généré dans **Archipelago/output/** +6. Envoyer la page de la partie générée à chaque joueur + +Pour une session locale à un seul joueur, cliquer sur "Host" dans le lanceur Archipelago en utilisant **AP_\.zip** généré dans **Archipelago/output/** + +## Problèmes Connus +### Problèmes majeurs +Aucun problème majeur trouvé. + +### Problèmes mineurs +* La version actuelle de l'analyseur de commandes n'accepte pas des commandes de la console dont le nom du joueur contient des espaces. Il est recommandé d'utiliser des soulignés "_" à la place, par exemple : CCCharles_Player_1. diff --git a/worlds/cccharles/test/TestAccess.py b/worlds/cccharles/test/TestAccess.py new file mode 100644 index 00000000..d088457c --- /dev/null +++ b/worlds/cccharles/test/TestAccess.py @@ -0,0 +1,27 @@ +from BaseClasses import CollectionState +from .bases import CCCharlesTestBase + + +class TestAccess(CCCharlesTestBase): + def test_claire_breakers(self) -> None: + """Test locations that require 4 Breakers""" + lighthouse_claire_mission_end = self.world.get_location("Lighthouse Claire Mission End") + + state = CollectionState(self.multiworld) + self.collect_all_but("Breaker") + + breakers_in_pool = self.get_items_by_name("Breaker") + self.assertGreaterEqual(len(breakers_in_pool), 4) # Check at least 4 Breakers are in the item pool + + for breaker in breakers_in_pool[:3]: + state.collect(breaker) # Collect 3 Breakers into state + self.assertFalse( + lighthouse_claire_mission_end.can_reach(state), + "Lighthouse Claire Mission End should not be reachable with only three Breakers" + ) + + state.collect(breakers_in_pool[3]) # Collect 4th breaker into state + self.assertTrue( + lighthouse_claire_mission_end.can_reach(state), + "Lighthouse Claire Mission End should have been reachable with four Breakers" + ) diff --git a/worlds/cccharles/test/__init__.py b/worlds/cccharles/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/worlds/cccharles/test/bases.py b/worlds/cccharles/test/bases.py new file mode 100644 index 00000000..4c08d163 --- /dev/null +++ b/worlds/cccharles/test/bases.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class CCCharlesTestBase(WorldTestBase): + game = "Choo-Choo Charles" From 63f35128298e57245ccee053f6ac5c2f14b59293 Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 8 Sep 2025 04:11:46 -0500 Subject: [PATCH 064/204] Core: adds a custom KeyError for invalid item names (#4223) * adds a custom KeyError for raising on world.create_item() if the passed in name is invalid * Update __init__.py --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/AutoWorld.py | 4 ++++ worlds/generic/__init__.py | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 9233f3d2..676171b7 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -22,6 +22,10 @@ if TYPE_CHECKING: perf_logger = logging.getLogger("performance") +class InvalidItemError(KeyError): + pass + + class AutoWorldRegister(type): world_types: Dict[str, Type[World]] = {} __file__: str diff --git a/worlds/generic/__init__.py b/worlds/generic/__init__.py index 29f808b2..fa53f31f 100644 --- a/worlds/generic/__init__.py +++ b/worlds/generic/__init__.py @@ -3,7 +3,7 @@ import logging from BaseClasses import Item, Tutorial, ItemClassification -from ..AutoWorld import World, WebWorld +from ..AutoWorld import InvalidItemError, World, WebWorld from NetUtils import SlotType @@ -47,7 +47,7 @@ class GenericWorld(World): def create_item(self, name: str) -> Item: if name == "Nothing": return Item(name, ItemClassification.filler, -1, self.player) - raise KeyError(name) + raise InvalidItemError(name) class PlandoItem(NamedTuple): From 17dad8313e1e3c085fc08b9a1760ee3fb89f0d5c Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 8 Sep 2025 14:36:26 -0500 Subject: [PATCH 065/204] Test: Remove most dependencies on lttp (#5338) * removes the last dependencies on lttp in tests * removing test.bases.TestBase from docs as well * rename bases * move imports to bases --- docs/tests.md | 11 +- test/bases.py | 93 +------------- worlds/alttp/test/__init__.py | 22 ---- worlds/alttp/test/bases.py | 113 ++++++++++++++++++ worlds/alttp/test/dungeons/TestDungeon.py | 2 +- worlds/alttp/test/inverted/TestInverted.py | 17 ++- .../test/inverted/TestInvertedBombRules.py | 2 +- .../TestInvertedMinor.py | 19 ++- .../test/inverted_owg/TestInvertedOWG.py | 19 ++- worlds/alttp/test/items/TestDifficulty.py | 4 +- worlds/alttp/test/minor_glitches/TestMinor.py | 13 +- worlds/alttp/test/owg/TestVanillaOWG.py | 13 +- worlds/alttp/test/shops/TestSram.py | 4 +- worlds/alttp/test/vanilla/TestVanilla.py | 14 +-- worlds/pokemon_emerald/test/test_warps.py | 4 +- 15 files changed, 172 insertions(+), 178 deletions(-) create mode 100644 worlds/alttp/test/bases.py diff --git a/docs/tests.md b/docs/tests.md index 78cedbc5..0740072d 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -82,10 +82,10 @@ overridden. For more information on what methods are available to your class, ch #### Alternatives to WorldTestBase -Unit tests can also be created using [TestBase](/test/bases.py#L16) or -[unittest.TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) depending on your use case. These -may be useful for generating a multiworld under very specific constraints without using the generic world setup, or for -testing portions of your code that can be tested without relying on a multiworld to be created first. +Unit tests can also be created using +[unittest.TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) directly. These may be useful +for generating a multiworld under very specific constraints without using the generic world setup, or for testing +portions of your code that can be tested without relying on a multiworld to be created first. #### Parametrization @@ -102,8 +102,7 @@ for multiple inputs) the base test. Some important things to consider when attem * Classes inheriting from `WorldTestBase`, including those created by the helpers in `test.param`, will run all base tests by default, make sure the produced tests actually do what you aim for and do not waste a lot of - extra CPU time. Consider using `TestBase` or `unittest.TestCase` directly - or setting `WorldTestBase.run_default_tests` to False. + extra CPU time. Consider using `unittest.TestCase` directly or setting `WorldTestBase.run_default_tests` to False. #### Performance Considerations diff --git a/test/bases.py b/test/bases.py index c9610c86..dd93ca64 100644 --- a/test/bases.py +++ b/test/bases.py @@ -9,98 +9,7 @@ from test.general import gen_steps from worlds import AutoWorld from worlds.AutoWorld import World, call_all -from BaseClasses import Location, MultiWorld, CollectionState, ItemClassification, Item -from worlds.alttp.Items import item_factory - - -class TestBase(unittest.TestCase): - multiworld: MultiWorld - _state_cache = {} - - def get_state(self, items): - if (self.multiworld, tuple(items)) in self._state_cache: - return self._state_cache[self.multiworld, tuple(items)] - state = CollectionState(self.multiworld) - for item in items: - item.classification = ItemClassification.progression - state.collect(item, prevent_sweep=True) - state.sweep_for_advancements() - state.update_reachable_regions(1) - self._state_cache[self.multiworld, tuple(items)] = state - return state - - def get_path(self, state, region): - def flist_to_iter(node): - while node: - value, node = node - yield value - - from itertools import zip_longest - reversed_path_as_flist = state.path.get(region, (region, None)) - string_path_flat = reversed(list(map(str, flist_to_iter(reversed_path_as_flist)))) - # Now we combine the flat string list into (region, exit) pairs - pathsiter = iter(string_path_flat) - pathpairs = zip_longest(pathsiter, pathsiter) - return list(pathpairs) - - def run_location_tests(self, access_pool): - for i, (location, access, *item_pool) in enumerate(access_pool): - items = item_pool[0] - all_except = item_pool[1] if len(item_pool) > 1 else None - state = self._get_items(item_pool, all_except) - path = self.get_path(state, self.multiworld.get_location(location, 1).parent_region) - with self.subTest(msg="Reach Location", location=location, access=access, items=items, - all_except=all_except, path=path, entry=i): - - self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), access, - f"failed {self.multiworld.get_location(location, 1)} with: {item_pool}") - - # check for partial solution - if not all_except and access: # we are not supposed to be able to reach location with partial inventory - for missing_item in item_pool[0]: - with self.subTest(msg="Location reachable without required item", location=location, - items=item_pool[0], missing_item=missing_item, entry=i): - state = self._get_items_partial(item_pool, missing_item) - - self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), False, - f"failed {self.multiworld.get_location(location, 1)}: succeeded with " - f"{missing_item} removed from: {item_pool}") - - def run_entrance_tests(self, access_pool): - for i, (entrance, access, *item_pool) in enumerate(access_pool): - items = item_pool[0] - all_except = item_pool[1] if len(item_pool) > 1 else None - state = self._get_items(item_pool, all_except) - path = self.get_path(state, self.multiworld.get_entrance(entrance, 1).parent_region) - with self.subTest(msg="Reach Entrance", entrance=entrance, access=access, items=items, - all_except=all_except, path=path, entry=i): - - self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), access) - - # check for partial solution - if not all_except and access: # we are not supposed to be able to reach location with partial inventory - for missing_item in item_pool[0]: - with self.subTest(msg="Entrance reachable without required item", entrance=entrance, - items=item_pool[0], missing_item=missing_item, entry=i): - state = self._get_items_partial(item_pool, missing_item) - self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), False, - f"failed {self.multiworld.get_entrance(entrance, 1)} with: {item_pool}") - - def _get_items(self, item_pool, all_except): - if all_except and len(all_except) > 0: - items = self.multiworld.itempool[:] - items = [item for item in items if - item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] - items.extend(item_factory(item_pool[0], self.multiworld.worlds[1])) - else: - items = item_factory(item_pool[0], self.multiworld.worlds[1]) - return self.get_state(items) - - def _get_items_partial(self, item_pool, missing_item): - new_items = item_pool[0].copy() - new_items.remove(missing_item) - items = item_factory(new_items, self.multiworld.worlds[1]) - return self.get_state(items) +from BaseClasses import Location, MultiWorld, CollectionState, Item class WorldTestBase(unittest.TestCase): diff --git a/worlds/alttp/test/__init__.py b/worlds/alttp/test/__init__.py index 031d5086..e69de29b 100644 --- a/worlds/alttp/test/__init__.py +++ b/worlds/alttp/test/__init__.py @@ -1,22 +0,0 @@ -import unittest -from argparse import Namespace - -from BaseClasses import MultiWorld, CollectionState -from worlds import AutoWorldRegister - - -class LTTPTestBase(unittest.TestCase): - def world_setup(self): - from worlds.alttp.Options import Medallion - self.multiworld = MultiWorld(1) - self.multiworld.game[1] = "A Link to the Past" - self.multiworld.set_seed(None) - args = Namespace() - for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): - setattr(args, name, {1: option.from_any(getattr(option, "default"))}) - self.multiworld.set_options(args) - self.multiworld.state = CollectionState(self.multiworld) - self.world = self.multiworld.worlds[1] - # by default medallion access is randomized, for unittests we set it to vanilla - self.world.options.misery_mire_medallion.value = Medallion.option_ether - self.world.options.turtle_rock_medallion.value = Medallion.option_quake diff --git a/worlds/alttp/test/bases.py b/worlds/alttp/test/bases.py new file mode 100644 index 00000000..c3b4f47a --- /dev/null +++ b/worlds/alttp/test/bases.py @@ -0,0 +1,113 @@ +import unittest +from argparse import Namespace + +from BaseClasses import MultiWorld, CollectionState, ItemClassification +from worlds import AutoWorldRegister +from ..Items import item_factory + + +class TestBase(unittest.TestCase): + multiworld: MultiWorld + _state_cache = {} + + def get_state(self, items): + if (self.multiworld, tuple(items)) in self._state_cache: + return self._state_cache[self.multiworld, tuple(items)] + state = CollectionState(self.multiworld) + for item in items: + item.classification = ItemClassification.progression + state.collect(item, prevent_sweep=True) + state.sweep_for_advancements() + state.update_reachable_regions(1) + self._state_cache[self.multiworld, tuple(items)] = state + return state + + def get_path(self, state, region): + def flist_to_iter(node): + while node: + value, node = node + yield value + + from itertools import zip_longest + reversed_path_as_flist = state.path.get(region, (region, None)) + string_path_flat = reversed(list(map(str, flist_to_iter(reversed_path_as_flist)))) + # Now we combine the flat string list into (region, exit) pairs + pathsiter = iter(string_path_flat) + pathpairs = zip_longest(pathsiter, pathsiter) + return list(pathpairs) + + def run_location_tests(self, access_pool): + for i, (location, access, *item_pool) in enumerate(access_pool): + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + state = self._get_items(item_pool, all_except) + path = self.get_path(state, self.multiworld.get_location(location, 1).parent_region) + with self.subTest(msg="Reach Location", location=location, access=access, items=items, + all_except=all_except, path=path, entry=i): + + self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), access, + f"failed {self.multiworld.get_location(location, 1)} with: {item_pool}") + + # check for partial solution + if not all_except and access: # we are not supposed to be able to reach location with partial inventory + for missing_item in item_pool[0]: + with self.subTest(msg="Location reachable without required item", location=location, + items=item_pool[0], missing_item=missing_item, entry=i): + state = self._get_items_partial(item_pool, missing_item) + + self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), False, + f"failed {self.multiworld.get_location(location, 1)}: succeeded with " + f"{missing_item} removed from: {item_pool}") + + def run_entrance_tests(self, access_pool): + for i, (entrance, access, *item_pool) in enumerate(access_pool): + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + state = self._get_items(item_pool, all_except) + path = self.get_path(state, self.multiworld.get_entrance(entrance, 1).parent_region) + with self.subTest(msg="Reach Entrance", entrance=entrance, access=access, items=items, + all_except=all_except, path=path, entry=i): + + self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), access) + + # check for partial solution + if not all_except and access: # we are not supposed to be able to reach location with partial inventory + for missing_item in item_pool[0]: + with self.subTest(msg="Entrance reachable without required item", entrance=entrance, + items=item_pool[0], missing_item=missing_item, entry=i): + state = self._get_items_partial(item_pool, missing_item) + self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), False, + f"failed {self.multiworld.get_entrance(entrance, 1)} with: {item_pool}") + + def _get_items(self, item_pool, all_except): + if all_except and len(all_except) > 0: + items = self.multiworld.itempool[:] + items = [item for item in items if + item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] + items.extend(item_factory(item_pool[0], self.multiworld.worlds[1])) + else: + items = item_factory(item_pool[0], self.multiworld.worlds[1]) + return self.get_state(items) + + def _get_items_partial(self, item_pool, missing_item): + new_items = item_pool[0].copy() + new_items.remove(missing_item) + items = item_factory(new_items, self.multiworld.worlds[1]) + return self.get_state(items) + + +class LTTPTestBase(unittest.TestCase): + def world_setup(self): + from worlds.alttp.Options import Medallion + self.multiworld = MultiWorld(1) + self.multiworld.game[1] = "A Link to the Past" + self.multiworld.set_seed(None) + args = Namespace() + for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): + setattr(args, name, {1: option.from_any(getattr(option, "default"))}) + self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) + self.world = self.multiworld.worlds[1] + # by default medallion access is randomized, for unittests we set it to vanilla + self.world.options.misery_mire_medallion.value = Medallion.option_ether + self.world.options.turtle_rock_medallion.value = Medallion.option_quake diff --git a/worlds/alttp/test/dungeons/TestDungeon.py b/worlds/alttp/test/dungeons/TestDungeon.py index c06955a1..dd622c4f 100644 --- a/worlds/alttp/test/dungeons/TestDungeon.py +++ b/worlds/alttp/test/dungeons/TestDungeon.py @@ -5,7 +5,7 @@ from worlds.alttp.ItemPool import difficulties from worlds.alttp.Items import item_factory from worlds.alttp.Regions import create_regions from worlds.alttp.Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from worlds.alttp.test.bases import LTTPTestBase class TestDungeon(LTTPTestBase): diff --git a/worlds/alttp/test/inverted/TestInverted.py b/worlds/alttp/test/inverted/TestInverted.py index 3c86b6ba..8dc02de7 100644 --- a/worlds/alttp/test/inverted/TestInverted.py +++ b/worlds/alttp/test/inverted/TestInverted.py @@ -1,13 +1,12 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInverted(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/inverted/TestInvertedBombRules.py b/worlds/alttp/test/inverted/TestInvertedBombRules.py index ab73d911..5ad52709 100644 --- a/worlds/alttp/test/inverted/TestInvertedBombRules.py +++ b/worlds/alttp/test/inverted/TestInvertedBombRules.py @@ -4,7 +4,7 @@ from worlds.alttp.EntranceShuffle import connect_entrance, Inverted_LW_Entrances from worlds.alttp.InvertedRegions import create_inverted_regions from worlds.alttp.ItemPool import difficulties from worlds.alttp.Rules import set_inverted_big_bomb_rules -from worlds.alttp.test import LTTPTestBase +from worlds.alttp.test.bases import LTTPTestBase class TestInvertedBombRules(LTTPTestBase): diff --git a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py index 972b617a..958cd3e7 100644 --- a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py +++ b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py @@ -1,14 +1,13 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInvertedMinor(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py index 4be51f62..8a6b570d 100644 --- a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py +++ b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py @@ -1,14 +1,13 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInvertedOWG(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/items/TestDifficulty.py b/worlds/alttp/test/items/TestDifficulty.py index 69dd8a4d..ff4deb85 100644 --- a/worlds/alttp/test/items/TestDifficulty.py +++ b/worlds/alttp/test/items/TestDifficulty.py @@ -1,5 +1,5 @@ -from worlds.alttp.ItemPool import difficulties -from test.bases import TestBase +from ...ItemPool import difficulties +from ..bases import TestBase base_items = 41 extra_counts = (15, 15, 10, 5, 25) diff --git a/worlds/alttp/test/minor_glitches/TestMinor.py b/worlds/alttp/test/minor_glitches/TestMinor.py index d5ffe8ca..5ffb1ca8 100644 --- a/worlds/alttp/test/minor_glitches/TestMinor.py +++ b/worlds/alttp/test/minor_glitches/TestMinor.py @@ -1,11 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestMinor(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/owg/TestVanillaOWG.py b/worlds/alttp/test/owg/TestVanillaOWG.py index 6b6db145..6c246865 100644 --- a/worlds/alttp/test/owg/TestVanillaOWG.py +++ b/worlds/alttp/test/owg/TestVanillaOWG.py @@ -1,11 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestVanillaOWG(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/shops/TestSram.py b/worlds/alttp/test/shops/TestSram.py index 74a41a62..a7dfd37c 100644 --- a/worlds/alttp/test/shops/TestSram.py +++ b/worlds/alttp/test/shops/TestSram.py @@ -1,5 +1,5 @@ -from worlds.alttp.Shops import shop_table -from test.bases import TestBase +from ...Shops import shop_table +from ..bases import TestBase class TestSram(TestBase): diff --git a/worlds/alttp/test/vanilla/TestVanilla.py b/worlds/alttp/test/vanilla/TestVanilla.py index 031aec1f..2ddcdadc 100644 --- a/worlds/alttp/test/vanilla/TestVanilla.py +++ b/worlds/alttp/test/vanilla/TestVanilla.py @@ -1,10 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired + +from ..bases import LTTPTestBase, TestBase class TestVanilla(TestBase, LTTPTestBase): diff --git a/worlds/pokemon_emerald/test/test_warps.py b/worlds/pokemon_emerald/test/test_warps.py index d1b5b01d..f210ff6b 100644 --- a/worlds/pokemon_emerald/test/test_warps.py +++ b/worlds/pokemon_emerald/test/test_warps.py @@ -1,8 +1,8 @@ -from test.bases import TestBase +from unittest import TestCase from ..data import Warp -class TestWarps(TestBase): +class TestWarps(TestCase): 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"))) From 18ac9210cb1205396901519cdd5bfad9dff3f543 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Mon, 8 Sep 2025 21:29:31 -0400 Subject: [PATCH 066/204] SA2B: Logic Fixes and Black Market Trap Name Improvements (#5427) * Logic fixes and more Chao and Fake Item names * Fix typo * Overhaul Shop Trap Item names --- worlds/sa2b/AestheticData.py | 353 ++++++++++++++++++++++++++--------- worlds/sa2b/Rules.py | 5 +- worlds/sa2b/__init__.py | 12 +- 3 files changed, 280 insertions(+), 90 deletions(-) diff --git a/worlds/sa2b/AestheticData.py b/worlds/sa2b/AestheticData.py index 386b2850..79427291 100644 --- a/worlds/sa2b/AestheticData.py +++ b/worlds/sa2b/AestheticData.py @@ -170,126 +170,309 @@ sample_chao_names = [ "Portia", "Graves", "Kaycee", + "Ghandi", + "Medli", + "Jak", + "Wario", + "Theo", ] -totally_real_item_names = [ - "Mallet", - "Lava Rod", - "Master Knife", - "Slippers", - "Spade", +totally_real_item_names: dict[str, list[str]] = { + "Bumper Stickers": [ + "Bonus Score", + "Boosting Bumper", + ], - "Progressive Car Upgrade", - "Bonus Token", + "Castlevania 64": [ + "Earth card", + "Venus card", + "Ax", + "Storehouse Key", + ], - "Shortnail", - "Runmaster", + "Celeste 64": [ + "Blueberry", + "Side Flip", + "Triple Dash Refills", + "Swap Blocks", + "Dream Blocks", + ], - "Courage Form", - "Auto Courage", - "Donald Defender", - "Goofy Blizzard", - "Ultimate Weapon", + "Celeste (Open World)": [ + "Green Boosters", + "Triple Dash Refills", + "Rising Platforms", + "Red Bubbles", + "Granny's Car Keys", + "Blueberry", + ], - "Song of the Sky Whale", - "Gryphon Shoes", - "Wing Key", - "Strength Anklet", + "Civilization VI": [ + "Advanced Trebuchets", + "The Wheel 2", + "NFTs", + ], - "Hairclip", + "Donkey Kong Country 3": [ + "Progressive Car Upgrade", + "Bonus Token", + ], - "Key of Wisdom", + "Factorio": [ + "logistic-ai", + "progressive-militia", + "progressive-stronger-explosives", + "uranium-food", + ], - "Baking", - "Progressive Block Mining", + "A Hat in Time": [ + "Fire Hat", + "69 Pons", + "Relic (Green Canyon)", + "Relic (Cooler Cow)", + "Time Fragment", + ], - "Jar", - "Whistle of Space", - "Rito Tunic", + "Hollow Knight": [ + "Shortnail", + "Runmaster", + ], - "Kitchen Sink", + "Jak and Daxter The Precursor Legacy": [ + "69 Precursor Orbs", + "Jump Roll", + "Roll Kick", + ], - "Rock Badge", - "Key Card", - "Pikachu", - "Eevee", - "HM02 Strength", + "Kirby's Dream Land 3": [ + "CooCoo", + ], - "Progressive Astromancers", - "Progressive Chefs", - "The Living Safe", - "Lady Quinn", + "Kingdom Hearts 2": [ + "Courage Form", + "Auto Courage", + "Donald Defender", + "Goofy Blizzard", + "Ultimate Weapon", + ], - "Dio's Worst Enemy", + "Lingo": [ + "Art Gallery (First Floor)", + "Color Hunt - Pink Barrier", + ], - "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)", + "A Link to the Past": [ + "Mallet", + "Lava Rod", + "Master Knife", + "Slippers", + "Spade", + "Big Key (Dark Palace)", + "Big Key (Hera Tower)", + ], - "Sensor Bunker", - "Phantom", - "Soldier", + "Links Awakening DX": [ + "Song of the Sky Whale", + "Gryphon Shoes", + "Wing Key", + "Strength Anklet", + ], - "Plasma Suit", - "Gravity Beam", - "Hi-Jump Ball", + "Mario & Luigi Superstar Saga": [ + "Mega Nut", + ], - "Cannon Unlock LLL", - "Feather Cap", + "The Messenger": [ + "Key of Anger", + "Time Shard (69)", + "Hydro", + ], - "Progressive Yoshi", - "Purple Switch Palace", - "Cape Feather", + "Muse Dash": [ + "U.N. Owen Was Her", + "Renai Circulation", + "Flyers", + ], - "Cane of Bryan", + "Noita": [ + "Gold (69)", + "Sphere", + "Melee Die", + ], - "Van Repair", - "Autumn", - "Galaxy Knife", - "Green Cabbage Seeds", + "Ocarina of Time": [ + "Jar", + "Whistle of Space", + "Rito Tunic", + "Boss Key (Forest Haven)", + "Boss Key (Swamp Palace)", + "Boss Key (Great Bay Temple)", + ], - "Timespinner Cog 1", + "Old School Runescape": [ + "Area: Taverly", + "Area: Meiyerditch", + "Fire Cape", + ], - "Ladder", + "Overcooked! 2": [ + "Kitchen Sink", + ], - "Visible Dots", + "Paint": [ + "AI Enhance", + "Paint Bucket", + "Pen", + ], - "CooCoo", + "Pokemon Red and Blue": [ + "Rock Badge", + "Key Card", + "Pikachu", + "Eevee", + "HM02 Strength", + "HM05 Fly", + "HM01 Surf", + "Card Key 12F", + ], - "Blueberry", + "Risk of Rain 2": [ + "Dio's Worst Enemy", + "Stage 5", + "Mythical Item", + ], - "Ear of Luigi", + "Rogue Legacy": [ + "Progressive Astromancers", + "Progressive Chefs", + "The Living Safe", + "Lady Quinn", + ], - "Mega Nut", + "Saving Princess": [ + "Fire Spreadshot", + "Volcano Key", + "Frozen Key", + ], - "DUELIST ALLIANCE", - "DUEL OVERLOAD", - "POWER OF THE ELEMENTS", - "S:P Little Knight", - "Red-Eyes Dark Dragoon", + "Secret of Evermore": [ + "Mantis Claw", + "Progressive pants", + "Deflect", + ], - "Fire Hat", + "shapez": [ + "Spinner", + "Toggle", + "Slicer", + "Splitter", + ], - "Area: Taverly", - "Area: Meiyerditch", - "Fire Cape", + "SMZ3": [ + "Cane of Bryan", + ], - "Donald Zeta Flare", + "Sonic Adventure 2 Battle": [ + "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)", + ], - "Category One of a Kind", - "Category Fuller House", + "Starcraft 2": [ + "Sensor Bunker", + "Phantom", + "Soldier", + ], - "Passive Camoflage", + "Stardew Valley": [ + "Van Repair", + "Ship Repair", + "Autumn", + "Galaxy Knife", + "Green Cabbage Seeds", + "Casket", + "Pet Moonlight Jelly", + "Adventurer's Guild Key", + ], - "Earth Card", -] + "Super Mario Land 2": [ + "Luigi Coin", + "Luigi Zone Progression", + "Hard Mode", + ], + + "Super Metroid": [ + "Plasma Suit", + "Gravity Beam", + "Hi-Jump Ball", + ], + + "Super Mario 64": [ + "Cannon Unlock LLL", + "Feather Cap", + ], + + "Super Mario World": [ + "Progressive Yoshi", + "Purple Switch Palace", + "Cape Feather", + "Fire Flower", + "Cling", + "Twirl Jump", + ], + + "Timespinner": [ + "Timespinner Cog 1", + "Leg Cannon", + ], + + "TUNIC": [ + "Ladder To West Forest", + "Money x69", + "Page 69", + "Master Sword", + ], + + "The Wind Waker": [ + "Ballad of Storms", + "Wind God's Song", + "Earth God's Song", + "Ordon's Pearl", + ], + + "The Witness": [ + "Visible Dots", + ], + + "Yacht Dice": [ + "Category One of a Kind", + "Category Fuller House", + ], + + "Yoshi's Island": [ + "Ear of Luigi", + "+69 Stars", + "Water Melon", + "World 7 Gate", + "Small Spring Ball", + ], + + "Yu-Gi-Oh! 2006": [ + "DUELIST ALLIANCE", + "DUEL OVERLOAD", + "POWER OF THE ELEMENTS", + "S:P Little Knight", + "Red-Eyes Dark Dragoon", + "Maxx C" + ], +} all_exits = [ 0x00, # Lobby to Neutral diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py index a7ea9bec..e5080f46 100644 --- a/worlds/sa2b/Rules.py +++ b/worlds/sa2b/Rules.py @@ -1406,7 +1406,8 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla lambda state: (state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_treasure_scope, player))) add_rule(multiworld.get_location(LocationName.white_jungle_lifebox_2, player), - lambda state: state.has(ItemName.shadow_flame_ring, player)) + lambda state: (state.has(ItemName.shadow_flame_ring, player) and + state.has(ItemName.shadow_air_shoes, player))) add_rule(multiworld.get_location(LocationName.metal_harbor_lifebox_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) @@ -2062,6 +2063,8 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla add_rule(multiworld.get_location(LocationName.mad_space_big, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(multiworld.get_location(LocationName.cannon_core_big_1, player), + lambda state: state.has(ItemName.tails_booster, player)) add_rule(multiworld.get_location(LocationName.cannon_core_big_2, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) diff --git a/worlds/sa2b/__init__.py b/worlds/sa2b/__init__.py index d7c9ceae..21989626 100644 --- a/worlds/sa2b/__init__.py +++ b/worlds/sa2b/__init__.py @@ -613,7 +613,8 @@ class SA2BWorld(World): 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: + self.options.black_market_slots.value > 0 or \ + self.options.goal.value == 7: return True; return False @@ -757,13 +758,16 @@ class SA2BWorld(World): 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_name = "" + if location.item.game in totally_real_item_names: + item_name = self.random.choice(totally_real_item_names[location.item.game]) + else: + random_game_names: list[str] = self.random.choice(list(totally_real_item_names.values())) + item_name = self.random.choice(random_game_names) item_names.append(item_name) else: item_names.append(location.item.name) From 287bb638a09ad6ef4d0c154d915fa569da76fbd5 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 9 Sep 2025 19:33:31 +0200 Subject: [PATCH 067/204] Docs: Kivy Style (#5425) Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- docs/style.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/style.md b/docs/style.md index 5333155d..bb1526fa 100644 --- a/docs/style.md +++ b/docs/style.md @@ -60,3 +60,9 @@ * Indent `case` inside `switch ` with 2 spaces. * Use single quotes. * Semicolons are required after every statement. + +## KV + +* Style should be defined in `.kv` as much as possible, only Python when unavailable. +* Should follow [our Python style](#python-code) where appropriate (quotation marks, indentation). +* When escaping a line break, add a space between code and backslash. From 9aa0bf72456e843aa1a8227b93c1bd4e3b26bd1e Mon Sep 17 00:00:00 2001 From: Rosalie <61372066+Rosalie-A@users.noreply.github.com> Date: Tue, 9 Sep 2025 18:42:32 -0400 Subject: [PATCH 068/204] FF1: New Maintainership (#5027) * Submitting myself for FF1 maintainership * Uncommented an important line. --- docs/CODEOWNERS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index d5f35888..7b8e48af 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -72,6 +72,9 @@ # Faxanadu /worlds/faxanadu/ @Daivuk +# Final Fantasy (1) +/worlds/ff1/ @Rosalie-A + # Final Fantasy Mystic Quest /worlds/ffmq/ @Alchav @wildham0 @@ -241,9 +244,6 @@ # compatibility, these worlds may be deleted. If you are interested in stepping up as maintainer for # any of these worlds, please review `/docs/world maintainer.md` documentation. -# Final Fantasy (1) -# /worlds/ff1/ - # Ocarina of Time # /worlds/oot/ From 78b529fc239d1358983d3cd1faab0b5199d5f659 Mon Sep 17 00:00:00 2001 From: Colin <32756996+TriumphantBass@users.noreply.github.com> Date: Wed, 10 Sep 2025 07:27:13 -0700 Subject: [PATCH 069/204] Timespinner: Adds Lantern Check flags, Missing Traps (#5188) * Timespinner: Add Torch Flags * Add comment of all torch locations * Add gyre and dark forest lanterns * Add Ancient Pyramid * Don't make cube default progression * Add Emperors Tower * Add lake desolation, forest * Add lab * Add library, varndagroth * Add hangar * Add ramparts * Add Xarion * Add castle keep * Add royal towers * Add lake serene * Add remaining checks * Add missing region * Fix region names * Fix location id * Add traps to settings * Add restriction to elevator keycard torch * Set new traps to have quantity 0 by default * Scythe is now useful due to torch shredding * Add additional lantern * Un-disable missing lantern * Include location ids in tracker * Remove additional space * Fix paren * Add missing lantern * Remove tablet requirement for torches * Update filler V card * Fix brackets * Address feedback --- WebHostLib/tracker.py | 48 +- worlds/timespinner/Items.py | 8 +- worlds/timespinner/Locations.py | 990 ++++++++++++++++++++------ worlds/timespinner/LogicExtensions.py | 7 + worlds/timespinner/Options.py | 14 +- worlds/timespinner/Regions.py | 27 +- worlds/timespinner/__init__.py | 11 +- 7 files changed, 844 insertions(+), 261 deletions(-) diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 18145dae..356eb976 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -954,30 +954,13 @@ if "Timespinner" in network_data_package["games"]: "Lab Glasses": "https://timespinnerwiki.com/mediawiki/images/4/4a/Lab_Glasses.png", "Eye Orb": "https://timespinnerwiki.com/mediawiki/images/a/a4/Eye_Orb.png", "Lab Coat": "https://timespinnerwiki.com/mediawiki/images/5/51/Lab_Coat.png", - "Demon": "https://timespinnerwiki.com/mediawiki/images/f/f8/Familiar_Demon.png", + "Demon": "https://timespinnerwiki.com/mediawiki/images/f/f8/Familiar_Demon.png", + "Cube of Bodie": "https://timespinnerwiki.com/mediawiki/images/1/14/Menu_Icon_Stats.png" } 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], + "Present": list(range(1337000, 1337085)), + "Past": list(range(1337086, 1337175)), "Ancient Pyramid": [ 1337236, 1337246, 1337247, 1337248, 1337249] @@ -985,26 +968,23 @@ if "Timespinner" in network_data_package["games"]: 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] + timespinner_location_ids["Present"] += [1337156, 1337157] + list(range(1337159, 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] + timespinner_location_ids["Present"] += list(range(1337177, 1337187)) + timespinner_location_ids["Past"] += list(range(1337188, 1337198)) if (slot_data["GyreArchives"]): - timespinner_location_ids["Ancient Pyramid"] += [ - 1337237, 1337238, 1337239, - 1337240, 1337241, 1337242, 1337243, 1337244, 1337245] + timespinner_location_ids["Ancient Pyramid"] += list(range(1337237, 1337245)) if (slot_data["PyramidStart"]): timespinner_location_ids["Ancient Pyramid"] += [ 1337233, 1337234, 1337235] + if (slot_data["PureTorcher"]): + timespinner_location_ids["Present"] += list(range(1337250, 1337352)) + list(range(1337422, 1337496)) + [1337506] + list(range(1337712, 1337779)) + [1337781, 1337782] + timespinner_location_ids["Past"] += list(range(1337497, 1337505)) + list(range(1337507, 1337711)) + [1337780] + timespinner_location_ids["Ancient Pyramid"] += list(range(1337369, 1337421)) + if (slot_data["GyreArchives"]): + timespinner_location_ids["Ancient Pyramid"] += list(range(1337353, 1337368)) display_data = {} diff --git a/worlds/timespinner/Items.py b/worlds/timespinner/Items.py index 4cfcc289..957c6176 100644 --- a/worlds/timespinner/Items.py +++ b/worlds/timespinner/Items.py @@ -174,7 +174,7 @@ item_table: Dict[str, ItemData] = { 'Corruption': ItemData('Orb Spell', 1337161), 'Lightwall': ItemData('Orb Spell', 1337162, progression=True), 'Bleak Ring': ItemData('Orb Passive', 1337163, useful=True), - 'Scythe Ring': ItemData('Orb Passive', 1337164), + 'Scythe Ring': ItemData('Orb Passive', 1337164, useful=True), 'Pyro Ring': ItemData('Orb Passive', 1337165, progression=True), 'Royal Ring': ItemData('Orb Passive', 1337166, progression=True), 'Shield Ring': ItemData('Orb Passive', 1337167), @@ -208,9 +208,11 @@ item_table: Dict[str, ItemData] = { 'Lab Access Research': ItemData('Lab Access', 1337196, progression=True), 'Lab Access Dynamo': ItemData('Lab Access', 1337197, progression=True), 'Drawbridge Key': ItemData('Key', 1337198, progression=True), - # 1337199 Reserved + 'Cube of Bodie': ItemData('Relic', 1337199, progression=True), 'Spider Trap': ItemData('Trap', 1337200, 0, trap=True), - # 1337201 - 1337248 Reserved + 'Lights Out Trap': ItemData('Trap', 1337201, 0, trap=True), + 'Palm Punch Trap': ItemData('Trap', 1337202, 0, trap=True), + # 1337203 - 1337248 Reserved 'Max Sand': ItemData('Stat', 1337249, 14) } diff --git a/worlds/timespinner/Locations.py b/worlds/timespinner/Locations.py index 21e5501e..ffd2f60e 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -22,236 +22,238 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337000 - 1337155 Generic locations # 1337171 - 1337175 New Pickup checks # 1337246 - 1337249 Ancient Pyramid + # 1337250 - 1337781 Torch checks + # 1337782 - 1337999 Reserved location_table: List[LocationData] = [ # Present item locations - LocationData('Tutorial', 'Tutorial: Yo Momma 1', 1337000), - LocationData('Tutorial', 'Tutorial: Yo Momma 2', 1337001), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 2', 1337002), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 3', 1337003), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 1', 1337004), - LocationData('Lake desolation', 'Lake Desolation (Lower): Timespinner Wheel room', 1337005), - LocationData('Lake desolation', 'Lake Desolation: Forget me not chest', 1337006, lambda state: logic.has_fire(state) and state.can_reach('Upper Lake Serene', 'Region', player)), + LocationData('Tutorial', 'Tutorial: Yo Momma 1', 1337000), + LocationData('Tutorial', 'Tutorial: Yo Momma 2', 1337001), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 2', 1337002), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 3', 1337003), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 1', 1337004), + LocationData('Lake desolation', 'Lake Desolation (Lower): Timespinner Wheel room', 1337005), + LocationData('Lake desolation', 'Lake Desolation: Forget me not chest', 1337006, lambda state: logic.has_fire(state) and state.can_reach('Upper Lake Serene', 'Region', player)), LocationData('Lake desolation', 'Lake Desolation (Lower): Chicken chest', 1337007, logic.has_timestop), - LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not so secret room', 1337008, logic.can_break_walls), - LocationData('Lower lake desolation', 'Lake Desolation (Upper): Tank chest', 1337009, logic.has_timestop), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen recovery room', 1337010), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Secret room', 1337011, logic.can_break_walls), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave platform', 1337012, logic.has_doublejump), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave floor', 1337013), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Sparrow chest', 1337014), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site pedestal', 1337015), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 1', 1337016, lambda state: state.has('Killed Maw', player)), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 2', 1337017, lambda state: state.has('Killed Maw', player)), - LocationData('Eastern lake desolation', 'Lake Desolation: Kitty Boss', 1337018), - LocationData('Library', 'Library: Basement', 1337019), - LocationData('Library', 'Library: Warp gate', 1337020), - LocationData('Library', 'Library: Librarian', 1337021), - LocationData('Library', 'Library: Reading nook chest', 1337022), - LocationData('Library', 'Library: Storage room chest 1', 1337023, logic.has_keycard_D), - LocationData('Library', 'Library: Storage room chest 2', 1337024, logic.has_keycard_D), - LocationData('Library', 'Library: Storage room chest 3', 1337025, logic.has_keycard_D), - LocationData('Library top', 'Library: Backer room chest 5', 1337026), - LocationData('Library top', 'Library: Backer room chest 4', 1337027), - LocationData('Library top', 'Library: Backer room chest 3', 1337028), - LocationData('Library top', 'Library: Backer room chest 2', 1337029), - LocationData('Library top', 'Library: Backer room chest 1', 1337030), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator Key not required', 1337031), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Ye olde Timespinner', 1337032), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom floor', 1337033, logic.has_keycard_C), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Air vents secret', 1337034, logic.can_break_walls), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator chest', 1337035, lambda state: state.has('Elevator Keycard', player)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge', 1337036), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Elevator chest', 1337037), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Elevator card chest', 1337038, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents right chest', 1337039, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents left chest', 1337040, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Bottom floor', 1337041), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Varndagroth', 1337042, logic.has_keycard_C), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Spider Hell', 1337043, logic.has_keycard_A), - LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton', 1337044), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom jump room', 1337045, logic.has_timestop), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Double shroom room', 1337046), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Jacksquat room', 1337047, logic.has_forwarddash_doublejump), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Below Jacksquat room', 1337048), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Secret room', 1337049, logic.can_break_walls), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Bottom left room', 1337050), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last chance before Xarion', 1337051, logic.has_doublejump), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Xarion', 1337052, lambda state: not flooded.flood_xarion or state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Water hook', 1337053, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater right', 1337054, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater left', 1337055, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 1', 1337056), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 2', 1337057), - LocationData('Military Fortress', 'Military Fortress: Bomber chest', 1337058, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), - LocationData('Military Fortress', 'Military Fortress: Close combat room', 1337059), - 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_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, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state) ), - LocationData('The lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), - LocationData('The lab (power off)', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), - LocationData('The lab (power off)', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or (state.has_all(('Lab Access Research', 'Lab Access Dynamo'), player)) ), - LocationData('The lab (upper)', 'Lab: Genza (Blob Mom)', 1337072), - LocationData('The lab (power off)', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), - LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), - LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), - LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A(state) and not options.lock_key_amadeus or state.has('Lab Access Research', player)), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), - LocationData('Emperors tower', 'Emperor\'s Tower: Galactic sage room', 1337080), - LocationData('Emperors tower', 'Emperor\'s Tower: Bottom right tower', 1337081), - LocationData('Emperors tower', 'Emperor\'s Tower: Wayyyy up there', 1337082, logic.has_doublejump_of_npc), - LocationData('Emperors tower', 'Emperor\'s Tower: Left tower balcony', 1337083), - LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers chest', 1337084), - LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers pedestal', 1337085), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not so secret room', 1337008, logic.can_break_walls), + LocationData('Lower lake desolation', 'Lake Desolation (Upper): Tank chest', 1337009, logic.has_timestop), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen recovery room', 1337010), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Secret room', 1337011, logic.can_break_walls), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave platform', 1337012, logic.has_doublejump), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave floor', 1337013), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Sparrow chest', 1337014), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site pedestal', 1337015), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 1', 1337016, lambda state: state.has('Killed Maw', player)), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 2', 1337017, lambda state: state.has('Killed Maw', player)), + LocationData('Eastern lake desolation', 'Lake Desolation: Kitty Boss', 1337018), + LocationData('Library', 'Library: Basement', 1337019), + LocationData('Library', 'Library: Warp gate', 1337020), + LocationData('Library', 'Library: Librarian', 1337021), + LocationData('Library', 'Library: Reading nook chest', 1337022), + LocationData('Library', 'Library: Storage room chest 1', 1337023, logic.has_keycard_D), + LocationData('Library', 'Library: Storage room chest 2', 1337024, logic.has_keycard_D), + LocationData('Library', 'Library: Storage room chest 3', 1337025, logic.has_keycard_D), + LocationData('Library top', 'Library: Backer room chest 5', 1337026), + LocationData('Library top', 'Library: Backer room chest 4', 1337027), + LocationData('Library top', 'Library: Backer room chest 3', 1337028), + LocationData('Library top', 'Library: Backer room chest 2', 1337029), + LocationData('Library top', 'Library: Backer room chest 1', 1337030), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator Key not required', 1337031), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Ye olde Timespinner', 1337032), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom floor', 1337033, logic.has_keycard_C), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Air vents secret', 1337034, logic.can_break_walls), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator chest', 1337035, lambda state: state.has('Elevator Keycard', player)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge', 1337036), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Elevator chest', 1337037), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Elevator card chest', 1337038, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents right chest', 1337039, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents left chest', 1337040, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Bottom floor', 1337041), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Varndagroth', 1337042, logic.has_keycard_C), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Spider Hell', 1337043, logic.has_keycard_A), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton', 1337044), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom jump room', 1337045, logic.has_timestop), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Double shroom room', 1337046), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Jacksquat room', 1337047, logic.has_forwarddash_doublejump), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Below Jacksquat room', 1337048), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Secret room', 1337049, logic.can_break_walls), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Bottom left room', 1337050), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last chance before Xarion', 1337051, logic.has_doublejump), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Xarion', 1337052, lambda state: not flooded.flood_xarion or state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Water hook', 1337053, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater right', 1337054, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater left', 1337055, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 1', 1337056), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 2', 1337057), + LocationData('Military Fortress', 'Military Fortress: Bomber chest', 1337058, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), + LocationData('Military Fortress', 'Military Fortress: Close combat room', 1337059), + 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_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('Main Lab', 'Lab: Coffee break', 1337066), + LocationData('Main Lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), + LocationData('Main Lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state) ), + LocationData('Main Lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), + LocationData('Main Lab', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), + LocationData('Lab Research', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or ( state.has('Lab Access Dynamo', player) and logic.has_upwarddash(state) )), + LocationData('The lab (upper)', 'Lab: Genza (Blob Mom)', 1337072), + LocationData('Main Lab', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), + LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), + LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), + LocationData('Lab Research', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A(state)), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic sage room', 1337080), + LocationData('Emperors tower', 'Emperor\'s Tower: Bottom right tower', 1337081), + LocationData('Emperors tower', 'Emperor\'s Tower: Wayyyy up there', 1337082, logic.has_doublejump_of_npc), + LocationData('Emperors tower', 'Emperor\'s Tower: Left tower balcony', 1337083), + LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers chest', 1337084), + LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers pedestal', 1337085), LocationData('Emperors tower', 'Killed Emperor', EventId), # Past item locations - LocationData('Refugee Camp', 'Refugee Camp: Neliste\'s Bra', 1337086), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 3', 1337087), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 2', 1337088), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 1', 1337089), - LocationData('Forest', 'Forest: Refugee camp roof', 1337090), - LocationData('Forest', 'Forest: Bat jump ledge', 1337091, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Forest', 'Forest: Green platform secret', 1337092, logic.can_break_walls), - LocationData('Forest', 'Forest: Rats guarded chest', 1337093), - LocationData('Forest', 'Forest: Waterfall chest 1', 1337094, lambda state: state.has('Water Mask', player)), - LocationData('Forest', 'Forest: Waterfall chest 2', 1337095, lambda state: state.has('Water Mask', player)), - LocationData('Forest', 'Forest: Batcave', 1337096), - LocationData('Forest', 'Castle Ramparts: In the moat', 1337097, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), - LocationData('Left Side forest Caves', 'Forest: Before Serene single bat cave', 1337098), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Rat nest', 1337099), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave platform', 1337100, logic.has_doublejump), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave floor', 1337101), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Cave secret', 1337102, logic.can_break_walls), + LocationData('Refugee Camp', 'Refugee Camp: Neliste\'s Bra', 1337086), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 3', 1337087), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 2', 1337088), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 1', 1337089), + LocationData('Forest', 'Forest: Refugee camp roof', 1337090), + LocationData('Forest', 'Forest: Bat jump ledge', 1337091, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Forest', 'Forest: Green platform secret', 1337092, logic.can_break_walls), + LocationData('Forest', 'Forest: Rats guarded chest', 1337093), + LocationData('Forest', 'Forest: Waterfall chest 1', 1337094, lambda state: state.has('Water Mask', player)), + LocationData('Forest', 'Forest: Waterfall chest 2', 1337095, lambda state: state.has('Water Mask', player)), + LocationData('Forest', 'Forest: Batcave', 1337096), + LocationData('Forest', 'Castle Ramparts: In the moat', 1337097, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Forest: Before Serene single bat cave', 1337098), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Rat nest', 1337099), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave platform', 1337100, logic.has_doublejump), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave floor', 1337101), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Cave secret', 1337102, logic.can_break_walls), LocationData('Upper Lake Serene', 'Lake Serene: Before Big Bird', 1337175), - LocationData('Upper Lake Serene', 'Lake Serene: Behind the vines', 1337103), - LocationData('Upper Lake Serene', 'Lake Serene: Pyramid keys room', 1337104), + LocationData('Upper Lake Serene', 'Lake Serene: Behind the vines', 1337103), + LocationData('Upper Lake Serene', 'Lake Serene: Pyramid keys room', 1337104), LocationData('Upper Lake Serene', 'Lake Serene (Upper): Chicken ledge', 1337174), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Deep dive', 1337105), - LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under the eels', 1337106, lambda state: state.has('Water Mask', player)), - 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: flooded.flood_lake_serene or logic.has_doublejump_of_npc(state)), - LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the eels', 1337110, lambda state: state.has('Water Mask', player)), - 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: 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: flooded.flood_maw or logic.has_doublejump(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Deep dive', 1337105), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under the eels', 1337106, lambda state: state.has('Water Mask', player)), + 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: flooded.flood_lake_serene or logic.has_doublejump_of_npc(state)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the eels', 1337110, lambda state: state.has('Water Mask', player)), + 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: 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: flooded.flood_maw or 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)), - LocationData('Caves of Banishment (Maw)', 'Killed Maw', EventId, lambda state: state.has('Gas Mask', player)), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Mineshaft', 1337122, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Wyvern room', 1337123), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room above water chest', 1337124), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater left chest', 1337125, lambda state: state.has('Water Mask', player)), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right chest', 1337126, lambda state: state.has('Water Mask', player)), + LocationData('Caves of Banishment (Maw)', 'Killed Maw', EventId, lambda state: state.has('Gas Mask', player)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Mineshaft', 1337122, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Wyvern room', 1337123), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room above water chest', 1337124), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater left chest', 1337125, lambda state: state.has('Water Mask', player)), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right chest', 1337126, lambda state: state.has('Water Mask', player)), LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right ground', 1337172, lambda state: state.has('Water Mask', player)), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Water hook', 1337127, lambda state: state.has('Water Mask', player)), - LocationData('Castle Ramparts', 'Castle Ramparts: Bomber chest', 1337128, logic.has_multiple_small_jumps_of_npc), - LocationData('Castle Ramparts', 'Castle Ramparts: Freeze the engineer', 1337129, lambda state: state.has('Talaria Attachment', player) or logic.has_timestop(state)), - LocationData('Castle Ramparts', 'Castle Ramparts: Giantess guarded room', 1337130), - LocationData('Castle Ramparts', 'Castle Ramparts: Knight and archer guarded room', 1337131), - LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal', 1337132), - LocationData('Castle Basement', 'Castle Basement: Secret pedestal', 1337133, logic.can_break_walls), - LocationData('Castle Basement', 'Castle Basement: Clean the castle basement', 1337134), - LocationData('Royal towers (lower)', 'Castle Keep: Yas queen room', 1337135, logic.has_pink), - LocationData('Castle Basement', 'Castle Basement: Giantess guarded chest', 1337136), - LocationData('Castle Basement', 'Castle Basement: Omelette chest', 1337137), - LocationData('Castle Basement', 'Castle Basement: Just an egg', 1337138), - LocationData('Castle Keep', 'Castle Keep: Under the twins', 1337139), - LocationData('Castle Keep', 'Killed Twins', EventId, logic.has_timestop), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Water hook', 1337127, lambda state: state.has('Water Mask', player)), + LocationData('Castle Ramparts', 'Castle Ramparts: Bomber chest', 1337128, logic.has_multiple_small_jumps_of_npc), + LocationData('Castle Ramparts', 'Castle Ramparts: Freeze the engineer', 1337129, lambda state: state.has('Talaria Attachment', player) or logic.has_timestop(state)), + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess guarded room', 1337130), + LocationData('Castle Ramparts', 'Castle Ramparts: Knight and archer guarded room', 1337131), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal', 1337132), + LocationData('Castle Basement', 'Castle Basement: Secret pedestal', 1337133, logic.can_break_walls), + LocationData('Castle Basement', 'Castle Basement: Clean the castle basement', 1337134), + LocationData('Royal towers (lower)', 'Castle Keep: Yas queen room', 1337135, logic.has_pink), + LocationData('Castle Basement', 'Castle Basement: Giantess guarded chest', 1337136), + LocationData('Castle Basement', 'Castle Basement: Omelette chest', 1337137), + LocationData('Castle Basement', 'Castle Basement: Just an egg', 1337138), + LocationData('Castle Keep', 'Castle Keep: Under the twins', 1337139), + LocationData('Castle Keep', 'Killed Twins', EventId, logic.has_timestop), LocationData('Castle Keep', 'Castle Keep: Advisor jump', 1337171, logic.has_timestop), - LocationData('Castle Keep', 'Castle Keep: Twins', 1337140, logic.has_timestop), - LocationData('Castle Keep', 'Castle Keep: Royal guard tiny room', 1337141, lambda state: logic.has_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Royal towers (lower)', 'Royal Towers: Floor secret', 1337142, lambda state: logic.has_doublejump(state) and logic.can_break_walls(state)), - LocationData('Royal towers', 'Royal Towers: Pre-climb gap', 1337143), - LocationData('Royal towers', 'Royal Towers: Long balcony', 1337144, lambda state: not flooded.flood_courtyard or state.has('Water Mask', player)), - LocationData('Royal towers', 'Royal Towers: Past bottom struggle juggle', 1337145, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), - LocationData('Royal towers', 'Royal Towers: Bottom struggle juggle', 1337146, logic.has_doublejump_of_npc), - LocationData('Royal towers (upper)', 'Royal Towers: Top struggle juggle', 1337147, logic.has_doublejump_of_npc), - LocationData('Royal towers (upper)', 'Royal Towers: No struggle required', 1337148), - LocationData('Royal towers', 'Royal Towers: Right tower freebie', 1337149), - LocationData('Royal towers (upper)', 'Royal Towers: Left tower small balcony', 1337150), - LocationData('Royal towers (upper)', 'Royal Towers: Left tower royal guard', 1337151), - LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana', 1337152), - LocationData('Royal towers (upper)', 'Killed Aelana', EventId), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s attic', 1337153, logic.has_upwarddash), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s chest', 1337154), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s pedestal', 1337155), + LocationData('Castle Keep', 'Castle Keep: Twins', 1337140, logic.has_timestop), + LocationData('Castle Keep', 'Castle Keep: Royal guard tiny room', 1337141, lambda state: logic.has_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Royal towers (lower)', 'Royal Towers: Floor secret', 1337142, lambda state: logic.has_doublejump(state) and logic.can_break_walls(state)), + LocationData('Royal towers', 'Royal Towers: Pre-climb gap', 1337143), + LocationData('Royal towers', 'Royal Towers: Long balcony', 1337144, lambda state: not flooded.flood_courtyard or state.has('Water Mask', player)), + LocationData('Royal towers', 'Royal Towers: Past bottom struggle juggle', 1337145, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), + LocationData('Royal towers', 'Royal Towers: Bottom struggle juggle', 1337146, logic.has_doublejump_of_npc), + LocationData('Royal towers (upper)', 'Royal Towers: Top struggle juggle', 1337147, logic.has_doublejump_of_npc), + LocationData('Royal towers (upper)', 'Royal Towers: No struggle required', 1337148), + LocationData('Royal towers', 'Royal Towers: Right tower freebie', 1337149), + LocationData('Royal towers (upper)', 'Royal Towers: Left tower small balcony', 1337150), + LocationData('Royal towers (upper)', 'Royal Towers: Left tower royal guard', 1337151), + LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana', 1337152), + LocationData('Royal towers (upper)', 'Killed Aelana', EventId), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s attic', 1337153, logic.has_upwarddash), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s chest', 1337154), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s pedestal', 1337155), # Ancient pyramid locations - 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 (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 (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 (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))) ] # 1337156 - 1337170 Downloads if not options or options.downloadable_items: location_table += ( - LocationData('Library', 'Library: Terminal 2 (Lachiem)', 1337156, lambda state: state.has('Tablet', player)), - LocationData('Library', 'Library: Terminal 1 (Windaria)', 1337157, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: Terminal 2 (Lachiem)', 1337156, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: Terminal 1 (Windaria)', 1337157, lambda state: state.has('Tablet', player)), # 1337158 Is lost in time - LocationData('Library', 'Library: Terminal 3 (Emperor Nuvius)', 1337159, lambda state: state.has('Tablet', player)), - LocationData('Library', 'Library: V terminal 1 (War of the Sisters)', 1337160, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library', 'Library: V terminal 2 (Lake Desolation Map)', 1337161, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library', 'Library: V terminal 3 (Vilete)', 1337162, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library top', 'Library: Backer room terminal (Vandagray Metropolis Map)', 1337163, lambda state: state.has('Tablet', player)), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Medbay terminal (Bleakness Research)', 1337164, lambda state: state.has('Tablet', player) and logic.has_keycard_B(state)), - LocationData('The lab (upper)', 'Lab: Download and chest room terminal (Experiment #13)', 1337165, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))), - LocationData('The lab (power off)', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), - LocationData('The lab', 'Lab: Experiment 13 terminal (W.R.E.C Farewell)', 1337168, lambda state: state.has('Tablet', player)), - LocationData('The lab', 'Lab: Left terminal (Biotechnology)', 1337169, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))) + LocationData('Library', 'Library: Terminal 3 (Emperor Nuvius)', 1337159, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: V terminal 1 (War of the Sisters)', 1337160, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library', 'Library: V terminal 2 (Lake Desolation Map)', 1337161, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library', 'Library: V terminal 3 (Vilete)', 1337162, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library top', 'Library: Backer room terminal (Vandagray Metropolis Map)', 1337163, lambda state: state.has('Tablet', player)), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Medbay terminal (Bleakness Research)', 1337164, lambda state: state.has('Tablet', player) and logic.has_keycard_B(state)), + LocationData('The lab (upper)', 'Lab: Download and chest room terminal (Experiment #13)', 1337165, lambda state: state.has('Tablet', player)), + LocationData('Lab Research', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player)), + LocationData('Main Lab', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + LocationData('Main Lab', 'Lab: Experiment 13 terminal (W.R.E.C Farewell)', 1337168, lambda state: state.has('Tablet', player)), + LocationData('Main Lab', 'Lab: Left terminal (Biotechnology)', 1337169, lambda state: state.has('Tablet', player)), + LocationData('Lab Research', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player)) ) # 1337176 - 1337176 Cantoran if not options or options.cantoran: location_table += ( - LocationData('Left Side forest Caves', 'Lake Serene: Cantoran', 1337176), + LocationData('Left Side forest Caves', 'Lake Serene: Cantoran', 1337176), ) # 1337177 - 1337198 Lore Checks if not options or options.lore_checks: location_table += ( - LocationData('Lower lake desolation', 'Lake Desolation: Memory - Coyote Jump (Time Messenger)', 1337177), - LocationData('Library', 'Library: Memory - Waterway (A Message)', 1337178), - LocationData('Library top', 'Library: Memory - Library Gap (Lachiemi Sun)', 1337179), - LocationData('Library top', 'Library: Memory - Mr. Hat Portrait (Moonlit Night)', 1337180), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Memory - Elevator (Nomads)', 1337181, lambda state: state.has('Elevator Keycard', player)), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers: Memory - Siren Elevator (Childhood)', 1337182, logic.has_keycard_B), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Memory - Bottom (Faron)', 1337183), - LocationData('Military Fortress', 'Military Fortress: Memory - Bomber Climb (A Solution)', 1337184, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), - LocationData('The lab', 'Lab: Memory - Genza\'s Secret Stash 1 (An Old Friend)', 1337185, logic.can_break_walls), - LocationData('The lab', 'Lab: Memory - Genza\'s Secret Stash 2 (Twilight Dinner)', 1337186, logic.can_break_walls), - LocationData('Emperors tower', 'Emperor\'s Tower: Memory - Way Up There (Final Circle)', 1337187, logic.has_doublejump_of_npc), - LocationData('Forest', 'Forest: Journal - Rats (Lachiem Expedition)', 1337188), - LocationData('Forest', 'Forest: Journal - Bat Jump Ledge (Peace Treaty)', 1337189, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Forest', 'Forest: Journal - Floating in Moat (Prime Edicts)', 1337190, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), - LocationData('Castle Ramparts', 'Castle Ramparts: Journal - Archer + Knight (Declaration of Independence)', 1337191), - LocationData('Castle Keep', 'Castle Keep: Journal - Under the Twins (Letter of Reference)', 1337192), - LocationData('Castle Basement', 'Castle Basement: Journal - Castle Loop Giantess (Political Advice)', 1337193), - LocationData('Royal towers (lower)', 'Royal Towers: Journal - Aelana\'s Room (Diplomatic Missive)', 1337194, logic.has_pink), - LocationData('Royal towers (upper)', 'Royal Towers: Journal - Top Struggle Juggle Base (War of the Sisters)', 1337195), - LocationData('Royal towers (upper)', 'Royal Towers: Journal - Aelana Boss (Stained Letter)', 1337196), - LocationData('Royal towers', 'Royal Towers: Journal - Near Bottom Struggle Juggle (Mission Findings)', 1337197, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Journal - Lower Left Caves (Naivety)', 1337198) + LocationData('Lower lake desolation', 'Lake Desolation: Memory - Coyote Jump (Time Messenger)', 1337177), + LocationData('Library', 'Library: Memory - Waterway (A Message)', 1337178), + LocationData('Library top', 'Library: Memory - Library Gap (Lachiemi Sun)', 1337179), + LocationData('Library top', 'Library: Memory - Mr. Hat Portrait (Moonlit Night)', 1337180), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Memory - Elevator (Nomads)', 1337181, lambda state: state.has('Elevator Keycard', player)), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers: Memory - Siren Elevator (Childhood)', 1337182, logic.has_keycard_B), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Memory - Bottom (Faron)', 1337183), + LocationData('Military Fortress', 'Military Fortress: Memory - Bomber Climb (A Solution)', 1337184, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), + LocationData('Main Lab', 'Lab: Memory - Genza\'s Secret Stash 1 (An Old Friend)', 1337185, logic.can_break_walls), + LocationData('Main Lab', 'Lab: Memory - Genza\'s Secret Stash 2 (Twilight Dinner)', 1337186, logic.can_break_walls), + LocationData('Emperors tower', 'Emperor\'s Tower: Memory - Way Up There (Final Circle)', 1337187, logic.has_doublejump_of_npc), + LocationData('Forest', 'Forest: Journal - Rats (Lachiem Expedition)', 1337188), + LocationData('Forest', 'Forest: Journal - Bat Jump Ledge (Peace Treaty)', 1337189, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Forest', 'Forest: Journal - Floating in Moat (Prime Edicts)', 1337190, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), + LocationData('Castle Ramparts', 'Castle Ramparts: Journal - Archer + Knight (Declaration of Independence)', 1337191), + LocationData('Castle Keep', 'Castle Keep: Journal - Under the Twins (Letter of Reference)', 1337192), + LocationData('Castle Basement', 'Castle Basement: Journal - Castle Loop Giantess (Political Advice)', 1337193), + LocationData('Royal towers (lower)', 'Royal Towers: Journal - Aelana\'s Room (Diplomatic Missive)', 1337194, logic.has_pink), + LocationData('Royal towers (upper)', 'Royal Towers: Journal - Top Struggle Juggle Base (War of the Sisters)', 1337195), + LocationData('Royal towers (upper)', 'Royal Towers: Journal - Aelana Boss (Stained Letter)', 1337196), + LocationData('Royal towers', 'Royal Towers: Journal - Near Bottom Struggle Juggle (Mission Findings)', 1337197, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Journal - Lower Left Caves (Naivety)', 1337198) ) # 1337199 - 1337232 Reserved for future use @@ -259,9 +261,9 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337233 - 1337235 Pyramid Start checks if not options or options.pyramid_start: location_table += ( - LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy', 1337233), - LocationData('Ancient Pyramid (entrance)', 'Temporal Gyre: Forest Entrance', 1337234, lambda state: logic.has_upwarddash(state) or logic.can_teleport_to(state, "Time", "GateGyre")), - LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble', 1337235), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy', 1337233), + LocationData('Ancient Pyramid (entrance)', 'Temporal Gyre: Forest Entrance', 1337234, lambda state: logic.has_upwarddash(state) or logic.can_teleport_to(state, "Time", "GateGyre")), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble', 1337235), ) # 1337236 Nightmare door @@ -269,15 +271,581 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337237 - 1337245 GyreArchives if not options or options.gyre_archives: location_table += ( - LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (pedestal)', 1337237), - LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (pedestal)', 1337238), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 1', 1337239), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 2', 1337240), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 3', 1337241), - LocationData('Ravenlord\'s Lair', 'Ravenlord: Pre fight', 1337242), - LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (chest)', 1337243), - LocationData('Ifrit\'s Lair', 'Ifrit: Pre fight', 1337244), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (pedestal)', 1337237), + LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (pedestal)', 1337238), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 1', 1337239), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 2', 1337240), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 3', 1337241), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Pre fight', 1337242), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (chest)', 1337243), + LocationData('Ifrit\'s Lair', 'Ifrit: Pre fight', 1337244), LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (chest)', 1337245), ) + + # 1337250 - 1337781 Torch checks + if not options or options.pure_torcher: + location_table += ( + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not So Secret Lantern', 1337250, lambda state: logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Middle Room Lantern 1', 1337256, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Middle Room Lantern 2', 1337257, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Timespinner Wheel Lantern 1', 1337258, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Timespinner Wheel Lantern 2', 1337259, logic.can_break_lanterns), + + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Left Room Lantern 1', 1337251, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Left Room Lantern 2', 1337252, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen Recovery Lantern', 1337253, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Right Room Lantern 1', 1337254, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump Cave Lantern', 1337255, logic.can_break_lanterns), + + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 1', 1337773, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 2', 1337774, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 3', 1337775, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 4', 1337776, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 5', 1337777, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 6', 1337778, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 7', 1337779, logic.can_break_lanterns), + + LocationData('Library', 'Library: Sewer Entrance Lantern', 1337489, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Sewer Lantern 1', 1337422, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Sewer Lantern 2', 1337423, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 1', 1337424, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 2', 1337425, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 3', 1337426, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 4', 1337427, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 5', 1337428, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 6', 1337429, logic.can_break_lanterns), + LocationData('Library', 'Library: Sewer Exit Lantern 1', 1337492, logic.can_break_lanterns), + LocationData('Library', 'Library: Sewer Exit Lantern 2', 1337493, logic.can_break_lanterns), + LocationData('Library', 'Library: Basement Lantern', 1337494, logic.can_break_lanterns), + LocationData('Library', 'Library: Exit Lantern', 1337450, logic.can_break_lanterns), + LocationData('Library', 'Library: Librarian Lantern 1', 1337463, logic.can_break_lanterns), + LocationData('Library', 'Library: Librarian Lantern 2', 1337464, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 1', 1337465, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 2', 1337466, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 3', 1337467, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 4', 1337468, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 1', 1337471, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 2', 1337472, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 3', 1337473, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 4', 1337474, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 5', 1337475, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 6', 1337476, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 7', 1337477, logic.can_break_lanterns), + LocationData('Library', 'Library: Storage Room Lantern 1', 1337478, lambda state: logic.has_keycard_D(state) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: Storage Room Lantern 2', 1337479, lambda state: logic.has_keycard_D(state) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: Waterway Lantern 1', 1337480, logic.can_break_lanterns), + LocationData('Library', 'Library: Waterway Lantern 2', 1337481, logic.can_break_lanterns), + LocationData('Library', 'Library: V Room Lantern 1', 1337490, lambda state: state.has('Library Keycard V', player) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: V Room Lantern 2', 1337491, lambda state: state.has('Library Keycard V', player) and logic.can_break_lanterns(state)), + + LocationData('Library top', 'Library: Backer Room Lantern 1', 1337484, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 2', 1337485, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 3', 1337486, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 4', 1337487, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 5', 1337488, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 1', 1337459, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 2', 1337460, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 3', 1337461, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 4', 1337462, logic.can_break_lanterns), + LocationData('Library top', 'Library: Mr. Hat Lantern 1', 1337482, logic.can_break_lanterns), + LocationData('Library top', 'Library: Mr. Hat Lantern 2', 1337483, logic.can_break_lanterns), + + LocationData('Varndagroth tower left', 'Library: Moving Sidewalk Lantern 1', 1337430, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Library: Moving Sidewalk Lantern 2', 1337431, logic.can_break_lanterns), + + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Entrance Lantern', 1337434, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom Floor Lantern', 1337451, lambda state: logic.has_keycard_C(state) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Elevator Lantern 1', 1337452, lambda state: state.has('Elevator Keycard', player) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Elevator Lantern 2', 1337453, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Base Lantern 1', 1337469, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Base Lantern 2', 1337470, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Floor 2 Lantern 1', 1337432, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Floor 2 Lantern 2', 1337433, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Middle Lantern', 1337454, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Ladder Lantern 1', 1337455, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Ladder Lantern 2', 1337456, logic.can_break_lanterns), + + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge Entrance Lantern 1', 1337457, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge Entrance Lantern 2', 1337458, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Bridge Exit Lantern 1', 1337437, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Bridge Exit Lantern 2', 1337438, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Above Vents Lantern 1', 1337448, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Above Vents Lantern 2', 1337449, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 1', 1337445, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 2', 1337446, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 3', 1337447, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 1', 1337439, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 2', 1337440, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 3', 1337441, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 4', 1337442, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 5', 1337443, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 6', 1337444, logic.can_break_lanterns), + + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Right Stairs Lantern 1', 1337435, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Right Stairs Lantern 2', 1337436, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Base Lantern 1', 1337495, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Base Lantern 2', 1337496, logic.can_break_lanterns), + + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 1', 1337721, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 2', 1337722, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 3', 1337723, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 4', 1337724, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern 1', 1337741, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern 2', 1337742, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern ', 1337743, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Condemned Shaft Lantern 1', 1337744, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Condemned Shaft Lantern 2', 1337745, logic.can_break_lanterns), + + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 1', 1337718, logic.can_break_lanterns), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 2', 1337719, logic.can_break_lanterns), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 3', 1337720, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 1', 1337712, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 2', 1337713, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 3', 1337714, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 4', 1337715, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 5', 1337716, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 6', 1337717, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 1', 1337746, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 2', 1337747, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 3', 1337748, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 4', 1337749, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 1', 1337750, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 2', 1337751, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 3', 1337752, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 4', 1337753, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 5', 1337754, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 1', 1337738, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 2', 1337739, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 3', 1337740, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 4', 1337781, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Start Lantern 1', 1337761, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Start Lantern 2', 1337762, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 1', 1337769, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 2', 1337770, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 3', 1337771, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 4', 1337772, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Mini Jackpot Ledge Lantern', 1337733, lambda state: logic.has_forwarddash_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 1', 1337731, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 2', 1337732, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 3', 1337734, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 4', 1337735, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 5', 1337736, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Post-Fork Room Lantern 1', 1337763, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Post-Fork Room Lantern 2', 1337764, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 1', 1337755, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 2', 1337756, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 3', 1337757, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 4', 1337758, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 5', 1337759, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 6', 1337760, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 1', 1337725, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 2', 1337726, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 3', 1337727, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 4', 1337728, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 5', 1337729, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 6', 1337730, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 1', 1337765, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 2', 1337766, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 3', 1337767, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 4', 1337768, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + + LocationData('Forest', 'Forest: Rats Lantern', 1337498, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 1', 1337499, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 2', 1337500, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 3', 1337501, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Batcave Lantern', 1337502, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Lantern Before Broken Bridge', 1337503, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Lantern Past Signpost', 1337497, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Lantern After Broken Bridge', 1337504, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Left Caves Lantern', 1337505, logic.can_break_lanterns), + + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess Lantern 1', 1337507, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess Lantern 2', 1337508, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Archer + Knight Lantern 1', 1337509, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Archer + Knight Lantern 2', 1337510, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Lantern', 1337513, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Big Boulder Room Lantern 1', 1337514, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Big Boulder Room Lantern 2', 1337515, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 1', 1337516, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 2', 1337517, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 3', 1337518, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 1', 1337519, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 2', 1337520, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 3', 1337521, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 1', 1337522, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 2', 1337523, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 3', 1337524, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 4', 1337525, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 1', 1337526, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 2', 1337527, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 3', 1337528, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 1', 1337529, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 2', 1337530, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 3', 1337531, logic.can_break_lanterns), + + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 1', 1337536, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 2', 1337537, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 3', 1337538, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Lantern 1', 1337539, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Lantern 2', 1337540, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Climb Lantern 1', 1337541, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Climb Lantern 2', 1337542, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: First Bird Hall Lantern 1', 1337543, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: First Bird Hall Lantern 2', 1337544, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Single Bird Lantern 1', 1337567, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Single Bird Lantern 2', 1337568, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Second Bird Hall Lantern 1', 1337569, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Second Bird Hall Lantern 2', 1337570, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Center Shaft Lantern 1', 1337579, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Center Shaft Lantern 2', 1337580, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Giantess Lantern 1', 1337581, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Giantess Lantern 2', 1337582, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Foyer Low Left Lantern', 1337563, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Foyer Low Right Lantern', 1337560, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer Mid Left Lantern', 1337562, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer Mid Right Lantern', 1337561, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer High Left Lantern', 1337564, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer High Right Lantern', 1337565, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 1', 1337532, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 2', 1337533, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 3', 1337534, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 4', 1337535, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Double-Jump Lantern', 1337545, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Lower Lantern 1', 1337546, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Lower Lantern 2', 1337547, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 1', 1337548, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 2', 1337549, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 3', 1337550, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 4', 1337551, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 1', 1337552, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 2', 1337553, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 3', 1337554, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 4', 1337555, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Tiny Royal Guard Room Lantern 1', 1337556, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump(state) or logic.has_fastjump_on_npc(state))), + LocationData('Castle Keep', 'Castle Keep: Tiny Royal Guard Room Lantern 2', 1337557, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump(state) or logic.has_fastjump_on_npc(state))), + LocationData('Castle Keep', 'Castle Keep: Royal Tower Entrance Lantern 1', 1337558, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Royal Tower Entrance Lantern 2', 1337559, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Below Royal Room Lantern', 1337566, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 1', 1337571, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 2', 1337572, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 3', 1337573, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 4', 1337574, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Door Lantern 1', 1337575, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Door Lantern 2', 1337576, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Lantern 1', 1337577, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Lantern 2', 1337578, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 1', 1337583, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 2', 1337584, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 3', 1337585, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Stairwell Lantern 1', 1337586, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Stairwell Lantern 2', 1337587, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 1', 1337588, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 2', 1337589, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 3', 1337590, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 4', 1337591, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 5', 1337592, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Base Lantern 1', 1337593, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Base Lantern 2', 1337594, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Before Bottom Struggle Lantern 1', 1337605, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Before Bottom Struggle Lantern 2', 1337606, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Past Bottom Struggle Lantern 1', 1337607, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Past Bottom Struggle Lantern 2', 1337608, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 1', 1337780, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 2', 1337511, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 3', 1337512, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana Lantern 1', 1337595, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 1', 1337596, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 2', 1337597, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 3', 1337598, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Lantern Above Time-Stop Demon', 1337599, logic.can_break_lanterns), + LocationData('Royal towers (lower)', 'Royal Towers: Lantern Below Time-Stop Demon', 1337600, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Tower Base Lantern 1', 1337601, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Tower Base Lantern 2', 1337602, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Royal Guard Lantern 1', 1337603, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Royal Guard Lantern 2', 1337604, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Pre-Climb Lantern 1', 1337609, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Pre-Climb Lantern 2', 1337610, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Lantern', 1337611, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Final Climb Lantern 1', 1337612, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Final Climb Lantern 2', 1337613, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 1', 1337614, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 2', 1337615, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 3', 1337616, logic.can_break_lanterns), + + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 1', 1337674, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 2', 1337675, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 3', 1337676, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 1', 1337700, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 2', 1337701, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 3', 1337702, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 4', 1337703, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 1', 1337654, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 2', 1337655, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 3', 1337656, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 4', 1337657, logic.can_break_lanterns), + + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 1', 1337650, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 2', 1337651, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 3', 1337652, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 4', 1337653, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 1', 1337643, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 2', 1337644, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 3', 1337645, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 4', 1337646, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 5', 1337647, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 6', 1337648, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 1', 1337682, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 2', 1337683, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 3', 1337684, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 4', 1337685, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 1', 1337670, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 2', 1337671, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 3', 1337672, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 4', 1337673, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 1', 1337686, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 2', 1337687, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 3', 1337688, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 4', 1337689, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 5', 1337690, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 1', 1337708, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 2', 1337709, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 3', 1337710, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 4', 1337711, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 1', 1337658, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 2', 1337659, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 3', 1337660, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 4', 1337661, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 5', 1337662, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 6', 1337663, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Jackpot Ledge Lantern', 1337666, lambda state: logic.has_forwarddash_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 1', 1337664, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 2', 1337665, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 3', 1337667, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 4', 1337668, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 5', 1337669, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 1', 1337691, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 2', 1337692, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 3', 1337693, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 4', 1337694, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 5', 1337695, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 6', 1337737, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Start Lantern 1', 1337696, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Start Lantern 2', 1337697, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Post-Fork Room Lantern 1', 1337698, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Post-Fork Room Lantern 2', 1337699, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 1', 1337704, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 2', 1337705, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 3', 1337706, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 4', 1337707, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 1', 1337677, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 2', 1337678, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 3', 1337679, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 4', 1337680, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 5', 1337681, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Intro Room Lantern', 1337617, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Middle Cave Lantern', 1337621, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 1', 1337622, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 2', 1337623, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 3', 1337624, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 4', 1337625, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Past First Vine Lantern', 1337626, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Past Cantoran Lantern', 1337634, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Dry Lantern', 1337631, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Wet Lantern 1', 1337632, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Wet Lantern 2', 1337633, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Above The Eels Lantern 1', 1337638, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Above The Eels Lantern 2', 1337639, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 1', 1337640, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 2', 1337641, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 3', 1337642, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 4', 1337649, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the Eels Lantern', 1337630, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 1', 1337618, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 2', 1337619, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 3', 1337620, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 1', 1337635, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 2', 1337636, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 3', 1337637, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 1', 1337627, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 2', 1337628, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 3', 1337629, logic.can_break_lanterns), + + LocationData('Military Fortress', 'Military Fortress: Entrance Lantern 1', 1337260, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Entrance Lantern 2', 1337261, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Bombing Room Lower Lantern 1', 1337264, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Bombing Room Lower Lantern 2', 1337266, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Bombing Room Upper Lantern 1', 1337263, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Bombing Room Upper Lantern 2', 1337265, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 1', 1337267, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 2', 1337268, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 3', 1337269, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Middle Room Lantern 1', 1337270, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Middle Room Lantern 2', 1337271, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 1', 1337274, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 2', 1337275, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 3', 1337276, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Spike Room Lantern 1', 1337262, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Spike Room Lantern 2', 1337272, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal Lantern', 1337273, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state)))), + + LocationData('Lab Entrance', 'Lab: Intro Hallway Lantern 1', 1337294, logic.can_break_lanterns), + LocationData('Lab Entrance', 'Lab: Intro Hallway Lantern 2', 1337782, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 1', 1337305, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 2', 1337306, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 3', 1337307, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Entrance Lantern 1', 1337277, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Entrance Lantern 2', 1337278, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 1', 1337297, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 2', 1337298, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 3', 1337299, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 4', 1337300, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 5', 1337301, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 6', 1337302, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 7', 1337303, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 8', 1337304, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Stairs Lantern 1', 1337281, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Stairs Lantern 2', 1337506, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Exp. 13 Terminal Lantern 1', 1337295, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Exp. 13 Terminal Lantern 2', 1337296, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Left Terminal Lantern 1', 1337308, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Left Terminal Lantern 2', 1337309, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Jump Lantern 1', 1337282, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Main Lab', 'Lab: Trash Jump Lantern 2', 1337283, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Lab Research', 'Lab: Spider Hell Entrance Lantern 1', 1337290, logic.can_break_lanterns), + LocationData('Lab Research', 'Lab: Spider Hell Entrance Lantern 2', 1337291, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Lantern 1', 1337292, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Main Lab', 'Lab: Lower Trash Lantern 2', 1337293, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('The lab (upper)', 'Lab: File Cabinet Lantern 1', 1337310, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Lantern 2', 1337311, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 1', 1337286, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 2', 1337287, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 3', 1337288, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 4', 1337289, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Genza Door Lantern 1', 1337284, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Genza Door Lantern 2', 1337285, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Download and Chest Lantern 1', 1337312, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Download and Chest Lantern 2', 1337313, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Sentry Lantern 1', 1337279, lambda state: logic.can_break_lanterns(state) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + LocationData('Main Lab', 'Lab: Sentry Lantern 2', 1337280, lambda state: logic.can_break_lanterns(state) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Lantern 1', 1337314, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Lantern 2', 1337316, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Staircase Lantern', 1337315, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Bottom Lantern 1', 1337342, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Bottom Lantern 2', 1337343, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Floor Secret Lantern 1', 1337336, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Floor Secret Lantern 2', 1337337, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Giantess Lantern 1', 1337331, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Giantess Lantern 2', 1337332, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Upper Lantern', 1337333, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 1', 1337317, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 2', 1337318, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 3', 1337319, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 4', 1337320, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Room Lantern 1', 1337321, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Room Lantern 2', 1337322, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Outside Way Up There Lantern 1', 1337323, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Outside Way Up There Lantern 2', 1337324, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Way Up There Lantern 1', 1337325, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Way Up There Lantern 2', 1337326, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Tower Lantern 1', 1337327, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Tower Lantern 2', 1337328, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic Sage Lantern 1', 1337329, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic Sage Lantern 2', 1337330, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Save Room Lantern 1', 1337334, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Save Room Lantern 2', 1337335, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 1', 1337338, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 2', 1337339, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 3', 1337340, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 4', 1337341, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 1', 1337344, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 2', 1337345, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 3', 1337346, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 4', 1337347, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 5', 1337348, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Upper Left Tower Lantern 1', 1337349, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Upper Left Tower Lantern 2', 1337350, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Right Tower Lantern 1', 1337351, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Right Tower Lantern 2', 1337352, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 1', 1337369, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 2', 1337370, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 3', 1337371, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 4', 1337372, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 5', 1337373, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 6', 1337374, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy Lantern 1', 1337375, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy Lantern 2', 1337376, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Lantern 1', 1337377, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Lantern 2', 1337378, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 1', 1337399, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 2', 1337400, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 3', 1337401, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Climb Lantern 1', 1337393, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Climb Lantern 2', 1337394, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Why Not It\'s Right There Lantern', 1337386, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: First Enemy Lantern 1', 1337387, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: First Enemy Lantern 2', 1337388, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 1', 1337381, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 2', 1337382, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 3', 1337383, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Shaft Lantern 1', 1337402, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Shaft Lantern 2', 1337403, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 1', 1337389, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 2', 1337390, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 3', 1337391, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 4', 1337392, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 1', 1337395, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 2', 1337396, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 3', 1337397, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 4', 1337398, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Lantern 1', 1337404, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Lantern 2', 1337405, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret\'s Secret Lantern 1', 1337406, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret\'s Secret Lantern 2', 1337407, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Outside Inner Warp Lantern 1', 1337408, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Outside Inner Warp Lantern 2', 1337409, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Nightmare Stairway Entrance Lantern', 1337410, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction Lantern 1', 1337411, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction Lantern 2', 1337412, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: A Long Fall Lantern 1', 1337415, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: A Long Fall Lantern 2', 1337416, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Last Chance Before Shaft Lantern 1', 1337417, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Last Chance Before Shaft Lantern 2', 1337418, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Wall Lantern', 1337419, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Post-Shaft Hallway Lantern 1', 1337420, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Post-Shaft Hallway Lantern 2', 1337421, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Upper-Right Stairway Lantern 1', 1337384, logic.can_break_lanterns), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Upper-Right Stairway Lantern 2', 1337385, logic.can_break_lanterns), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Stairway Lantern 1', 1337379, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Stairway Lantern 2"', 1337380, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door Lantern 1', 1337413, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door Lantern 2', 1337414, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + ) + if not options or options.gyre_archives: + location_table += ( + LocationData('Temporal Gyre', 'Temporal Gyre: Room 1 Lantern 1', 1337353, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 1 Lantern 2', 1337354, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 2 Lantern 1', 1337355, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 2 Lantern 2', 1337356, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 3 Lantern 1', 1337357, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 3 Lantern 2', 1337358, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 4 Lantern 1', 1337359, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 4 Lantern 2', 1337360, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 5 Lantern 1', 1337361, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 5 Lantern 2', 1337362, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 6 Lantern 1', 1337363, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 6 Lantern 2', 1337364, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 7 Lantern 1', 1337365, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 7 Lantern 2', 1337366, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 8 Lantern 1', 1337367, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 8 Lantern 2', 1337368, logic.can_break_lanterns), + ) return location_table diff --git a/worlds/timespinner/LogicExtensions.py b/worlds/timespinner/LogicExtensions.py index 878b69ae..a977b8a0 100644 --- a/worlds/timespinner/LogicExtensions.py +++ b/worlds/timespinner/LogicExtensions.py @@ -24,6 +24,7 @@ class TimespinnerLogic: self.flag_eye_spy = bool(options and options.eye_spy) self.flag_unchained_keys = bool(options and options.unchained_keys) self.flag_prism_break = bool(options and options.prism_break) + self.flag_find_the_flame = bool(options and options.find_the_flame) if precalculated_weights: if self.flag_unchained_keys: @@ -93,6 +94,12 @@ class TimespinnerLogic: else: return True + def can_break_lanterns(self, state: CollectionState) -> bool: + if self.flag_find_the_flame: + return state.has('Cube of Bodie', self.player) + else: + return True + def can_kill_all_3_bosses(self, state: CollectionState) -> bool: if self.flag_prism_break: return state.has_all({'Laser Access M', 'Laser Access I', 'Laser Access A'}, self.player) diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 0b735ea3..35d9d630 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -367,8 +367,8 @@ class TrapChance(Range): class Traps(OptionList): """List of traps that may be in the item pool to find""" display_name = "Traps Types" - valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap" } - default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap" ] + valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap", "Lights Out Trap", "Palm Punch Trap" } + default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap", "Lights Out Trap", "Palm Punch Trap" ] class PresentAccessWithWheelAndSpindle(Toggle): """When inverted, allows using the refugee camp warp when both the Timespinner Wheel and Spindle is acquired.""" @@ -399,6 +399,14 @@ class RoyalRoadblock(Toggle): """The Royal Towers entrance door requires a royal orb (Plasma Orb, Plasma Geyser, or Royal Ring) to enter.""" display_name = "Royal Roadblock" +class PureTorcher(Toggle): + """All lanterns contain checks. (Except tutorial)""" + display_name = "Pure Torcher" + +class FindTheFlame(Toggle): + """Lanterns in 'Pure Torcher' will not break without new item 'Cube of Bodie'.""" + display_name = "Find the Flame" + @dataclass class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): start_with_jewelry_box: StartWithJewelryBox @@ -441,6 +449,8 @@ class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): pyramid_start: PyramidStart gate_keep: GateKeep royal_roadblock: RoyalRoadblock + pure_torcher: PureTorcher + find_the_flame: FindTheFlame trap_chance: TrapChance traps: Traps diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index b9b1d104..9580eb14 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -28,9 +28,11 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp create_region(world, player, locations_per_region, 'Sealed Caves (Sirens)'), create_region(world, player, locations_per_region, 'Military Fortress'), create_region(world, player, locations_per_region, 'Military Fortress (hangar)'), - create_region(world, player, locations_per_region, 'The lab'), - create_region(world, player, locations_per_region, 'The lab (power off)'), + create_region(world, player, locations_per_region, 'Lab Entrance'), + create_region(world, player, locations_per_region, 'Main Lab'), + create_region(world, player, locations_per_region, 'Lab Research'), create_region(world, player, locations_per_region, 'The lab (upper)'), + create_region(world, player, locations_per_region, 'Emperors tower (courtyard)'), 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 (Xarion)'), @@ -41,6 +43,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp create_region(world, player, locations_per_region, 'Lower Lake Serene'), create_region(world, player, locations_per_region, 'Caves of Banishment (upper)'), create_region(world, player, locations_per_region, 'Caves of Banishment (Maw)'), + create_region(world, player, locations_per_region, 'Caves of Banishment (Flooded)'), create_region(world, player, locations_per_region, 'Caves of Banishment (Sirens)'), create_region(world, player, locations_per_region, 'Castle Ramparts'), create_region(world, player, locations_per_region, 'Castle Keep'), @@ -109,16 +112,19 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Military Fortress', 'Temporal Gyre', lambda state: state.has('Timespinner Wheel', player) and logic.can_kill_all_3_bosses(state)) connect(world, player, 'Military Fortress', 'Military Fortress (hangar)', logic.has_doublejump) connect(world, player, 'Military Fortress (hangar)', 'Military Fortress') - connect(world, player, 'Military Fortress (hangar)', 'The lab', lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))) + connect(world, player, 'Military Fortress (hangar)', 'Lab Entrance', lambda state: state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state)) + connect(world, player, 'Lab Entrance', 'Main Lab', lambda state: logic.has_keycard_B(state)) + connect(world, player, 'Main Lab', 'Lab Entrance') + connect(world, player, 'Lab Entrance', 'Military Fortress (hangar)') connect(world, player, 'Temporal Gyre', 'Military Fortress') - connect(world, player, 'The lab', 'Military Fortress') - connect(world, player, 'The lab', 'The lab (power off)', lambda state: options.lock_key_amadeus or logic.has_doublejump_of_npc(state)) - connect(world, player, 'The lab (power off)', 'The lab', lambda state: not flooded.flood_lab or state.has('Water Mask', player)) - connect(world, player, 'The lab (power off)', 'The lab (upper)', lambda state: logic.has_forwarddash_doublejump(state) and ((not options.lock_key_amadeus) or state.has('Lab Access Genza', player))) - connect(world, player, 'The lab (upper)', 'The lab (power off)', lambda state: options.lock_key_amadeus and state.has('Lab Access Genza', player)) - connect(world, player, 'The lab (upper)', 'Emperors tower', logic.has_forwarddash_doublejump) + connect(world, player, 'Main Lab', 'Lab Research', lambda state: state.has('Lab Access Research', player) if options.lock_key_amadeus else logic.has_doublejump_of_npc(state)) + connect(world, player, 'Main Lab', 'The lab (upper)', lambda state: logic.has_forwarddash_doublejump(state) and ((not options.lock_key_amadeus) or state.has('Lab Access Genza', player))) + connect(world, player, 'The lab (upper)', 'Main Lab', lambda state: options.lock_key_amadeus and state.has('Lab Access Genza', player)) + connect(world, player, 'The lab (upper)', 'Emperors tower (courtyard)', 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, 'Emperors tower (courtyard)', 'The lab (upper)') + connect(world, player, 'Emperors tower (courtyard)', 'Emperors tower', logic.has_doublejump) + connect(world, player, 'Emperors tower', 'Emperors tower (courtyard)') connect(world, player, 'Skeleton Shaft', 'Lake desolation') connect(world, player, 'Skeleton Shaft', 'Sealed Caves (Xarion)', logic.has_keycard_A) connect(world, player, 'Skeleton Shaft', 'Space time continuum', logic.has_teleport) @@ -145,6 +151,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp 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)) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (Sirens)', lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) ) + connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (Flooded)', lambda state: flooded.flood_maw or state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (Maw)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Caves of Banishment (Sirens)', 'Forest') connect(world, player, 'Castle Ramparts', 'Forest') diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 77314d40..0bd9c7d1 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -132,6 +132,8 @@ class TimespinnerWorld(World): "PyramidStart": self.options.pyramid_start.value, "GateKeep": self.options.gate_keep.value, "RoyalRoadblock": self.options.royal_roadblock.value, + "PureTorcher": self.options.pure_torcher.value, + "FindTheFlame": self.options.find_the_flame.value, "Traps": self.options.traps.value, "DeathLink": self.options.death_link.value, "StinkyMaw": True, @@ -298,7 +300,9 @@ class TimespinnerWorld(World): if not item.advancement: return item - if (name == 'Tablet' or name == 'Library Keycard V') and not self.options.downloadable_items: + if name == 'Tablet' and not self.options.downloadable_items: + item.classification = ItemClassification.filler + elif name == 'Library Keycard V' and not (self.options.downloadable_items or self.options.pure_torcher): item.classification = ItemClassification.filler elif name == 'Oculus Ring' and not self.options.eye_spy: item.classification = ItemClassification.filler @@ -315,6 +319,8 @@ class TimespinnerWorld(World): item.classification = ItemClassification.filler elif name == "Drawbridge Key" and not self.options.gate_keep: item.classification = ItemClassification.filler + elif name == "Cube of Bodie" and not self.options.find_the_flame: + item.classification = ItemClassification.filler return item @@ -361,6 +367,9 @@ class TimespinnerWorld(World): if not self.options.gate_keep: excluded_items.add('Drawbridge Key') + if not self.options.find_the_flame: + excluded_items.add('Cube of Bodie') + for item in self.multiworld.precollected_items[self.player]: if item.name not in self.item_name_groups['UseItem']: excluded_items.add(item.name) From 1322ce866eddb1ccf0ca042db93ceef8789d6029 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:49:32 -0500 Subject: [PATCH 070/204] Kingdom Hearts: Adding a bunch of new features (#5078) * Change vanilla_emblem_pieces to randomize_emblem_pieces * Add jungle slider and starting tools options * Update option name and add preset * GICU changes * unnecessary * Update Options.py * Fix has_all * Update Options.py * Update Options.py * Some potenitial logic changes * Oops * Oops 2 * Cups choice options * typos * Logic tweaks * Ice Titan and Superboss changes * Suggested change and one more * Updating some other option descriptions for clarity/typos * Update Locations.py * commit * SYNTHESIS * commit * commit * commit * Add command to change communication path I'm not a python programmer, so do excuse the code etiquette. This aims to allow Linux users to communicate to their proton directory. * commit * commit * commit * commit * commit * commit * commit * commit * Update Client.py * Update Locations.py * Update Regions.py * commit * commit * commit * Update Rules.py * commit * commit * commit * commit logic changes and linux fix from other branch * commit * commit * Update __init__.py * Update Rules.py * commit * commit * commit * commit * add starting accessory setting * fix starting accessories bug * Update Locations.py * commit * add ap cost rando * fix some problem locations * add raft materials * Update Client.py * OK WORK THIS TIME PLEASE * Corrected typos * setting up for logic difficulty * commit 1 * commit 2 * commit 3 * minor error fix * some logic changes and fixed some typos * tweaks * commit * SYNTHESIS * commit * commit * commit * commit * commit * commit * commit * commit * commit * commit * commit * Update Client.py * Update Locations.py * Update Regions.py * commit * commit * commit * Update Rules.py * commit * commit * commit * commit logic changes and linux fix from other branch * commit * commit * Update __init__.py * Update Rules.py * commit * commit * commit * commit * add starting accessory setting * fix starting accessories bug * Update Locations.py * commit * add ap cost rando * fix some problem locations * add raft materials * Update Client.py * cleanup * commit 4 * tweaks 2 * tweaks 3 * Reset * Update __init__.py * Change vanilla_emblem_pieces to randomize_emblem_pieces * Add jungle slider and starting tools options * unnecessary * Vanilla Puppies Part 1 The easy part * Update __init__.py I'm not certain this is the exact right chest for Tea Party Garden, Waterfall Cavern, HT Cemetery, or Neverland Hold but logically it's the same. Will do a test run later and fix if need be * Vanilla Puppies Part 3 Wrong toggle cause I just copied over Emblem Pieces oops * Vanilla Puppies Part 4 Forgor commented out code * Vanilla Puppies Part 5 I now realize how this works and that what I had before was redundant * Update __init__.py Learning much about strings * cleanup * Update __init__.py Only missed one! * Update option name and add preset * GICU changes * Update Options.py * Fix has_all * Update Options.py * Update Options.py * Cups choice options * typos * Ice Titan and Superboss changes * Some potenitial logic changes * Oops * Oops 2 * Logic tweaks * Suggested change and one more * Updating some other option descriptions for clarity/typos * Update Locations.py * Add command to change communication path I'm not a python programmer, so do excuse the code etiquette. This aims to allow Linux users to communicate to their proton directory. * Moving over changes from REVAMP * whoops * Fix patch files on the website * Update test_goal.py * commit * Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright * change some default options * Missed a condition * let's try that * Update Options.py * unnecessary sub check * Some more cleanup * tuples * add icon * merge cleanup * merge cleanup 2 * merge clean up 3 * Update Data.py * Fix cups option * commit * Update Rules.py * Update Rules.py * phantom tweak * review commit * minor fixes * review 2 * minor typo fix * minor logic tweak * Update Client.py * Update __init__.py * Update Rules.py * Olympus Cup fixes * Update Options.py * even MORE tweaks * commit * Update Options.py * Update has_x_worlds * Update Rules.py * commit * Update Options.py * Update Options.py * Update Options.py * tweak 5 * Add Stacking Key Items and Halloween Town Key Item Bundle * Update worlds/kh1/Rules.py Co-authored-by: Scipio Wright * Update Rules.py * commit * Update worlds/kh1/__init__.py Co-authored-by: Scipio Wright * Update __init__.py * Update __init__.py * whoops * Update Rules.py * Update Rules.py * Fix documentation styling * Clean up option help text * Reordering options so they're consistent and fixing a logic bug when EOTW Unlock is item but door is emblems * Make have x world logic consider if the player has HAW on or not * Fix Atlantica beginner logic things, vanilla keyblade stats being broken, and some behind boss locations * Fix vanilla puppy option * hotfix for crabclaw logic * Fix defaults and some boss locations * Fix server spam * Remove 3 High Jump Item Workshop Logic, small client changes * Updates for PR --------- Co-authored-by: esutley Co-authored-by: Goblin God <37878138+esutley@users.noreply.github.com> Co-authored-by: River Buizel <4911928+rocket0634@users.noreply.github.com> Co-authored-by: omnises Co-authored-by: Omnises Nihilis <38057571+Omnises@users.noreply.github.com> Co-authored-by: Scipio Wright --- worlds/kh1/Client.py | 184 ++- worlds/kh1/Data.py | 202 +++ worlds/kh1/GenerateJSON.py | 67 + worlds/kh1/Items.py | 827 ++++------ worlds/kh1/Locations.py | 1290 ++++++++------- worlds/kh1/Options.py | 758 +++++++-- worlds/kh1/Presets.py | 302 +++- worlds/kh1/Regions.py | 209 ++- worlds/kh1/Rules.py | 2262 ++++++++++++-------------- worlds/kh1/__init__.py | 545 +++++-- worlds/kh1/docs/en_Kingdom Hearts.md | 41 +- worlds/kh1/docs/kh1_en.md | 117 +- worlds/kh1/icons/kh1_heart.ico | Bin 0 -> 4286 bytes worlds/kh1/icons/kh1_heart.png | Bin 0 -> 7821 bytes worlds/kh1/test/test_goal.py | 14 +- 15 files changed, 4043 insertions(+), 2775 deletions(-) create mode 100644 worlds/kh1/Data.py create mode 100644 worlds/kh1/GenerateJSON.py create mode 100644 worlds/kh1/icons/kh1_heart.ico create mode 100644 worlds/kh1/icons/kh1_heart.png diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index b98f2153..9d3889d6 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -13,8 +13,6 @@ import ModuleUpdate ModuleUpdate.update() import Utils -death_link = False -item_num = 1 logger = logging.getLogger("Client") @@ -34,62 +32,57 @@ class KH1ClientCommandProcessor(ClientCommandProcessor): def __init__(self, ctx): super().__init__(ctx) + def _cmd_slot_data(self): + """Prints slot data settings for the connected seed""" + for key in self.ctx.slot_data.keys(): + if key not in ["remote_location_ids", "synthesis_item_name_byte_arrays"]: + self.output(str(key) + ": " + str(self.ctx.slot_data[key])) + def _cmd_deathlink(self): - """Toggles Deathlink""" - global death_link - if death_link: - death_link = False - self.output(f"Death Link turned off") - else: - death_link = True - self.output(f"Death Link turned on") - - def _cmd_goal(self): - """Prints goal setting""" - if "goal" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["goal"])) - else: - self.output("Unknown") - - def _cmd_eotw_unlock(self): - """Prints End of the World Unlock setting""" - if "required_reports_door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["required_reports_door"] > 13: - self.output("Item") + """If your Death Link setting is set to "Toggle", use this command to turn Death Link on and off.""" + if "death_link" in self.ctx.slot_data.keys(): + if self.ctx.slot_data["death_link"] == "toggle": + if self.ctx.death_link: + self.ctx.death_link = False + self.output(f"Death Link turned off") + else: + self.ctx.death_link = True + self.output(f"Death Link turned on") else: - self.output(str(self.ctx.slot_data["required_reports_eotw"]) + " reports") + self.output(f"'death_link' is not set to 'toggle' for this seed.") + self.output(f"'death_link' = " + str(self.ctx.slot_data["death_link"])) else: - self.output("Unknown") + self.output(f"No 'death_link' in slot_data keys. You probably aren't connected or are playing an older seed.") - def _cmd_door_unlock(self): - """Prints Final Rest Door Unlock setting""" - if "door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["door"] == "reports": - self.output(str(self.ctx.slot_data["required_reports_door"]) + " reports") - else: - self.output(str(self.ctx.slot_data["door"])) + def _cmd_communication_path(self): + """Opens a file browser to allow Linux users to manually set their %LOCALAPPDATA% path""" + directory = Utils.open_directory("Select %LOCALAPPDATA% dir", "~/.local/share/Steam/steamapps/compatdata/2552430/pfx/drive_c/users/steamuser/AppData/Local") + if directory: + directory += "/KH1FM" + if not os.path.exists(directory): + os.makedirs(directory) + self.ctx.game_communication_path = directory else: - self.output("Unknown") - - def _cmd_advanced_logic(self): - """Prints advanced logic setting""" - if "advanced_logic" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["advanced_logic"])) - else: - self.output("Unknown") + self.output(self.ctx.game_communication_path) class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" - items_handling = 0b111 # full remote + items_handling = 0b011 # full remote except start inventory def __init__(self, server_address, password): super(KH1Context, self).__init__(server_address, password) self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False - self.hinted_synth_location_ids = False - self.slot_data = {} + self.hinted_location_ids: list[int] = [] + self.slot_data: dict = {} + + # Moved globals into instance attributes + self.death_link: bool = False + self.item_num: int = 1 + self.remote_location_ids: list[int] = [] + # self.game_communication_path: files go in this path to pass data between us and the actual game if "localappdata" in os.environ: self.game_communication_path = os.path.expandvars(r"%localappdata%/KH1FM") @@ -103,6 +96,10 @@ class KH1Context(CommonContext): os.remove(root+"/"+file) async def server_auth(self, password_requested: bool = False): + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root+"/"+file) if password_requested and not self.password: await super(KH1Context, self).server_auth(password_requested) await self.get_username() @@ -114,8 +111,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root + "/" + file) - global item_num - item_num = 1 + self.item_num = 1 @property def endpoints(self): @@ -130,8 +126,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root+"/"+file) - global item_num - item_num = 1 + self.item_num = 1 def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: @@ -142,38 +137,34 @@ class KH1Context(CommonContext): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - #Handle Slot Data + # Handle Slot Data self.slot_data = args['slot_data'] for key in list(args['slot_data'].keys()): with open(os.path.join(self.game_communication_path, key + ".cfg"), 'w') as f: f.write(str(args['slot_data'][key])) f.close() - - ###Support Legacy Games - if "Required Reports" in list(args['slot_data'].keys()) and "required_reports_eotw" not in list(args['slot_data'].keys()): - reports_required = args['slot_data']["Required Reports"] - with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: - f.write(str(reports_required)) - f.close() - ###End Support Legacy Games - - #End Handle Slot Data + if key == "remote_location_ids": + self.remote_location_ids = args['slot_data'][key] + if key == "death_link": + if args['slot_data']["death_link"] != "off": + self.death_link = True + # End Handle Slot Data if cmd in {"ReceivedItems"}: start_index = args["index"] if start_index != len(self.items_received): - global item_num for item in args['items']: found = False - item_filename = f"AP_{str(item_num)}.item" + item_filename = f"AP_{str(self.item_num)}.item" for filename in os.listdir(self.game_communication_path): if filename == item_filename: found = True if not found: - with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: - f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) - f.close() - item_num = item_num + 1 + if (NetworkItem(*item).player == self.slot and (NetworkItem(*item).location in self.remote_location_ids) or (NetworkItem(*item).location < 0)) or NetworkItem(*item).player != self.slot: + with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: + f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) + f.close() + self.item_num += 1 if cmd in {"RoomUpdate"}: if "checked_locations" in args: @@ -186,21 +177,39 @@ class KH1Context(CommonContext): if args["type"] == "ItemSend": item = args["item"] networkItem = NetworkItem(*item) - recieverID = args["receiving"] + receiverID = args["receiving"] senderID = networkItem.player locationID = networkItem.location - if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names.lookup_in_slot(networkItem.item, recieverID) + if receiverID == self.slot or senderID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] itemCategory = networkItem.flags - recieverName = self.player_names[recieverID] - filename = "sent" - with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.write( - re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15] + "\n" - + re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] + "\n" - + str(itemCategory) + "\n" - + str(locationID)) - f.close() + receiverName = self.player_names[receiverID][:20] + senderName = self.player_names[senderID][:20] + message = "" + if receiverID == self.slot and receiverID != senderID: # Item received from someone else + message = "From " + senderName + "\n" + itemName + elif senderID == self.slot and receiverID != senderID: # Item sent to someone else + message = itemName + "\nTo " + receiverName + elif locationID in self.remote_location_ids: # Found a remote item + message = itemName + filename = "msg" + if message != "": + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() + if args["type"] == "ItemCheat": + item = args["item"] + networkItem = NetworkItem(*item) + receiverID = args["receiving"] + if receiverID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] + filename = "msg" + message = "Received " + itemName + "\nfrom server" + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() def on_deathlink(self, data: dict[str, object]): self.last_death_link = max(data["time"], self.last_death_link) @@ -230,12 +239,11 @@ class KH1Context(CommonContext): async def game_watcher(ctx: KH1Context): from .Locations import lookup_id_to_name while not ctx.exit_event.is_set(): - global death_link - if death_link and "DeathLink" not in ctx.tags: - await ctx.update_death_link(death_link) - if not death_link and "DeathLink" in ctx.tags: - await ctx.update_death_link(death_link) - if ctx.syncing == True: + if ctx.death_link and "DeathLink" not in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if not ctx.death_link and "DeathLink" in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if ctx.syncing is True: sync_msg = [{'cmd': 'Sync'}] if ctx.locations_checked: sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) @@ -256,17 +264,17 @@ async def game_watcher(ctx: KH1Context): if st != "nil": if timegm(time.strptime(st, '%Y%m%d%H%M%S')) > ctx.last_death_link and int(time.time()) % int(timegm(time.strptime(st, '%Y%m%d%H%M%S'))) < 10: await ctx.send_death(death_text = "Sora was defeated!") - if file.find("insynthshop") > -1: - if not ctx.hinted_synth_location_ids: + if file.find("hint") > -1: + hint_location_id = int(file.split("hint", -1)[1]) + if hint_location_id not in ctx.hinted_location_ids: await ctx.send_msgs([{ "cmd": "LocationScouts", - "locations": [2656401,2656402,2656403,2656404,2656405,2656406], + "locations": [hint_location_id], "create_as_hint": 2 }]) - ctx.hinted_synth_location_ids = True + ctx.hinted_location_ids.append(hint_location_id) ctx.locations_checked = sending - message = [{"cmd": 'LocationChecks', "locations": sending}] - await ctx.send_msgs(message) + await ctx.check_locations(sending) if not ctx.finished_game and victory: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True diff --git a/worlds/kh1/Data.py b/worlds/kh1/Data.py new file mode 100644 index 00000000..19227c03 --- /dev/null +++ b/worlds/kh1/Data.py @@ -0,0 +1,202 @@ +VANILLA_KEYBLADE_STATS = [ + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Kingdom Key + {"STR": 1, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Dream Sword + {"STR": 1, "CRR": 0, "CRB": 0, "REC": 60, "MP": 0}, # Dream Shield + {"STR": 1, "CRR": 10, "CRB": 0, "REC": 30, "MP": 0}, # Dream Rod + {"STR": 0, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Wooden Sword + {"STR": 5, "CRR": 10, "CRB": 0, "REC": 1, "MP": 0}, # Jungle King + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 60, "MP": 0}, # Three Wishes + {"STR": 8, "CRR": 10, "CRB": 2, "REC": 30, "MP": 1}, # Fairy Harp + {"STR": 7, "CRR": 40, "CRB": 0, "REC": 1, "MP": 0}, # Pumpkinhead + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Crabclaw + {"STR": 13, "CRR": 40, "CRB": 0, "REC": 60, "MP": 0}, # Divine Rose + {"STR": 4, "CRR": 20, "CRB": 0, "REC": 30, "MP": 2}, # Spellbinder + {"STR": 10, "CRR": 20, "CRB": 2, "REC": 90, "MP": 0}, # Olympia + {"STR": 10, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Lionheart + {"STR": 9, "CRR": 2, "CRB": 0, "REC": 90, "MP": -1}, # Metal Chocobo + {"STR": 9, "CRR": 40, "CRB": 0, "REC": 1, "MP": 1}, # Oathkeeper + {"STR": 11, "CRR": 20, "CRB": 2, "REC": 30, "MP": -1}, # Oblivion + {"STR": 7, "CRR": 20, "CRB": 0, "REC": 1, "MP": 2}, # Lady Luck + {"STR": 5, "CRR": 200, "CRB": 2, "REC": 1, "MP": 0}, # Wishing Star + {"STR": 14, "CRR": 40, "CRB": 2, "REC": 90, "MP": 2}, # Ultima Weapon + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 1, "MP": 3}, # Diamond Dust + {"STR": 8, "CRR": 10, "CRB": 16, "REC": 90, "MP": -2}, # One-Winged Angel + ] +VANILLA_PUPPY_LOCATIONS = [ + "Traverse Town Mystical House Glide Chest", + "Traverse Town Alleyway Behind Crates Chest", + "Traverse Town Item Workshop Left Chest", + "Traverse Town Secret Waterway Near Stairs Chest", + "Wonderland Queen's Castle Hedge Right Blue Chest", + "Wonderland Lotus Forest Nut Chest", + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest", + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest", + "Deep Jungle Hippo's Lagoon Center Chest", + "Deep Jungle Vines 2 Chest", + "Deep Jungle Waterfall Cavern Middle Chest", + "Deep Jungle Camp Blue Trinity Chest", + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest", + "Halloween Town Oogie's Manor Hollow Chest", + "Neverland Pirate Ship Deck White Trinity Chest", + "Agrabah Cave of Wonders Hidden Room Left Chest", + "Agrabah Cave of Wonders Entrance Tall Tower Chest", + "Agrabah Palace Gates High Opposite Palace Chest", + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest", + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest", + "Hollow Bastion Grand Hall Left of Gate Chest", + "Halloween Town Cemetery By Cat Shape Chest", + "Halloween Town Moonlight Hill White Trinity Chest", + "Halloween Town Guillotine Square Pumpkin Structure Right Chest", + "Monstro Mouth High Platform Across from Boat Chest", + "Monstro Chamber 6 Low Chest", + "Monstro Chamber 5 Atop Barrel Chest", + "Neverland Hold Flight 1st Chest", + "Neverland Hold Yellow Trinity Green Chest", + "Neverland Captain's Cabin Chest", + "Hollow Bastion Rising Falls Floating Platform Near Save Chest", + "Hollow Bastion Castle Gates Gravity Chest", + "Hollow Bastion Lift Stop Outside Library Gravity Chest" + ] +CHAR_TO_KH = { + " ": 0x01, + "0": 0x21, + "1": 0x22, + "2": 0x23, + "3": 0x24, + "4": 0x25, + "5": 0x26, + "6": 0x27, + "7": 0x28, + "8": 0x29, + "9": 0x2A, + "A": 0x2B, + "B": 0x2C, + "C": 0x2D, + "D": 0x2E, + "E": 0x2F, + "F": 0x30, + "G": 0x31, + "H": 0x32, + "I": 0x33, + "J": 0x34, + "K": 0x35, + "L": 0x36, + "M": 0x37, + "N": 0x38, + "O": 0x39, + "P": 0x3A, + "Q": 0x3B, + "R": 0x3C, + "S": 0x3D, + "T": 0x3E, + "U": 0x3F, + "V": 0x40, + "W": 0x41, + "X": 0x42, + "Y": 0x43, + "Z": 0x44, + "a": 0x45, + "b": 0x46, + "c": 0x47, + "d": 0x48, + "e": 0x49, + "f": 0x4A, + "g": 0x4B, + "h": 0x4C, + "i": 0x4D, + "j": 0x4E, + "k": 0x4F, + "l": 0x50, + "m": 0x51, + "n": 0x52, + "o": 0x53, + "p": 0x54, + "q": 0x55, + "r": 0x56, + "s": 0x57, + "t": 0x58, + "u": 0x59, + "v": 0x5A, + "w": 0x5B, + "x": 0x5C, + "y": 0x5D, + "z": 0x5E + } +VANILLA_ABILITY_AP_COSTS = [ + {"Ability Name": "Treasure Magnet", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Air Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Critical Plus", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Second Wind", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Scan", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sonic Blade", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ars Arcanum", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Strike Raid", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ragnarok", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Trinity Limit", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Cheer", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Vortex", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Aerial Sweep", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Counter Attack", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Blitz", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Guard", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Dodge Roll", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "MP Haste", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "MP Rage", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Second Chance", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Berserk", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Jackpot", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Lucky Strike", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Charge", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Rocket", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Tornado", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "MP Gift", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Raging Boar", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Asp's Bite", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Healing Herb", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Wind Armor", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Crescent", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Sandstorm", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Applause!", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Blazing Fury", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Icy Terror", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Bolts of Sorrow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ghostly Scream", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Hummingbird", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Time-Out", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Storm´s Eye", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ferocious Lunge", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Furious Bellow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Spiral Wave", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Thunder Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Cure Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Aero Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Slapshot", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sliding Dash", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Hurricane Blast", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Ripple Drive", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Stun Impact", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Gravity Break", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Zantetsuken", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Tech Boost", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Encounter Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Leaf Bracer", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Evolution", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "EXP Zero", "AP Cost": 0, "Randomize": True}, + {"Ability Name": "Combo Master", "AP Cost": 3, "Randomize": True} + ] + +WORLD_KEY_ITEMS = { + "Footprints": "Wonderland", + "Entry Pass": "Olympus Coliseum", + "Slides": "Deep Jungle", + "Crystal Trident": "Atlantica", + "Forget-Me-Not": "Halloween Town", + "Jack-In-The-Box": "Halloween Town", + "Theon Vol. 6": "Hollow Bastion" +} + +LOGIC_BEGINNER = 0 +LOGIC_NORMAL = 5 +LOGIC_PROUD = 10 +LOGIC_MINIMAL = 15 \ No newline at end of file diff --git a/worlds/kh1/GenerateJSON.py b/worlds/kh1/GenerateJSON.py new file mode 100644 index 00000000..fdd8f215 --- /dev/null +++ b/worlds/kh1/GenerateJSON.py @@ -0,0 +1,67 @@ +import logging + +import yaml +import os +import io +from typing import TYPE_CHECKING, Dict, List, Optional, cast +import Utils +import zipfile +import json + +from .Locations import KH1Location, location_table + +from worlds.Files import APPlayerContainer + + + +class KH1Container(APPlayerContainer): + game: str = 'Kingdom Hearts' + patch_file_ending = ".zip" + + def __init__(self, patch_data: Dict[str, str] | io.BytesIO, base_path: str = "", output_directory: str = "", + player: Optional[int] = None, player_name: str = "", server: str = ""): + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".zip") + super().__init__(container_path, player, player_name, server) + + def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + for filename, text in self.patch_data.items(): + opened_zipfile.writestr(filename, text) + super().write_contents(opened_zipfile) + + +def generate_json(world, output_directory): + mod_name = f"AP-{world.multiworld.seed_name}-P{world.player}-{world.multiworld.get_file_safe_player_name(world.player)}" + mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) + + item_location_map = get_item_location_map(world) + settings = get_settings(world) + + files = { + "item_location_map.json": json.dumps(item_location_map), + "keyblade_stats.json": json.dumps(world.get_keyblade_stats()), + "settings.json": json.dumps(settings), + "ap_costs.json": json.dumps(world.get_ap_costs()) + } + + mod = KH1Container(files, mod_dir, output_directory, world.player, + world.multiworld.get_file_safe_player_name(world.player)) + mod.write() + +def get_item_location_map(world): + location_item_map = {} + for location in world.multiworld.get_filled_locations(world.player): + if location.name != "Final Ansem": + if world.player != location.item.player or (world.player == location.item.player and world.options.remote_items.current_key == "full" and (location_table[location.name].code < 2656800 or location_table[location.name].code > 2656814)): + item_id = 2641230 + else: + item_id = location.item.code + location_data = location_table[location.name] + location_id = location_data.code + location_item_map[location_id] = item_id + return location_item_map + +def get_settings(world): + settings = world.fill_slot_data() + return settings \ No newline at end of file diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index bac98a9b..c453d904 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -10,518 +10,341 @@ class KH1Item(Item): class KH1ItemData(NamedTuple): category: str code: int + type: str classification: ItemClassification = ItemClassification.filler max_quantity: int = 1 weight: int = 1 def get_items_by_category(category: str) -> Dict[str, KH1ItemData]: - item_dict: Dict[str, KH1ItemData] = {} - for name, data in item_table.items(): - if data.category == category: - item_dict.setdefault(name, data) - - return item_dict - + return {name: data for name, data in item_table.items() if data.category == category} item_table: Dict[str, KH1ItemData] = { - "Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, ), - "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, ), - "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, ), - "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, ), - "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, ), - #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, ), - "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, ), - "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, ), - "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, ), - #"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, ), - #"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, ), - #"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, ), - #"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, ), - #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, ), - #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, ), - #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, ), - #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, ), - "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, ), - "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, ), - "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, ), - "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, ), - "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, ), - "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, ), - "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, ), - "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, ), - "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, ), - "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, ), - "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, ), - "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, ), - "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, ), - "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, ), - "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, ), - "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, ), - "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, ), - "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, ), - "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, ), - "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, ), - "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, ), - "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, ), - "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, ), - "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, ), - "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, ), - "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, ), - "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, ), - "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, ), - "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, ), - "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, ), - "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, ), - "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, ), - "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, ), - "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, ), - "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, ), - "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, ), - "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, ), - "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, ), - "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, ), - "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, ), - #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, ), - "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, ), - "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, ), - "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, ), - "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, ), - "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, ), - "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, ), - "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, ), - "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, ), - "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, ), - "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, ), - "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, ), - "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, ), - "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, ), - "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, ), - #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, ), - #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, ), - #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, ), - #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, ), - #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, ), - #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, ), - #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, ), - #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, ), - #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, ), - #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, ), - #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, ), - #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, ), - #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, ), - "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, ), - "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, ), - "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, ), - "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, ), - "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, ), - "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, ), - "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, ), - "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, ), - "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, ), - "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, ), - "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, ), - "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, ), - "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, ), - "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, ), - "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, ), - "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, ), - "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, ), - "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, ), - #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, ), - "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, ), - "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, ), - "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, ), - "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, ), - "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, ), - "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, ), - "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, ), - "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, ), - "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, ), - "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, ), - "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, ), - "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, ), - "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, ), - "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, ), - #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, ), - #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, ), - "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, ), - "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, ), - "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, ), - "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, ), - "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, ), - "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, ), - "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, ), - "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, ), - "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, ), - "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, ), - "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, ), - "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, ), - "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, ), - "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, ), - #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, ), - #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, ), - #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, ), - #"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, ), - #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, ), - "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, ), - "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, ), - "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, ), - #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, ), - #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, ), - #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, ), - #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, ), - "Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, ), - "Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, ), - "Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, ), - "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, ), - "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, ), - "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, ), - #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, ), - #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, ), - #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, ), - "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, ), - "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, ), - "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, ), - "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, ), - "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, ), - "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, ), - "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, ), - #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, ), - #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, ), - #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, ), - "Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, ), - "Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, ), - "Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, ), - "Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, ), - "Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, ), - "Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, ), - "Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, ), - "Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, ), - "Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, ), - "Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, ), - #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, ), - #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, ), - #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, ), - #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, ), - #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, ), - "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, ), - #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, ), - #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, ), - "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6 ), - #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, ), - "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, ), - "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, ), - "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, ), - "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, ), - #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, ), - #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, ), - #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, ), - #"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, ), - #"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, ), - #"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, ), - #"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, ), - #"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, ), - #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, ), - #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, ), - #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, ), - #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, ), - #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, ), - #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, ), - #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, ), - #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, ), - #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, ), - #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, ), - "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, ), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10), - "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, ), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, ), - "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, ), - "Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, ), - "Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, ), - "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, ), - #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, ), - #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, ), - #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, ), - #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, ), - #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, ), - "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, ), - #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, ), - #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, ), - #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, ), - "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, ), - "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, ), - "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, ), - #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, ), - #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, ), - #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, ), - #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, ), - #"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, ), - #"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, ), - #"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, ), - #"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, ), - #"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, ), - #"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, ), - #"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, ), - #"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, ), - #"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, ), - #"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, ), - #"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, ), - #"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, ), - #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, ), - #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, ), - #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, ), - #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, ), - #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, ), - #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, ), - #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, ), - #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, ), - #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, ), - #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, ), - "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, ), - "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, ), - "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2 ), - #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, ), - "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, ), - "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, ), - "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, ), - "Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, ), - "Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, ), - "Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, ), - "Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, ), - "Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, ), - "Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, ), - "Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, ), - "Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, ), - "Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, ), - "Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, ), - "Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, ), - "Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, ), - "Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, ), - "Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, ), - "Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, ), - "Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, ), - "Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, ), - "Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, ), - "Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, ), - "Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, ), - "Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, ), - "Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, ), - "Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, ), - "Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, ), - "Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, ), - "Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, ), - "Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, ), - "Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, ), - "Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, ), - "Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, ), - "Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, ), - "Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, ), - "Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, ), - "Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, ), - "Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, ), - "Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, ), - "Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, ), - "Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, ), - "Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, ), - "Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, ), - "Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, ), - "Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, ), - "Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, ), - "Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, ), - "Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, ), - "Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, ), - "Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, ), - "Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, ), - "Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, ), - "Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, ), - "Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, ), - "Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, ), - "Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, ), - "Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, ), - "Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, ), - "Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, ), - "Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, ), - "Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, ), - "Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, ), - "Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, ), - "Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, ), - "Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, ), - "Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, ), - "Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, ), - "Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, ), - "Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, ), - "Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, ), - "Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, ), - "Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, ), - "Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, ), - "Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, ), - "Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, ), - "Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, ), - "Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, ), - "Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, ), - "Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, ), - "Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, ), - "Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, ), - "Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, ), - "Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, ), - "Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, ), - "Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, ), - "Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, ), - "Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, ), - "Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, ), - "Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, ), - "Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, ), - "Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, ), - "Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, ), - "Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, ), - "Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, ), - "Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, ), - "Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, ), - "Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, ), - "Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, ), - "Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, ), - "Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, ), - "Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, ), - "Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, ), - "Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, ), - "Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, ), - "Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, ), - "Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, ), - "Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, ), - "Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, ), - "Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, ), - "Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, ), - "Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, ), - "Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, ), - "Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, ), - "Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, ), - "Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, ), - "Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, ), - "Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, ), - "Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, ), - "Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, ), - "Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, ), - "Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, ), - "Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, ), - "Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, ), - "Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, ), - "Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, ), - "Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, ), - "Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, ), - "Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, ), - "Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, ), - "Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, ), - "Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, ), - "Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, ), - "All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, ), - "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2 ), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4 ), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2 ), - "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3 ), - #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, ), - "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, ), - "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, ), - "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, ), - "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, ), - "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, ), - "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, ), - "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, ), - "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, ), - "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, ), - "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, ), - "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, ), - "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, ), - "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, ), - "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, ), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, ), - "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, ), - "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, ), - "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, ), - "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, ), - #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, ), - #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, ), - #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, ), - #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, ), - #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, ), - #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, ), - #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, ), - #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, ), - #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, ), - #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, ), - #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, ), - #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, ), - #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, ), - #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, ), - #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, ), - #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, ), - #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, ), - #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, ), - #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, ), - #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, ), - #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, ), - #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, ), - #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, ), - #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, ), - "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, ), - "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, ), - "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, ), - "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, ), - "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, ), - "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, ), - "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, ), - "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4 ), - "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, ), - "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, ), - #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, ), - "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, ), - "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, ), - "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15), - "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15), - "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15), - "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15), - "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15), - "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15), - "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15), - "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, ), - "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, ), - "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, ), - "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, ), - "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, ), - "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, ), - "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3 ), - #"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, ), - "Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, ), - "Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, ), - "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, ), - "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, ), - "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, ), - "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, ), - "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, ), - "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, ), - "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, ), - "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, ), - "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, ), - "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, ), - "Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, ), - "Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, ), - "White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, ), - "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, ), - "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, ), - "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, ), - #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, ), + "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, type = "Item", ), + "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, type = "Item", ), + "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, type = "Item", ), + "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, type = "Item", ), + #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, type = "Item", ), + "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, type = "Item", ), + "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, type = "Item", ), + "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, type = "Item", ), + "Torn Page": KH1ItemData("Torn Pages", code = 264_1009, classification = ItemClassification.progression, type = "Item", max_quantity = 5 ), + "Final Door Key": KH1ItemData("Key", code = 264_1010, classification = ItemClassification.progression, type = "Item", ), + "Destiny Islands": KH1ItemData("Worlds", code = 264_1011, classification = ItemClassification.progression, type = "Item", ), + "Raft Materials": KH1ItemData("Key", code = 264_1012, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, type = "Item", ), + #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, type = "Item", ), + #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, type = "Item", ), + #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, type = "Item", ), + "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, type = "Item", ), + "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, type = "Item", ), + "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, type = "Item", ), + "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, type = "Item", ), + "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, type = "Item", ), + "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, type = "Item", ), + "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, type = "Item", ), + "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, type = "Item", ), + "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, type = "Item", ), + "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, type = "Item", ), + "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, type = "Item", ), + "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, type = "Item", ), + "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, type = "Item", ), + "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, type = "Item", ), + "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, type = "Item", ), + "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, type = "Item", ), + "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, type = "Item", ), + "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, type = "Item", ), + "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, type = "Item", ), + "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, type = "Item", ), + "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, type = "Item", ), + "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, type = "Item", ), + "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, type = "Item", ), + "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, type = "Item", ), + "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, type = "Item", ), + "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, type = "Item", ), + "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, type = "Item", ), + "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, type = "Item", ), + "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, type = "Item", ), + "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, type = "Item", ), + "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, type = "Item", ), + "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, type = "Item", ), + "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, type = "Item", ), + "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, type = "Item", ), + "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, type = "Item", ), + "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, type = "Item", ), + "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, type = "Item", ), + "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, type = "Item", ), + "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, type = "Item", ), + "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, type = "Item", ), + #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, type = "Item", ), + "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, type = "Item", ), + "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, type = "Item", ), + "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, type = "Item", ), + "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, type = "Item", ), + "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, type = "Item", ), + "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, type = "Item", ), + "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, type = "Item", ), + "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, type = "Item", ), + "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, type = "Item", ), + "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, type = "Item", ), + "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, type = "Item", ), + "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, type = "Item", ), + "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, type = "Item", ), + "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, type = "Item", ), + #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, type = "Item", ), + #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, type = "Item", ), + #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, type = "Item", ), + #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, type = "Item", ), + #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, type = "Item", ), + #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, type = "Item", ), + #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, type = "Item", ), + #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, type = "Item", ), + #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, type = "Item", ), + #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, type = "Item", ), + #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, type = "Item", ), + #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, type = "Item", ), + #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, type = "Item", ), + #"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, type = "Item", ), + "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, type = "Item", ), + "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, type = "Item", ), + "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, type = "Item", ), + "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, type = "Item", ), + "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.progression, type = "Item", ), + "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, type = "Item", ), + "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.progression, type = "Item", ), + "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, type = "Item", ), + "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, type = "Item", ), + "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, type = "Item", ), + "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, type = "Item", ), + "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, type = "Item", ), + "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, type = "Item", ), + "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, type = "Item", ), + "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, type = "Item", ), + "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, type = "Item", ), + "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, type = "Item", ), + #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, type = "Item", ), + "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, type = "Item", ), + "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, type = "Item", ), + "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, type = "Item", ), + "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, type = "Item", ), + "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, type = "Item", ), + "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, type = "Item", ), + "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, type = "Item", ), + "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, type = "Item", ), + "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, type = "Item", ), + "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, type = "Item", ), + "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, type = "Item", ), + "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, type = "Item", ), + "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, type = "Item", ), + "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, type = "Item", ), + #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, type = "Item", ), + "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, type = "Item", ), + "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, type = "Item", ), + "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, type = "Item", ), + "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, type = "Item", ), + "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, type = "Item", ), + "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, type = "Item", ), + "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, type = "Item", ), + "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, type = "Item", ), + "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, type = "Item", ), + "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, type = "Item", ), + "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, type = "Item", ), + "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, type = "Item", ), + "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, type = "Item", ), + "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, type = "Item", ), + #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, type = "Item", ), + #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, type = "Item", ), + #"Dagger": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, type = "Item", ), + #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, type = "Item", ), + "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, type = "Item", ), + "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, type = "Item", ), + "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, type = "Item", ), + #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, type = "Item", ), + #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, type = "Item", ), + #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, type = "Item", ), + #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, type = "Item", ), + "Wonderland": KH1ItemData("Worlds", code = 264_1149, classification = ItemClassification.progression, type = "Item", ), + "Olympus Coliseum": KH1ItemData("Worlds", code = 264_1150, classification = ItemClassification.progression, type = "Item", ), + "Deep Jungle": KH1ItemData("Worlds", code = 264_1151, classification = ItemClassification.progression, type = "Item", ), + "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, type = "Item", ), + "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, type = "Item", ), + "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, type = "Item", ), + "Agrabah": KH1ItemData("Worlds", code = 264_1155, classification = ItemClassification.progression, type = "Item", ), + "Monstro": KH1ItemData("Worlds", code = 264_1156, classification = ItemClassification.progression, type = "Item", ), + "Atlantica": KH1ItemData("Worlds", code = 264_1157, classification = ItemClassification.progression, type = "Item", ), + "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, type = "Item", ), + "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, type = "Item", ), + "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, type = "Item", ), + "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, type = "Item", ), + "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, type = "Item", ), + "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, type = "Item", ), + "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, type = "Item", ), + "Neverland": KH1ItemData("Worlds", code = 264_1165, classification = ItemClassification.progression, type = "Item", ), + "Halloween Town": KH1ItemData("Worlds", code = 264_1166, classification = ItemClassification.progression, type = "Item", ), + "Puppy": KH1ItemData("Key", code = 264_1167, classification = ItemClassification.progression, type = "Item", ), + "Hollow Bastion": KH1ItemData("Worlds", code = 264_1168, classification = ItemClassification.progression, type = "Item", ), + "End of the World": KH1ItemData("Worlds", code = 264_1169, classification = ItemClassification.progression, type = "Item", ), + "Blue Trinity": KH1ItemData("Trinities", code = 264_1170, classification = ItemClassification.progression, type = "Item", ), + "Red Trinity": KH1ItemData("Trinities", code = 264_1171, classification = ItemClassification.progression, type = "Item", ), + "Green Trinity": KH1ItemData("Trinities", code = 264_1172, classification = ItemClassification.progression, type = "Item", ), + "Yellow Trinity": KH1ItemData("Trinities", code = 264_1173, classification = ItemClassification.progression, type = "Item", ), + "White Trinity": KH1ItemData("Trinities", code = 264_1174, classification = ItemClassification.progression, type = "Item", ), + "Progressive Fire": KH1ItemData("Magic", code = 264_1175, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Blizzard": KH1ItemData("Magic", code = 264_1176, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Thunder": KH1ItemData("Magic", code = 264_1177, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Cure": KH1ItemData("Magic", code = 264_1178, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Gravity": KH1ItemData("Magic", code = 264_1179, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Stop": KH1ItemData("Magic", code = 264_1180, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Aero": KH1ItemData("Magic", code = 264_1181, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Phil Cup": KH1ItemData("Cups", code = 264_1182, classification = ItemClassification.progression, type = "Item", ), + "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, type = "Item", ), + "Pegasus Cup": KH1ItemData("Cups", code = 264_1184, classification = ItemClassification.progression, type = "Item", ), + "Hercules Cup": KH1ItemData("Cups", code = 264_1185, classification = ItemClassification.progression, type = "Item", ), + #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, type = "Item", max_quantity = 6 ), + #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, type = "Item", ), + #"Log": KH1ItemData("DI", code = 264_1192, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Cloth": KH1ItemData("DI", code = 264_1193, classification = ItemClassification.progression, type = "Item", ), + #"Rope": KH1ItemData("DI", code = 264_1194, classification = ItemClassification.progression, type = "Item", ), + #"Seagull Egg": KH1ItemData("DI", code = 264_1195, classification = ItemClassification.progression, type = "Item", ), + #"Fish": KH1ItemData("DI", code = 264_1196, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Mushroom": KH1ItemData("DI", code = 264_1197, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Coconut": KH1ItemData("DI", code = 264_1198, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Drinking Water": KH1ItemData("DI", code = 264_1199, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, type = "Item", ), + #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, type = "Item", ), + #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, type = "Item", ), + #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, type = "Item", ), + #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, type = "Item", ), + "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, type = "Item", ), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, type = "Item", max_quantity = 10), + #"Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, type = "Item", ), + "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, type = "Item", ), + #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, type = "Item", ), + #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, type = "Item", ), + #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, type = "Item", ), + #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, type = "Item", ), + #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, type = "Item", ), + "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, type = "Item", ), + #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, type = "Item", ), + #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, type = "Item", ), + #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, type = "Item", ), + "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, type = "Item", ), + "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, type = "Item", ), + "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, type = "Item", ), + #"AP Item": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, type = "Item", ), + "Dumbo": KH1ItemData("Summons", code = 264_1231, classification = ItemClassification.progression, type = "Item", ), + #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, type = "Item", ), + "Bambi": KH1ItemData("Summons", code = 264_1233, classification = ItemClassification.progression, type = "Item", ), + "Genie": KH1ItemData("Summons", code = 264_1234, classification = ItemClassification.progression, type = "Item", ), + "Tinker Bell": KH1ItemData("Summons", code = 264_1235, classification = ItemClassification.progression, type = "Item", ), + "Mushu": KH1ItemData("Summons", code = 264_1236, classification = ItemClassification.progression, type = "Item", ), + "Simba": KH1ItemData("Summons", code = 264_1237, classification = ItemClassification.progression, type = "Item", ), + "Lucky Emblem": KH1ItemData("Key", code = 264_1238, classification = ItemClassification.progression, type = "Item", ), + "Max HP Increase": KH1ItemData("Level Up", code = 264_1239, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max MP Increase": KH1ItemData("Level Up", code = 264_1240, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max AP Increase": KH1ItemData("Level Up", code = 264_1241, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Strength Increase": KH1ItemData("Level Up", code = 264_1242, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Defense Increase": KH1ItemData("Level Up", code = 264_1243, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_1244, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_1245, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, type = "Item", ), + #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, type = "Item", ), + #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, type = "Item", ), + #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, type = "Item", ), + #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, type = "Item", ), + #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, type = "Item", ), + #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, type = "Item", ), + #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, type = "Item", ), + "Mythril": KH1ItemData("Key", code = 264_1254, classification = ItemClassification.progression, type = "Item", max_quantity = 16), + "Orichalcum": KH1ItemData("Key", code = 264_1255, classification = ItemClassification.progression, type = "Item", max_quantity = 17), + "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, type = "Shared Ability", ), + "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, type = "Shared Ability", ), + "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, type = "Shared Ability", max_quantity = 2 ), + #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, type = "Ability", ), + "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, type = "Ability", max_quantity = 2 ), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.progression, type = "Ability", max_quantity = 2 ), + "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, type = "Ability", max_quantity = 3 ), + #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, type = "Ability", ), + "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, type = "Ability", ), + "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.progression, type = "Ability", ), + "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, type = "Ability", ), + "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.progression, type = "Ability", ), + "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, type = "Ability", ), + "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, type = "Ability", ), + "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, type = "Ability", ), + "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, type = "Ability", ), + "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, type = "Ability", ), + "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.progression, type = "Ability", ), + "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, type = "Ability", ), + "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, type = "Ability", ), + "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, type = "Ability", ), + "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, type = "Ability", ), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, type = "Ability", ), + "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, type = "Ability", ), + "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, type = "Ability", ), + "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, type = "Ability", ), + "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, type = "Ability", ), + #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, type = "Ability", ), + #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, type = "Ability", ), + #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, type = "Ability", ), + #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, type = "Ability", ), + #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, type = "Ability", ), + #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, type = "Ability", ), + #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, type = "Ability", ), + #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, type = "Ability", ), + #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, type = "Ability", ), + #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, type = "Ability", ), + #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, type = "Ability", ), + #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, type = "Ability", ), + #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, type = "Ability", ), + #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, type = "Ability", ), + #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, type = "Ability", ), + #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, type = "Ability", ), + #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, type = "Ability", ), + #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, type = "Ability", ), + #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, type = "Ability", ), + #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, type = "Ability", ), + #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, type = "Ability", ), + #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, type = "Ability", ), + #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, type = "Ability", ), + #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, type = "Ability", ), + "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, type = "Ability", ), + "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, type = "Ability", ), + "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, type = "Ability", ), + "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, type = "Ability", ), + "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, type = "Ability", ), + "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, type = "Ability", ), + "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, type = "Ability", ), + "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, type = "Ability", ), + "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, type = "Ability", ), + #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, type = "Ability", ), + "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, type = "Ability", ), + "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, type = "Ability", ) } -event_item_table: Dict[str, KH1ItemData] = {} +event_item_table: Dict[str, KH1ItemData] = { + "Victory": KH1ItemData("Event", code = None, classification = ItemClassification.progression, type = "Event") +} #Make item categories item_name_groups: Dict[str, Set[str]] = {} diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a82be70f..582d69a8 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -11,572 +11,758 @@ class KH1Location(Location): class KH1LocationData(NamedTuple): category: str - code: int + code: Optional[int] = None + type: Optional[str] = None + behind_boss: Optional[bool] = False - -def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: - location_dict: Dict[str, KH1LocationData] = {} - for name, data in location_table.items(): - if data.category == category: - location_dict.setdefault(name, data) - - return location_dict +def get_locations_by_type(type: str) -> Dict[str, KH1LocationData]: + return {name: data for name, data in location_table.items() if data.type == type} location_table: Dict[str, KH1LocationData] = { - #"Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011), missable - "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211), - "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212), - "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213), - "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214), - "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251), - "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252), - "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253), - "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254), - "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292), - "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293), - "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294), - "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331), - "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332), - "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333), - "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334), - "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371), - "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411), - "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891), - "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892), - "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893), - "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894), - "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931), - "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932), - "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933), - "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934), - "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971), - "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011), - "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012), - "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013), - "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014), - "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051), - "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052), - "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053), - "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054), - "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094), - "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131), - "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132), - "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133), - "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213), - "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214), - "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251), - "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252), - "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253), - "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291), - "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292), - "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293), - "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331), - "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332), - "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333), - "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334), - "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371), - "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372), - "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373), - "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374), - "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411), - "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412), - "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413), - "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654), - "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691), - "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692), - "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693), - "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972), - "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973), - "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974), - "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011), - "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012), - "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013), - "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014), - "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051), - "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052), - "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053), - "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054), - "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091), - "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092), - "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093), - "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094), - "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131), - "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132), - "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133), - "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134), - "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171), - "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172), - "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173), - "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174), - "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211), - "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212), - "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213), - "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214), - "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251), - "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252), - "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253), - "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254), - "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291), - "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292), - "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293), - "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294), - "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331), - "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332), - "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413), - "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414), - "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451), - "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452), - "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531), - "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532), - "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533), - "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534), - "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571), - "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572), - "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573), - "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574), - "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611), - "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014), - "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051), - "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052), - "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053), - "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054), - "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091), - "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092), - "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093), - "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094), - "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131), - "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132), - "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133), - "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134), - "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171), - "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172), - "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291), - "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292), - "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293), - "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294), - "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332), - "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333), - "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334), - "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371), - "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372), - "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373), - "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454), - "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491), - "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492), - "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493), - "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494), - "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534), - "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571), - "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613), - "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614), - "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651), - "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652), - "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653), - "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732), - "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733), - "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734), - "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771), - "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772), - "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773), - "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774), - "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811), - "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812), - "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813), - "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814), - "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014), - "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051), - "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052), - "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053), - "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054), - "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091), - "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092), - "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093), - "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094), - "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131), - "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132), - "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133), - "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134), - "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171), - "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172), - "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173), - "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174), - "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211), - "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213), - "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214), - "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251), - "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252), - "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253), - "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254), - "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291), - "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292), - "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293), - "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294), - "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331), - "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332), - "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333), - "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334), - "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371), - "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372), - "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373), - "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374), - "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454), - "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491), - "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492), - #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493), --handled later - "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212), - "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494), - "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531), - "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532), - "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533), - "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534), - "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571), - "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572), - "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573), - "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574), - "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611), - "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612), - "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613), - "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614), - "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651), - "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652), - "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653), - "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654), - "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691), - "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692), - "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693), - "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694), - "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731), - "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733), - "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734), - #"End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771), - "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772), - "Monstro Chamber 6 White Trinity Chest": KH1LocationData("End of the World", 265_5092), - #"Awakening Chest": KH1LocationData("Awakening", 265_5093), missable + "Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011, "Chest"), + "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211, "Chest"), + "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212, "Chest"), + "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213, "Chest"), + "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214, "Chest"), + "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251, "Chest"), + "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252, "Chest"), + "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253, "Chest"), + "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254, "Chest"), + "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292, "Chest"), + "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293, "Chest"), + "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294, "Chest"), + "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331, "Chest"), + "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332, "Chest"), + "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333, "Chest"), + "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334, "Chest", True), + "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371, "Chest"), + "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411, "Chest"), + "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891, "Chest"), + "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892, "Chest"), + "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893, "Chest"), + "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894, "Chest"), + "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934, "Chest"), + "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971, "Chest"), + "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011, "Chest"), + "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012, "Chest"), + "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013, "Chest"), + "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014, "Chest"), + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051, "Chest"), + "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052, "Chest"), + "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053, "Chest"), + "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054, "Chest"), + "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094, "Chest"), + "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131, "Chest"), + "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132, "Chest"), + "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133, "Chest"), + "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213, "Chest"), + "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214, "Chest"), + "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251, "Chest"), + "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252, "Chest"), + "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253, "Chest"), + "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291, "Chest"), + "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292, "Chest"), + "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293, "Chest"), + "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331, "Chest"), + "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332, "Chest", True), + "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333, "Chest"), + "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334, "Chest"), + "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371, "Chest", True), + "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372, "Chest", True), + "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373, "Chest", True), + "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374, "Chest", True), + "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411, "Chest"), + "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412, "Chest"), + "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413, "Chest"), + "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654, "Chest"), + "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691, "Chest"), + "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692, "Chest"), + "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693, "Chest"), + "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972, "Chest"), + "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973, "Chest"), + "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974, "Chest"), + "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011, "Chest"), + "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012, "Chest"), + "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013, "Chest"), + "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014, "Chest"), + "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051, "Chest"), + "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052, "Chest"), + "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053, "Chest", True), + "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054, "Chest", True), + "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091, "Chest", True), + "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092, "Chest"), + "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093, "Chest"), + "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094, "Chest", True), + "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131, "Chest", True), + "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132, "Chest", True), + "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254, "Chest", True), + "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293, "Chest", True), + "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294, "Chest"), + "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331, "Chest"), + "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332, "Chest", True), + "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413, "Chest"), + "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414, "Chest"), + "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451, "Chest"), + "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452, "Chest"), + "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531, "Static"), + "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532, "Static"), + "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533, "Static"), + "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534, "Static"), + "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571, "Static"), + "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572, "Static"), + "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573, "Static", True), + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574, "Static"), + "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611, "Static"), + "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014, "Chest"), + "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051, "Chest"), + "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052, "Chest"), + "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053, "Chest"), + "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054, "Chest", True), + "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091, "Chest", True), + "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092, "Chest", True), + "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093, "Chest"), + "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094, "Chest"), + "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131, "Chest", True), + "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132, "Chest"), + "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134, "Chest"), + "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171, "Chest"), + "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172, "Chest"), + "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291, "Chest"), + "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292, "Chest", True), + "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294, "Chest"), + "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332, "Chest"), + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333, "Chest"), + "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334, "Chest"), + "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373, "Chest"), + "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454, "Chest", True), + "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491, "Chest"), + "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492, "Chest"), + "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493, "Chest"), + "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494, "Chest", True), + "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534, "Chest"), + "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571, "Chest"), + "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613, "Chest"), + "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614, "Chest"), + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651, "Chest"), + "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652, "Chest"), + "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653, "Chest"), + "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732, "Chest", True), + "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733, "Chest"), + "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734, "Chest"), + "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771, "Chest"), + "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772, "Chest", True), + "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773, "Chest", True), + "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774, "Chest"), + "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811, "Chest"), + "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812, "Chest"), + "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813, "Chest", True), + "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814, "Chest", True), + "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014, "Chest", True), + "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051, "Chest", True), + "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052, "Chest"), + "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053, "Chest", True), + "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054, "Chest"), + "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091, "Chest"), + "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092, "Chest", True), + "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093, "Chest"), + "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094, "Chest"), + "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131, "Chest"), + "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132, "Chest"), + "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133, "Chest"), + "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134, "Chest"), + "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171, "Chest", True), + "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172, "Chest", True), + "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173, "Chest", True), + "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174, "Chest", True), + "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211, "Chest", True), + "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213, "Chest", True), + "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214, "Static", True), + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253, "Static", True), + "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254, "Chest", True), + "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291, "Chest", True), + "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292, "Chest", True), + "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293, "Chest", True), + "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294, "Chest", True), + "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331, "Chest"), + "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332, "Chest"), + "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333, "Chest"), + "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334, "Chest"), + "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371, "Chest"), + "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372, "Chest"), + "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373, "Chest"), + "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374, "Chest"), + "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454, "Chest", True), + "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491, "Chest", True), + "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492, "Chest", True), + #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493, "Static"), --handled later + "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212, "Chest", True), + "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494, "Chest", True), + "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531, "Chest", True), + "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532, "Chest", True), + "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533, "Chest", True), + "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534, "Chest", True), + "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571, "Chest", True), + "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572, "Chest", True), + "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573, "Chest", True), + "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574, "Chest", True), + "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611, "Chest", True), + "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612, "Chest", True), + "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613, "Chest", True), + "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614, "Chest", True), + "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651, "Chest", True), + "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652, "Chest", True), + "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653, "Chest", True), + "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654, "Chest", True), + "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691, "Chest", True), + "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692, "Chest", True), + "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693, "Chest", True), + "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694, "Chest", True), + "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731, "Static", True), + "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732, "Chest", True), + "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733, "Chest", True), + "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734, "Chest", True), + "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771, "Chest", True), + "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772, "Chest", True), + "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Monstro", 265_5092, "Chest", True), + #"Awakening Chest": KH1LocationData("Awakening", 265_5093, "Chest"), missable - "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011), - "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012), - "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013), - "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014), - "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015), - "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016), - "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021), - "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022), - "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023), - "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024), - "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031), - "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033), - "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041), - "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042), - "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051), - "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052), - "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053), - "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054), - "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055), - "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056), - "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061), - "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062), - "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071), - "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072), - "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073), - "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081), - "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082), - "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083), - "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091), - "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092), - "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093), - "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094), - "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095), - "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096), - "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097), - "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101), - "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102), - "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103), - "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104), - "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105), - "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106), - "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111), + "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011, "Reward"), + "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012, "Static"), + "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013, "Static"), + "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014, "Reward"), + "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015, "Reward", True), + "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016, "Reward"), + "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021, "Reward", True), + "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022, "Static", True), + "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023, "Reward", True), + "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024, "Static", True), + "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031, "Static"), + "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033, "Reward", True), + "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041, "Static", True), + "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042, "Reward", True), + "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051, "Reward", True), + "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052, "Static", True), + "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053, "Static", True), + "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054, "Static", True), + "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055, "Reward", True), + "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056, "Static", True), + "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061, "Reward", True), + "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062, "Static", True), + "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071, "Reward", True), + "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072, "Static", True), + "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073, "Reward", True), + "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081, "Reward", True), + "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082, "Static", True), + "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083, "Reward", True), + "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091, "Reward", True), + "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092, "Static", True), + "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093, "Reward", True), + "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094, "Static", True), + "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095, "Reward", True), + "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096, "Static", True), + "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097, "Reward", True), + "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101, "Static", True), + "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102, "Reward", True), + "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103, "Reward", True), + "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104, "Reward", True), + "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105, "Reward", True), + "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106, "Static", True), + "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111, "Reward", True), + "Neverland Seal Keyhole Navi-G Piece Event": KH1LocationData("Neverland", 265_6112, "Static", True), + "Traverse Town Secret Waterway Navi Gummi Event": KH1LocationData("Traverse Town", 265_6113, "Static", True), - "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120), - "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121), - "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122), - "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123), - "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124), - "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125), - "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126), - "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127), - "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128), - "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129), + "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120, "Reward"), + "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121, "Reward"), + "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122, "Reward"), + "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123, "Reward"), + "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124, "Reward"), + "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125, "Reward"), + "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126, "Reward"), + "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127, "Reward"), + "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128, "Reward"), + "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129, "Reward"), - "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131), + "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131, "Static", True), + "Traverse Town Defeat Opposite Armor Navi-G Piece Event": KH1LocationData("Traverse Town", 265_6132, "Static", True), - "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201), - "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202), - "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203), - "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204), - "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205), - "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206), - "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207), - "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208), - "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209), - "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210), - "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211), - "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212), - "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213), - "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214), - "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215), - "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216), + "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201, "Static"), + "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202, "Static"), + "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203, "Static"), + "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204, "Static"), + "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205, "Static"), + "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206, "Static"), + "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207, "Static"), + "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208, "Static"), + "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209, "Static"), + "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210, "Static"), + "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211, "Static"), + "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212, "Static"), + "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213, "Static"), + "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214, "Static"), + "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215, "Static"), + "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216, "Static"), - #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300), - #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301), - #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302), - #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303), - "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304), - "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6305), - "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306), - "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6307), - "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6308), - "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309), - "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310), - "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311), - "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312), - "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313), - "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314), - "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315), - "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316), - "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317), - "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318), - "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319), - "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320), - "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321), - "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322), - "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324), - "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326), - "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327), - "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032), #Had to change the way we send this check, not changing location_id - "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328), - "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329), - "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330), - "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331), - #"Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332), - #"Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333), - #"Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334), - #"Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335), - #"Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336), - #"Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337), - #"Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338), - #"Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339), - #"Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340), - #"Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341), - #"Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342), - #"Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343), - "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349), - "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350), - "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351), - "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352), - "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353), - "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354), - "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355), - "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356), - "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357), - "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358), - "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359), - "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360), - "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361), - "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362), - "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363), - "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364), - "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365), - "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366), - "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367), - "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368), - "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369), - "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370), - "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371), - "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372), - "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373), - "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374), - "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375), - "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376), - "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377), - "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378), - "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379), - "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380), - "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381), - "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382), - "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383), - "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384), - "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385), - "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386), + #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300, "Static"), + #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301, "Static"), + #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302, "Static"), + #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303, "Reward"), + "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6305, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6307, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6308, "Static", True), + "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309, "Static", True), + "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310, "Static", True), + "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311, "Reward"), + "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312, "Reward"), + "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313, "Reward"), + "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314, "Static"), + "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315, "Static"), + "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316, "Static"), + "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317, "Reward"), + "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318, "Static"), + "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319, "Reward"), + "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320, "Reward"), + "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321, "Reward"), + "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322, "Static"), + "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324, "Reward"), + "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326, "Static"), + "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327, "Static"), + "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032, "Reward", True), #Had to change the way we send this check, not changing location_id + "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328, "Reward", True), + "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329, "Reward", True), + "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330, "Static", True), + "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331, "Static"), + "Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332, "Static", True), + "Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333, "Static", True), + "Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334, "Static", True), + "Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335, "Static", True), + "Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336, "Static", True), + "Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337, "Static", True), + "Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338, "Static", True), + "Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339, "Static", True), + "Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340, "Static", True), + "Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341, "Static", True), + "Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342, "Static", True), + "Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343, "Static", True), + "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349, "Static"), + "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350, "Reward"), + "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351, "Reward"), + "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352, "Reward"), + "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353, "Static"), + "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354, "Reward"), + "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355, "Reward"), + "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356, "Static"), + "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357, "Static"), + "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358, "Static"), + "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359, "Static"), + "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360, "Static"), + "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361, "Static"), + "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362, "Static"), + "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363, "Static"), + "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364, "Static"), + "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365, "Static"), + "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366, "Static"), + "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367, "Static"), + "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368, "Static"), + "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369, "Reward", True), + "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370, "Reward", True), + "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371, "Reward", True), + "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372, "Reward", True), + "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373, "Reward", True), + "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374, "Reward", True), + #"Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375, "Static"), + "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376, "Static"), + "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377, "Static"), + "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378, "Reward", True), + "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379, "Reward", True), + "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380, "Static", True), + "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381, "Static"), + "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382, "Static"), + "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383, "Static"), + "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384, "Static", True), + "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385, "Static", True), + "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386, "Static"), - "Traverse Town Synth Log": KH1LocationData("Traverse Town", 265_6401), - "Traverse Town Synth Cloth": KH1LocationData("Traverse Town", 265_6402), - "Traverse Town Synth Rope": KH1LocationData("Traverse Town", 265_6403), - "Traverse Town Synth Seagull Egg": KH1LocationData("Traverse Town", 265_6404), - "Traverse Town Synth Fish": KH1LocationData("Traverse Town", 265_6405), - "Traverse Town Synth Mushroom": KH1LocationData("Traverse Town", 265_6406), + "Traverse Town Synth 15 Items": KH1LocationData("Traverse Town", 265_6400, "Reward"), + "Traverse Town Synth Item 01": KH1LocationData("Traverse Town", 265_6401, "Synth"), + "Traverse Town Synth Item 02": KH1LocationData("Traverse Town", 265_6402, "Synth"), + "Traverse Town Synth Item 03": KH1LocationData("Traverse Town", 265_6403, "Synth"), + "Traverse Town Synth Item 04": KH1LocationData("Traverse Town", 265_6404, "Synth"), + "Traverse Town Synth Item 05": KH1LocationData("Traverse Town", 265_6405, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 07": KH1LocationData("Traverse Town", 265_6407, "Synth"), + "Traverse Town Synth Item 08": KH1LocationData("Traverse Town", 265_6408, "Synth"), + "Traverse Town Synth Item 09": KH1LocationData("Traverse Town", 265_6409, "Synth"), + "Traverse Town Synth Item 10": KH1LocationData("Traverse Town", 265_6410, "Synth"), + "Traverse Town Synth Item 11": KH1LocationData("Traverse Town", 265_6411, "Synth"), + "Traverse Town Synth Item 12": KH1LocationData("Traverse Town", 265_6412, "Synth"), + "Traverse Town Synth Item 13": KH1LocationData("Traverse Town", 265_6413, "Synth"), + "Traverse Town Synth Item 14": KH1LocationData("Traverse Town", 265_6414, "Synth"), + "Traverse Town Synth Item 15": KH1LocationData("Traverse Town", 265_6415, "Synth"), + "Traverse Town Synth Item 16": KH1LocationData("Traverse Town", 265_6416, "Synth"), + "Traverse Town Synth Item 17": KH1LocationData("Traverse Town", 265_6417, "Synth"), + "Traverse Town Synth Item 18": KH1LocationData("Traverse Town", 265_6418, "Synth"), + "Traverse Town Synth Item 19": KH1LocationData("Traverse Town", 265_6419, "Synth"), + "Traverse Town Synth Item 20": KH1LocationData("Traverse Town", 265_6420, "Synth"), + "Traverse Town Synth Item 21": KH1LocationData("Traverse Town", 265_6421, "Synth"), + "Traverse Town Synth Item 22": KH1LocationData("Traverse Town", 265_6422, "Synth"), + "Traverse Town Synth Item 23": KH1LocationData("Traverse Town", 265_6423, "Synth"), + "Traverse Town Synth Item 24": KH1LocationData("Traverse Town", 265_6424, "Synth"), + "Traverse Town Synth Item 25": KH1LocationData("Traverse Town", 265_6425, "Synth"), + "Traverse Town Synth Item 26": KH1LocationData("Traverse Town", 265_6426, "Synth"), + "Traverse Town Synth Item 27": KH1LocationData("Traverse Town", 265_6427, "Synth"), + "Traverse Town Synth Item 28": KH1LocationData("Traverse Town", 265_6428, "Synth"), + "Traverse Town Synth Item 29": KH1LocationData("Traverse Town", 265_6429, "Synth"), + "Traverse Town Synth Item 30": KH1LocationData("Traverse Town", 265_6430, "Synth"), + "Traverse Town Synth Item 31": KH1LocationData("Traverse Town", 265_6431, "Synth"), + "Traverse Town Synth Item 32": KH1LocationData("Traverse Town", 265_6432, "Synth"), + "Traverse Town Synth Item 33": KH1LocationData("Traverse Town", 265_6433, "Synth"), - "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500), - "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501), - "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502), - "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503), - "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504), - "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505), - "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506), - "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508), - "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516), - "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517), - "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518), - "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519), - #"Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520), - #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521), - "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522), - "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523), + "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500, "Static"), + "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501, "Static"), + "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502, "Static"), + "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503, "Static"), + "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504, "Static"), + "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505, "Static"), + "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506, "Static", True), + "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508, "Static"), + "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519, "Static", True), + "Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520, "Reward"), + #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521, "Reward"), + "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522, "Reward", True), + "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523, "Static", True), - "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018), - "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017), - "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016), - "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015), - "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014), - "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013), - "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012), - "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011), - "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028), - "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027), - "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026), - "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025), - "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024), - "Level 001": KH1LocationData("Levels", 265_8001), - "Level 002": KH1LocationData("Levels", 265_8002), - "Level 003": KH1LocationData("Levels", 265_8003), - "Level 004": KH1LocationData("Levels", 265_8004), - "Level 005": KH1LocationData("Levels", 265_8005), - "Level 006": KH1LocationData("Levels", 265_8006), - "Level 007": KH1LocationData("Levels", 265_8007), - "Level 008": KH1LocationData("Levels", 265_8008), - "Level 009": KH1LocationData("Levels", 265_8009), - "Level 010": KH1LocationData("Levels", 265_8010), - "Level 011": KH1LocationData("Levels", 265_8011), - "Level 012": KH1LocationData("Levels", 265_8012), - "Level 013": KH1LocationData("Levels", 265_8013), - "Level 014": KH1LocationData("Levels", 265_8014), - "Level 015": KH1LocationData("Levels", 265_8015), - "Level 016": KH1LocationData("Levels", 265_8016), - "Level 017": KH1LocationData("Levels", 265_8017), - "Level 018": KH1LocationData("Levels", 265_8018), - "Level 019": KH1LocationData("Levels", 265_8019), - "Level 020": KH1LocationData("Levels", 265_8020), - "Level 021": KH1LocationData("Levels", 265_8021), - "Level 022": KH1LocationData("Levels", 265_8022), - "Level 023": KH1LocationData("Levels", 265_8023), - "Level 024": KH1LocationData("Levels", 265_8024), - "Level 025": KH1LocationData("Levels", 265_8025), - "Level 026": KH1LocationData("Levels", 265_8026), - "Level 027": KH1LocationData("Levels", 265_8027), - "Level 028": KH1LocationData("Levels", 265_8028), - "Level 029": KH1LocationData("Levels", 265_8029), - "Level 030": KH1LocationData("Levels", 265_8030), - "Level 031": KH1LocationData("Levels", 265_8031), - "Level 032": KH1LocationData("Levels", 265_8032), - "Level 033": KH1LocationData("Levels", 265_8033), - "Level 034": KH1LocationData("Levels", 265_8034), - "Level 035": KH1LocationData("Levels", 265_8035), - "Level 036": KH1LocationData("Levels", 265_8036), - "Level 037": KH1LocationData("Levels", 265_8037), - "Level 038": KH1LocationData("Levels", 265_8038), - "Level 039": KH1LocationData("Levels", 265_8039), - "Level 040": KH1LocationData("Levels", 265_8040), - "Level 041": KH1LocationData("Levels", 265_8041), - "Level 042": KH1LocationData("Levels", 265_8042), - "Level 043": KH1LocationData("Levels", 265_8043), - "Level 044": KH1LocationData("Levels", 265_8044), - "Level 045": KH1LocationData("Levels", 265_8045), - "Level 046": KH1LocationData("Levels", 265_8046), - "Level 047": KH1LocationData("Levels", 265_8047), - "Level 048": KH1LocationData("Levels", 265_8048), - "Level 049": KH1LocationData("Levels", 265_8049), - "Level 050": KH1LocationData("Levels", 265_8050), - "Level 051": KH1LocationData("Levels", 265_8051), - "Level 052": KH1LocationData("Levels", 265_8052), - "Level 053": KH1LocationData("Levels", 265_8053), - "Level 054": KH1LocationData("Levels", 265_8054), - "Level 055": KH1LocationData("Levels", 265_8055), - "Level 056": KH1LocationData("Levels", 265_8056), - "Level 057": KH1LocationData("Levels", 265_8057), - "Level 058": KH1LocationData("Levels", 265_8058), - "Level 059": KH1LocationData("Levels", 265_8059), - "Level 060": KH1LocationData("Levels", 265_8060), - "Level 061": KH1LocationData("Levels", 265_8061), - "Level 062": KH1LocationData("Levels", 265_8062), - "Level 063": KH1LocationData("Levels", 265_8063), - "Level 064": KH1LocationData("Levels", 265_8064), - "Level 065": KH1LocationData("Levels", 265_8065), - "Level 066": KH1LocationData("Levels", 265_8066), - "Level 067": KH1LocationData("Levels", 265_8067), - "Level 068": KH1LocationData("Levels", 265_8068), - "Level 069": KH1LocationData("Levels", 265_8069), - "Level 070": KH1LocationData("Levels", 265_8070), - "Level 071": KH1LocationData("Levels", 265_8071), - "Level 072": KH1LocationData("Levels", 265_8072), - "Level 073": KH1LocationData("Levels", 265_8073), - "Level 074": KH1LocationData("Levels", 265_8074), - "Level 075": KH1LocationData("Levels", 265_8075), - "Level 076": KH1LocationData("Levels", 265_8076), - "Level 077": KH1LocationData("Levels", 265_8077), - "Level 078": KH1LocationData("Levels", 265_8078), - "Level 079": KH1LocationData("Levels", 265_8079), - "Level 080": KH1LocationData("Levels", 265_8080), - "Level 081": KH1LocationData("Levels", 265_8081), - "Level 082": KH1LocationData("Levels", 265_8082), - "Level 083": KH1LocationData("Levels", 265_8083), - "Level 084": KH1LocationData("Levels", 265_8084), - "Level 085": KH1LocationData("Levels", 265_8085), - "Level 086": KH1LocationData("Levels", 265_8086), - "Level 087": KH1LocationData("Levels", 265_8087), - "Level 088": KH1LocationData("Levels", 265_8088), - "Level 089": KH1LocationData("Levels", 265_8089), - "Level 090": KH1LocationData("Levels", 265_8090), - "Level 091": KH1LocationData("Levels", 265_8091), - "Level 092": KH1LocationData("Levels", 265_8092), - "Level 093": KH1LocationData("Levels", 265_8093), - "Level 094": KH1LocationData("Levels", 265_8094), - "Level 095": KH1LocationData("Levels", 265_8095), - "Level 096": KH1LocationData("Levels", 265_8096), - "Level 097": KH1LocationData("Levels", 265_8097), - "Level 098": KH1LocationData("Levels", 265_8098), - "Level 099": KH1LocationData("Levels", 265_8099), - "Level 100": KH1LocationData("Levels", 265_8100), - "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001), - "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002), - "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003), - "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004), - "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005), - "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006), - "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007), - "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008), - "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009), - "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010), - "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011), - "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012), - "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013), - "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014), - "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015), - "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016), - "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017), - "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018), - "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019), - "Final Ansem": KH1LocationData("Final", 265_9999) + "Traverse Town 1st District Blue Trinity by Exit Door": KH1LocationData("Traverse Town", 265_6600, "Prize"), + "Traverse Town 3rd District Blue Trinity": KH1LocationData("Traverse Town", 265_6601, "Prize"), + "Traverse Town Magician's Study Blue Trinity": KH1LocationData("Traverse Town", 265_6602, "Prize"), + "Wonderland Lotus Forest Blue Trinity in Alcove": KH1LocationData("Wonderland", 265_6603, "Prize"), + "Wonderland Lotus Forest Blue Trinity by Moving Boulder": KH1LocationData("Wonderland", 265_6604, "Prize"), + "Agrabah Bazaar Blue Trinity": KH1LocationData("Agrabah", 265_6605, "Prize"), + "Monstro Mouth Blue Trinity": KH1LocationData("Monstro", 265_6606, "Prize", True), + "Monstro Chamber 5 Blue Trinity": KH1LocationData("Monstro", 265_6607, "Prize"), + "Hollow Bastion Great Crest Blue Trinity": KH1LocationData("Hollow Bastion", 265_6608, "Prize", True), + "Hollow Bastion Dungeon Blue Trinity": KH1LocationData("Hollow Bastion", 265_6609, "Prize", True), + "Deep Jungle Treetop Green Trinity": KH1LocationData("Deep Jungle", 265_6610, "Prize"), + "Agrabah Cave of Wonders Treasure Room Red Trinity": KH1LocationData("Agrabah", 265_6611, "Prize", True), + "Monstro Throat Blue Trinity": KH1LocationData("Monstro", 265_6612, "Prize", True), + "Wonderland Bizarre Room Examine Flower Pot": KH1LocationData("Wonderland", 265_6613, "Prize"), + "Wonderland Lotus Forest Red Flowers on the Main Path": KH1LocationData("Wonderland", 265_6614, "Prize"), + "Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting": KH1LocationData("Wonderland", 265_6615, "Prize"), + "Wonderland Lotus Forest Yellow Elixir Flower Through Painting": KH1LocationData("Wonderland", 265_6616, "Prize"), + "Wonderland Lotus Forest Red Flower Raise Lily Pads": KH1LocationData("Wonderland", 265_6617, "Prize"), + "Wonderland Tea Party Garden Left Cushioned Chair": KH1LocationData("Wonderland", 265_6618, "Prize"), + "Wonderland Tea Party Garden Left Pink Chair": KH1LocationData("Wonderland", 265_6619, "Prize"), + "Wonderland Tea Party Garden Right Yellow Chair": KH1LocationData("Wonderland", 265_6620, "Prize"), + "Wonderland Tea Party Garden Left Gray Chair": KH1LocationData("Wonderland", 265_6621, "Prize"), + "Wonderland Tea Party Garden Right Brown Chair": KH1LocationData("Wonderland", 265_6622, "Prize"), + "Hollow Bastion Lift Stop from Waterway Examine Node": KH1LocationData("Hollow Bastion", 265_6623, "Prize", True), + + "Destiny Islands Seashore Capture Fish 1 (Day 2)": KH1LocationData("Destiny Islands", 265_6700, "Static"), + "Destiny Islands Seashore Capture Fish 2 (Day 2)": KH1LocationData("Destiny Islands", 265_6701, "Static"), + "Destiny Islands Seashore Capture Fish 3 (Day 2)": KH1LocationData("Destiny Islands", 265_6702, "Static"), + "Destiny Islands Seashore Gather Seagull Egg (Day 2)": KH1LocationData("Destiny Islands", 265_6703, "Static"), + "Destiny Islands Seashore Log on Riku's Island (Day 1)": KH1LocationData("Destiny Islands", 265_6704, "Static"), + "Destiny Islands Seashore Log under Bridge (Day 1)": KH1LocationData("Destiny Islands", 265_6705, "Static"), + "Destiny Islands Seashore Gather Cloth (Day 1)": KH1LocationData("Destiny Islands", 265_6706, "Static"), + "Destiny Islands Seashore Gather Rope (Day 1)": KH1LocationData("Destiny Islands", 265_6707, "Static"), + #"Destiny Islands Seashore Deliver Kairi Items (Day 1)": KH1LocationData("Destiny Islands", 265_6710, "Static"), + "Destiny Islands Secret Place Gather Mushroom (Day 2)": KH1LocationData("Destiny Islands", 265_6711, "Static"), + "Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)": KH1LocationData("Destiny Islands", 265_6712, "Static"), + "Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)": KH1LocationData("Destiny Islands", 265_6713, "Static"), + "Destiny Islands Cove Talk to Kairi (Day 2)": KH1LocationData("Destiny Islands", 265_6714, "Static"), + "Destiny Islands Gather Drinking Water (Day 2)": KH1LocationData("Destiny Islands", 265_6715, "Static"), + #"Destiny Islands Cove Deliver Kairi Items (Day 2)": KH1LocationData("Destiny Islands", 265_6716, "Static"), + + "Donald Starting Accessory 1": KH1LocationData("Traverse Town", 265_6800, "Starting Accessory"), + "Donald Starting Accessory 2": KH1LocationData("Traverse Town", 265_6801, "Starting Accessory"), + "Goofy Starting Accessory 1": KH1LocationData("Traverse Town", 265_6802, "Starting Accessory"), + "Goofy Starting Accessory 2": KH1LocationData("Traverse Town", 265_6803, "Starting Accessory"), + "Tarzan Starting Accessory 1": KH1LocationData("Deep Jungle", 265_6804, "Starting Accessory"), + "Aladdin Starting Accessory 1": KH1LocationData("Agrabah", 265_6805, "Starting Accessory"), + "Aladdin Starting Accessory 2": KH1LocationData("Agrabah", 265_6806, "Starting Accessory"), + "Ariel Starting Accessory 1": KH1LocationData("Atlantica", 265_6807, "Starting Accessory"), + "Ariel Starting Accessory 2": KH1LocationData("Atlantica", 265_6808, "Starting Accessory"), + "Ariel Starting Accessory 3": KH1LocationData("Atlantica", 265_6809, "Starting Accessory"), + "Jack Starting Accessory 1": KH1LocationData("Halloween Town", 265_6810, "Starting Accessory"), + "Jack Starting Accessory 2": KH1LocationData("Halloween Town", 265_6811, "Starting Accessory"), + "Peter Pan Starting Accessory 1": KH1LocationData("Neverland", 265_6812, "Starting Accessory"), + "Peter Pan Starting Accessory 2": KH1LocationData("Neverland", 265_6813, "Starting Accessory"), + "Beast Starting Accessory 1": KH1LocationData("Hollow Bastion", 265_6814, "Starting Accessory"), + + "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017, "Static", True), + "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015, "Static", True), + "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013, "Static", True), + "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012, "Static", True), + "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011, "Static", True), + "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027, "Static", True), + "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026, "Static", True), + "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025, "Static", True), + "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024, "Static", True), + #"Level 001 (Slot 1)": KH1LocationData("Levels", 265_8001, "Level Slot 1"), + "Level 002 (Slot 1)": KH1LocationData("Levels", 265_8002, "Level Slot 1"), + "Level 003 (Slot 1)": KH1LocationData("Levels", 265_8003, "Level Slot 1"), + "Level 004 (Slot 1)": KH1LocationData("Levels", 265_8004, "Level Slot 1"), + "Level 005 (Slot 1)": KH1LocationData("Levels", 265_8005, "Level Slot 1"), + "Level 006 (Slot 1)": KH1LocationData("Levels", 265_8006, "Level Slot 1"), + "Level 007 (Slot 1)": KH1LocationData("Levels", 265_8007, "Level Slot 1"), + "Level 008 (Slot 1)": KH1LocationData("Levels", 265_8008, "Level Slot 1"), + "Level 009 (Slot 1)": KH1LocationData("Levels", 265_8009, "Level Slot 1"), + "Level 010 (Slot 1)": KH1LocationData("Levels", 265_8010, "Level Slot 1"), + "Level 011 (Slot 1)": KH1LocationData("Levels", 265_8011, "Level Slot 1"), + "Level 012 (Slot 1)": KH1LocationData("Levels", 265_8012, "Level Slot 1"), + "Level 013 (Slot 1)": KH1LocationData("Levels", 265_8013, "Level Slot 1"), + "Level 014 (Slot 1)": KH1LocationData("Levels", 265_8014, "Level Slot 1"), + "Level 015 (Slot 1)": KH1LocationData("Levels", 265_8015, "Level Slot 1"), + "Level 016 (Slot 1)": KH1LocationData("Levels", 265_8016, "Level Slot 1"), + "Level 017 (Slot 1)": KH1LocationData("Levels", 265_8017, "Level Slot 1"), + "Level 018 (Slot 1)": KH1LocationData("Levels", 265_8018, "Level Slot 1"), + "Level 019 (Slot 1)": KH1LocationData("Levels", 265_8019, "Level Slot 1"), + "Level 020 (Slot 1)": KH1LocationData("Levels", 265_8020, "Level Slot 1"), + "Level 021 (Slot 1)": KH1LocationData("Levels", 265_8021, "Level Slot 1"), + "Level 022 (Slot 1)": KH1LocationData("Levels", 265_8022, "Level Slot 1"), + "Level 023 (Slot 1)": KH1LocationData("Levels", 265_8023, "Level Slot 1"), + "Level 024 (Slot 1)": KH1LocationData("Levels", 265_8024, "Level Slot 1"), + "Level 025 (Slot 1)": KH1LocationData("Levels", 265_8025, "Level Slot 1"), + "Level 026 (Slot 1)": KH1LocationData("Levels", 265_8026, "Level Slot 1"), + "Level 027 (Slot 1)": KH1LocationData("Levels", 265_8027, "Level Slot 1"), + "Level 028 (Slot 1)": KH1LocationData("Levels", 265_8028, "Level Slot 1"), + "Level 029 (Slot 1)": KH1LocationData("Levels", 265_8029, "Level Slot 1"), + "Level 030 (Slot 1)": KH1LocationData("Levels", 265_8030, "Level Slot 1"), + "Level 031 (Slot 1)": KH1LocationData("Levels", 265_8031, "Level Slot 1"), + "Level 032 (Slot 1)": KH1LocationData("Levels", 265_8032, "Level Slot 1"), + "Level 033 (Slot 1)": KH1LocationData("Levels", 265_8033, "Level Slot 1"), + "Level 034 (Slot 1)": KH1LocationData("Levels", 265_8034, "Level Slot 1"), + "Level 035 (Slot 1)": KH1LocationData("Levels", 265_8035, "Level Slot 1"), + "Level 036 (Slot 1)": KH1LocationData("Levels", 265_8036, "Level Slot 1"), + "Level 037 (Slot 1)": KH1LocationData("Levels", 265_8037, "Level Slot 1"), + "Level 038 (Slot 1)": KH1LocationData("Levels", 265_8038, "Level Slot 1"), + "Level 039 (Slot 1)": KH1LocationData("Levels", 265_8039, "Level Slot 1"), + "Level 040 (Slot 1)": KH1LocationData("Levels", 265_8040, "Level Slot 1"), + "Level 041 (Slot 1)": KH1LocationData("Levels", 265_8041, "Level Slot 1"), + "Level 042 (Slot 1)": KH1LocationData("Levels", 265_8042, "Level Slot 1"), + "Level 043 (Slot 1)": KH1LocationData("Levels", 265_8043, "Level Slot 1"), + "Level 044 (Slot 1)": KH1LocationData("Levels", 265_8044, "Level Slot 1"), + "Level 045 (Slot 1)": KH1LocationData("Levels", 265_8045, "Level Slot 1"), + "Level 046 (Slot 1)": KH1LocationData("Levels", 265_8046, "Level Slot 1"), + "Level 047 (Slot 1)": KH1LocationData("Levels", 265_8047, "Level Slot 1"), + "Level 048 (Slot 1)": KH1LocationData("Levels", 265_8048, "Level Slot 1"), + "Level 049 (Slot 1)": KH1LocationData("Levels", 265_8049, "Level Slot 1"), + "Level 050 (Slot 1)": KH1LocationData("Levels", 265_8050, "Level Slot 1"), + "Level 051 (Slot 1)": KH1LocationData("Levels", 265_8051, "Level Slot 1"), + "Level 052 (Slot 1)": KH1LocationData("Levels", 265_8052, "Level Slot 1"), + "Level 053 (Slot 1)": KH1LocationData("Levels", 265_8053, "Level Slot 1"), + "Level 054 (Slot 1)": KH1LocationData("Levels", 265_8054, "Level Slot 1"), + "Level 055 (Slot 1)": KH1LocationData("Levels", 265_8055, "Level Slot 1"), + "Level 056 (Slot 1)": KH1LocationData("Levels", 265_8056, "Level Slot 1"), + "Level 057 (Slot 1)": KH1LocationData("Levels", 265_8057, "Level Slot 1"), + "Level 058 (Slot 1)": KH1LocationData("Levels", 265_8058, "Level Slot 1"), + "Level 059 (Slot 1)": KH1LocationData("Levels", 265_8059, "Level Slot 1"), + "Level 060 (Slot 1)": KH1LocationData("Levels", 265_8060, "Level Slot 1"), + "Level 061 (Slot 1)": KH1LocationData("Levels", 265_8061, "Level Slot 1"), + "Level 062 (Slot 1)": KH1LocationData("Levels", 265_8062, "Level Slot 1"), + "Level 063 (Slot 1)": KH1LocationData("Levels", 265_8063, "Level Slot 1"), + "Level 064 (Slot 1)": KH1LocationData("Levels", 265_8064, "Level Slot 1"), + "Level 065 (Slot 1)": KH1LocationData("Levels", 265_8065, "Level Slot 1"), + "Level 066 (Slot 1)": KH1LocationData("Levels", 265_8066, "Level Slot 1"), + "Level 067 (Slot 1)": KH1LocationData("Levels", 265_8067, "Level Slot 1"), + "Level 068 (Slot 1)": KH1LocationData("Levels", 265_8068, "Level Slot 1"), + "Level 069 (Slot 1)": KH1LocationData("Levels", 265_8069, "Level Slot 1"), + "Level 070 (Slot 1)": KH1LocationData("Levels", 265_8070, "Level Slot 1"), + "Level 071 (Slot 1)": KH1LocationData("Levels", 265_8071, "Level Slot 1"), + "Level 072 (Slot 1)": KH1LocationData("Levels", 265_8072, "Level Slot 1"), + "Level 073 (Slot 1)": KH1LocationData("Levels", 265_8073, "Level Slot 1"), + "Level 074 (Slot 1)": KH1LocationData("Levels", 265_8074, "Level Slot 1"), + "Level 075 (Slot 1)": KH1LocationData("Levels", 265_8075, "Level Slot 1"), + "Level 076 (Slot 1)": KH1LocationData("Levels", 265_8076, "Level Slot 1"), + "Level 077 (Slot 1)": KH1LocationData("Levels", 265_8077, "Level Slot 1"), + "Level 078 (Slot 1)": KH1LocationData("Levels", 265_8078, "Level Slot 1"), + "Level 079 (Slot 1)": KH1LocationData("Levels", 265_8079, "Level Slot 1"), + "Level 080 (Slot 1)": KH1LocationData("Levels", 265_8080, "Level Slot 1"), + "Level 081 (Slot 1)": KH1LocationData("Levels", 265_8081, "Level Slot 1"), + "Level 082 (Slot 1)": KH1LocationData("Levels", 265_8082, "Level Slot 1"), + "Level 083 (Slot 1)": KH1LocationData("Levels", 265_8083, "Level Slot 1"), + "Level 084 (Slot 1)": KH1LocationData("Levels", 265_8084, "Level Slot 1"), + "Level 085 (Slot 1)": KH1LocationData("Levels", 265_8085, "Level Slot 1"), + "Level 086 (Slot 1)": KH1LocationData("Levels", 265_8086, "Level Slot 1"), + "Level 087 (Slot 1)": KH1LocationData("Levels", 265_8087, "Level Slot 1"), + "Level 088 (Slot 1)": KH1LocationData("Levels", 265_8088, "Level Slot 1"), + "Level 089 (Slot 1)": KH1LocationData("Levels", 265_8089, "Level Slot 1"), + "Level 090 (Slot 1)": KH1LocationData("Levels", 265_8090, "Level Slot 1"), + "Level 091 (Slot 1)": KH1LocationData("Levels", 265_8091, "Level Slot 1"), + "Level 092 (Slot 1)": KH1LocationData("Levels", 265_8092, "Level Slot 1"), + "Level 093 (Slot 1)": KH1LocationData("Levels", 265_8093, "Level Slot 1"), + "Level 094 (Slot 1)": KH1LocationData("Levels", 265_8094, "Level Slot 1"), + "Level 095 (Slot 1)": KH1LocationData("Levels", 265_8095, "Level Slot 1"), + "Level 096 (Slot 1)": KH1LocationData("Levels", 265_8096, "Level Slot 1"), + "Level 097 (Slot 1)": KH1LocationData("Levels", 265_8097, "Level Slot 1"), + "Level 098 (Slot 1)": KH1LocationData("Levels", 265_8098, "Level Slot 1"), + "Level 099 (Slot 1)": KH1LocationData("Levels", 265_8099, "Level Slot 1"), + "Level 100 (Slot 1)": KH1LocationData("Levels", 265_8100, "Level Slot 1"), + #"Level 001 (Slot 2)": KH1LocationData("Levels", 265_8101, "Level Slot 2"), + "Level 002 (Slot 2)": KH1LocationData("Levels", 265_8102, "Level Slot 2"), + "Level 003 (Slot 2)": KH1LocationData("Levels", 265_8103, "Level Slot 2"), + "Level 004 (Slot 2)": KH1LocationData("Levels", 265_8104, "Level Slot 2"), + "Level 005 (Slot 2)": KH1LocationData("Levels", 265_8105, "Level Slot 2"), + "Level 006 (Slot 2)": KH1LocationData("Levels", 265_8106, "Level Slot 2"), + "Level 007 (Slot 2)": KH1LocationData("Levels", 265_8107, "Level Slot 2"), + "Level 008 (Slot 2)": KH1LocationData("Levels", 265_8108, "Level Slot 2"), + "Level 009 (Slot 2)": KH1LocationData("Levels", 265_8109, "Level Slot 2"), + "Level 010 (Slot 2)": KH1LocationData("Levels", 265_8110, "Level Slot 2"), + "Level 011 (Slot 2)": KH1LocationData("Levels", 265_8111, "Level Slot 2"), + "Level 012 (Slot 2)": KH1LocationData("Levels", 265_8112, "Level Slot 2"), + "Level 013 (Slot 2)": KH1LocationData("Levels", 265_8113, "Level Slot 2"), + "Level 014 (Slot 2)": KH1LocationData("Levels", 265_8114, "Level Slot 2"), + "Level 015 (Slot 2)": KH1LocationData("Levels", 265_8115, "Level Slot 2"), + "Level 016 (Slot 2)": KH1LocationData("Levels", 265_8116, "Level Slot 2"), + "Level 017 (Slot 2)": KH1LocationData("Levels", 265_8117, "Level Slot 2"), + "Level 018 (Slot 2)": KH1LocationData("Levels", 265_8118, "Level Slot 2"), + "Level 019 (Slot 2)": KH1LocationData("Levels", 265_8119, "Level Slot 2"), + "Level 020 (Slot 2)": KH1LocationData("Levels", 265_8120, "Level Slot 2"), + "Level 021 (Slot 2)": KH1LocationData("Levels", 265_8121, "Level Slot 2"), + "Level 022 (Slot 2)": KH1LocationData("Levels", 265_8122, "Level Slot 2"), + "Level 023 (Slot 2)": KH1LocationData("Levels", 265_8123, "Level Slot 2"), + "Level 024 (Slot 2)": KH1LocationData("Levels", 265_8124, "Level Slot 2"), + "Level 025 (Slot 2)": KH1LocationData("Levels", 265_8125, "Level Slot 2"), + "Level 026 (Slot 2)": KH1LocationData("Levels", 265_8126, "Level Slot 2"), + "Level 027 (Slot 2)": KH1LocationData("Levels", 265_8127, "Level Slot 2"), + "Level 028 (Slot 2)": KH1LocationData("Levels", 265_8128, "Level Slot 2"), + "Level 029 (Slot 2)": KH1LocationData("Levels", 265_8129, "Level Slot 2"), + "Level 030 (Slot 2)": KH1LocationData("Levels", 265_8130, "Level Slot 2"), + "Level 031 (Slot 2)": KH1LocationData("Levels", 265_8131, "Level Slot 2"), + "Level 032 (Slot 2)": KH1LocationData("Levels", 265_8132, "Level Slot 2"), + "Level 033 (Slot 2)": KH1LocationData("Levels", 265_8133, "Level Slot 2"), + "Level 034 (Slot 2)": KH1LocationData("Levels", 265_8134, "Level Slot 2"), + "Level 035 (Slot 2)": KH1LocationData("Levels", 265_8135, "Level Slot 2"), + "Level 036 (Slot 2)": KH1LocationData("Levels", 265_8136, "Level Slot 2"), + "Level 037 (Slot 2)": KH1LocationData("Levels", 265_8137, "Level Slot 2"), + "Level 038 (Slot 2)": KH1LocationData("Levels", 265_8138, "Level Slot 2"), + "Level 039 (Slot 2)": KH1LocationData("Levels", 265_8139, "Level Slot 2"), + "Level 040 (Slot 2)": KH1LocationData("Levels", 265_8140, "Level Slot 2"), + "Level 041 (Slot 2)": KH1LocationData("Levels", 265_8141, "Level Slot 2"), + "Level 042 (Slot 2)": KH1LocationData("Levels", 265_8142, "Level Slot 2"), + "Level 043 (Slot 2)": KH1LocationData("Levels", 265_8143, "Level Slot 2"), + "Level 044 (Slot 2)": KH1LocationData("Levels", 265_8144, "Level Slot 2"), + "Level 045 (Slot 2)": KH1LocationData("Levels", 265_8145, "Level Slot 2"), + "Level 046 (Slot 2)": KH1LocationData("Levels", 265_8146, "Level Slot 2"), + "Level 047 (Slot 2)": KH1LocationData("Levels", 265_8147, "Level Slot 2"), + "Level 048 (Slot 2)": KH1LocationData("Levels", 265_8148, "Level Slot 2"), + "Level 049 (Slot 2)": KH1LocationData("Levels", 265_8149, "Level Slot 2"), + "Level 050 (Slot 2)": KH1LocationData("Levels", 265_8150, "Level Slot 2"), + "Level 051 (Slot 2)": KH1LocationData("Levels", 265_8151, "Level Slot 2"), + "Level 052 (Slot 2)": KH1LocationData("Levels", 265_8152, "Level Slot 2"), + "Level 053 (Slot 2)": KH1LocationData("Levels", 265_8153, "Level Slot 2"), + "Level 054 (Slot 2)": KH1LocationData("Levels", 265_8154, "Level Slot 2"), + "Level 055 (Slot 2)": KH1LocationData("Levels", 265_8155, "Level Slot 2"), + "Level 056 (Slot 2)": KH1LocationData("Levels", 265_8156, "Level Slot 2"), + "Level 057 (Slot 2)": KH1LocationData("Levels", 265_8157, "Level Slot 2"), + "Level 058 (Slot 2)": KH1LocationData("Levels", 265_8158, "Level Slot 2"), + "Level 059 (Slot 2)": KH1LocationData("Levels", 265_8159, "Level Slot 2"), + "Level 060 (Slot 2)": KH1LocationData("Levels", 265_8160, "Level Slot 2"), + "Level 061 (Slot 2)": KH1LocationData("Levels", 265_8161, "Level Slot 2"), + "Level 062 (Slot 2)": KH1LocationData("Levels", 265_8162, "Level Slot 2"), + "Level 063 (Slot 2)": KH1LocationData("Levels", 265_8163, "Level Slot 2"), + "Level 064 (Slot 2)": KH1LocationData("Levels", 265_8164, "Level Slot 2"), + "Level 065 (Slot 2)": KH1LocationData("Levels", 265_8165, "Level Slot 2"), + "Level 066 (Slot 2)": KH1LocationData("Levels", 265_8166, "Level Slot 2"), + "Level 067 (Slot 2)": KH1LocationData("Levels", 265_8167, "Level Slot 2"), + "Level 068 (Slot 2)": KH1LocationData("Levels", 265_8168, "Level Slot 2"), + "Level 069 (Slot 2)": KH1LocationData("Levels", 265_8169, "Level Slot 2"), + "Level 070 (Slot 2)": KH1LocationData("Levels", 265_8170, "Level Slot 2"), + "Level 071 (Slot 2)": KH1LocationData("Levels", 265_8171, "Level Slot 2"), + "Level 072 (Slot 2)": KH1LocationData("Levels", 265_8172, "Level Slot 2"), + "Level 073 (Slot 2)": KH1LocationData("Levels", 265_8173, "Level Slot 2"), + "Level 074 (Slot 2)": KH1LocationData("Levels", 265_8174, "Level Slot 2"), + "Level 075 (Slot 2)": KH1LocationData("Levels", 265_8175, "Level Slot 2"), + "Level 076 (Slot 2)": KH1LocationData("Levels", 265_8176, "Level Slot 2"), + "Level 077 (Slot 2)": KH1LocationData("Levels", 265_8177, "Level Slot 2"), + "Level 078 (Slot 2)": KH1LocationData("Levels", 265_8178, "Level Slot 2"), + "Level 079 (Slot 2)": KH1LocationData("Levels", 265_8179, "Level Slot 2"), + "Level 080 (Slot 2)": KH1LocationData("Levels", 265_8180, "Level Slot 2"), + "Level 081 (Slot 2)": KH1LocationData("Levels", 265_8181, "Level Slot 2"), + "Level 082 (Slot 2)": KH1LocationData("Levels", 265_8182, "Level Slot 2"), + "Level 083 (Slot 2)": KH1LocationData("Levels", 265_8183, "Level Slot 2"), + "Level 084 (Slot 2)": KH1LocationData("Levels", 265_8184, "Level Slot 2"), + "Level 085 (Slot 2)": KH1LocationData("Levels", 265_8185, "Level Slot 2"), + "Level 086 (Slot 2)": KH1LocationData("Levels", 265_8186, "Level Slot 2"), + "Level 087 (Slot 2)": KH1LocationData("Levels", 265_8187, "Level Slot 2"), + "Level 088 (Slot 2)": KH1LocationData("Levels", 265_8188, "Level Slot 2"), + "Level 089 (Slot 2)": KH1LocationData("Levels", 265_8189, "Level Slot 2"), + "Level 090 (Slot 2)": KH1LocationData("Levels", 265_8190, "Level Slot 2"), + "Level 091 (Slot 2)": KH1LocationData("Levels", 265_8191, "Level Slot 2"), + "Level 092 (Slot 2)": KH1LocationData("Levels", 265_8192, "Level Slot 2"), + "Level 093 (Slot 2)": KH1LocationData("Levels", 265_8193, "Level Slot 2"), + "Level 094 (Slot 2)": KH1LocationData("Levels", 265_8194, "Level Slot 2"), + "Level 095 (Slot 2)": KH1LocationData("Levels", 265_8195, "Level Slot 2"), + "Level 096 (Slot 2)": KH1LocationData("Levels", 265_8196, "Level Slot 2"), + "Level 097 (Slot 2)": KH1LocationData("Levels", 265_8197, "Level Slot 2"), + "Level 098 (Slot 2)": KH1LocationData("Levels", 265_8198, "Level Slot 2"), + "Level 099 (Slot 2)": KH1LocationData("Levels", 265_8199, "Level Slot 2"), + "Level 100 (Slot 2)": KH1LocationData("Levels", 265_8200, "Level Slot 2"), + "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001, "Static", True), + "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002, "Reward", True), + "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003, "Reward", True), + "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004, "Reward", True), + "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005, "Reward", True), + "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006, "Reward", True), + "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007, "Reward", True), + "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008, "Reward", True), + "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009, "Reward", True), + "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010, "Reward", True), + "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011, "Reward", True), + "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012, "Reward", True), + "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013, "Reward", True), + "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014, "Reward", True), + "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015, "Static", True), + "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016, "Static", True), + "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017, "Static", True), + "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018, "Reward", True), + "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019, "Static", True) } -event_location_table: Dict[str, KH1LocationData] = {} +event_location_table: Dict[str, KH1LocationData] = { + "Final Ansem": KH1LocationData("Homecoming", 265_9999, "None", True) +} lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 7a79d5c1..1bdc478a 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -6,8 +6,9 @@ class StrengthIncrease(Range): """ Determines the number of Strength Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "STR Increases" range_start = 0 @@ -18,8 +19,9 @@ class DefenseIncrease(Range): """ Determines the number of Defense Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "DEF Increases" range_start = 0 @@ -30,8 +32,9 @@ class HPIncrease(Range): """ Determines the number of HP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "HP Increases" range_start = 0 @@ -42,8 +45,9 @@ class APIncrease(Range): """ Determines the number of AP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "AP Increases" range_start = 0 @@ -54,8 +58,9 @@ class MPIncrease(Range): """ Determines the number of MP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "MP Increases" range_start = 0 @@ -66,8 +71,9 @@ class AccessorySlotIncrease(Range): """ Determines the number of Accessory Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Accessory Slot Increases" range_start = 0 @@ -78,8 +84,9 @@ class ItemSlotIncrease(Range): """ Determines the number of Item Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Item Slot Increases" range_start = 0 @@ -104,29 +111,45 @@ class SuperBosses(Toggle): """ display_name = "Super Bosses" -class Cups(Toggle): +class Cups(Choice): """ - Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups. - Please note that the cup items will still appear in the multiworld even if toggled off, as they are required to challenge Sephiroth. + Determines which cups have their locations added to the multiworld. + + Please note that the cup items will still appear in the multiworld even if set to off, as they are required to challenge Sephiroth. + + Off: All cup locations are removed + + Cups: Phil, Pegasus, and Hercules cups are included + + Hades Cup: Hades Cup is included in addition to Phil, Pegasus, and Hercules cups. If Super Bosses are enabled, then Ice Titan is included """ display_name = "Cups" + option_off = 0 + option_cups = 1 + option_hades_cup = 2 + default = 0 -class Goal(Choice): +class FinalRestDoorKey(Choice): """ - Determines when victory is achieved in your playthrough. + Determines what grants the player the Final Rest Door Key. Sephiroth: Defeat Sephiroth + Unknown: Defeat Unknown - Postcards: Turn in all 10 postcards in Traverse Town + + Postcards: Turn in an amount of postcards in Traverse Town + Final Ansem: Enter End of the World and defeat Ansem as normal - Puppies: Rescue and return all 99 puppies in Traverse Town + + Puppies: Rescue and return an amount of puppies in Traverse Town + Final Rest: Open the chest in End of the World Final Rest """ - display_name = "Goal" + display_name = "Final Rest Door Key" option_sephiroth = 0 option_unknown = 1 option_postcards = 2 - option_final_ansem = 3 + option_lucky_emblems = 3 option_puppies = 4 option_final_rest = 5 default = 3 @@ -135,89 +158,115 @@ class EndoftheWorldUnlock(Choice): """Determines how End of the World is unlocked. Item: You can receive an item called "End of the World" which unlocks the world - Reports: A certain amount of reports are required to unlock End of the World, which is defined in your options""" + + Lucky Emblems: A certain amount of lucky emblems are required to unlock End of the World, which is defined in your options""" display_name = "End of the World Unlock" option_item = 0 - option_reports = 1 + option_lucky_emblems = 1 default = 1 -class FinalRestDoor(Choice): - """Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem. +class RequiredPostcards(Range): + """ + If "Final Rest Door Key" is set to "Postcards", defines how many postcards are required. + """ + display_name = "Required Postcards" + default = 8 + range_start = 1 + range_end = 10 + +class RequiredPuppies(Choice): + """ + If "Final Rest Door Key" is set to "Puppies", defines how many puppies are required. + """ + display_name = "Required Puppies" + default = 80 + option_10 = 10 + option_20 = 20 + option_30 = 30 + option_40 = 40 + option_50 = 50 + option_60 = 60 + option_70 = 70 + option_80 = 80 + option_90 = 90 + option_99 = 99 + +class PuppyValue(Range): + """ + Determines how many dalmatian puppies are given when a puppy item is found. + """ + display_name = "Puppy Value" + default = 3 + range_start = 1 + range_end = 99 + +class RandomizePuppies(DefaultOnToggle): + """ + If OFF, the "Puppy" item is worth 3 puppies and puppies are placed in vanilla locations. - Reports: A certain number of Ansem's Reports are required, determined by the "Reports to Open Final Rest Door" option - Puppies: Having all 99 puppies is required - Postcards: Turning in all 10 postcards is required - Superbosses: Defeating Sephiroth, Unknown, Kurt Zisa, and Phantom are required + If ON, the "Puppy" item is worth an amount of puppies defined by "Puppy Value", and are shuffled randomly. """ - display_name = "Final Rest Door" - option_reports = 0 - option_puppies = 1 - option_postcards = 2 - option_superbosses = 3 - -class Puppies(Choice): - """ - Determines how dalmatian puppies are shuffled into the pool. - Full: All puppies are in one location - Triplets: Puppies are found in triplets just as they are in the base game - Individual: One puppy can be found per location - """ - display_name = "Puppies" - option_full = 0 - option_triplets = 1 - option_individual = 2 - default = 1 + display_name = "Randomize Puppies" class EXPMultiplier(NamedRange): """ Determines the multiplier to apply to EXP gained. """ display_name = "EXP Multiplier" - default = 16 - range_start = default // 4 + default = 16 * 4 + range_start = 16 // 4 range_end = 128 special_range_names = { - "0.25x": int(default // 4), - "0.5x": int(default // 2), - "1x": default, - "2x": default * 2, - "3x": default * 3, - "4x": default * 4, - "8x": default * 8, + "0.25x": int(16 // 4), + "0.5x": int(16 // 2), + "1x": 16, + "2x": 16 * 2, + "3x": 16 * 3, + "4x": 16 * 4, + "8x": 16 * 8, } -class RequiredReportsEotW(Range): +class RequiredLuckyEmblemsEotW(Range): """ - If End of the World Unlock is set to "Reports", determines the number of Ansem's Reports required to open End of the World. + If End of the World Unlock is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open End of the World" - default = 4 + display_name = "Lucky Emblems to Open End of the World" + default = 7 range_start = 0 - range_end = 13 + range_end = 20 -class RequiredReportsDoor(Range): +class RequiredLuckyEmblemsDoor(Range): """ - If Final Rest Door is set to "Reports", determines the number of Ansem's Reports required to manifest the door in Final Rest to challenge Ansem. + If Final Rest Door Key is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open Final Rest Door" - default = 4 + display_name = "Lucky Emblems to Open Final Rest Door" + default = 10 range_start = 0 - range_end = 13 + range_end = 20 -class ReportsInPool(Range): +class LuckyEmblemsInPool(Range): """ - Determines the number of Ansem's Reports in the item pool. + Determines the number of Lucky Emblems in the item pool. """ - display_name = "Reports in Pool" - default = 4 + display_name = "Lucky Emblems in Pool" + default = 13 range_start = 0 - range_end = 13 + range_end = 20 -class RandomizeKeybladeStats(DefaultOnToggle): +class KeybladeStats(Choice): """ Determines whether Keyblade stats should be randomized. + + Randomize: Randomly generates STR and MP bonuses for each keyblade between the defined minimums and maximums. + + Shuffle: Shuffles the stats of the vanilla keyblades amongst each other. + + Vanilla: Keyblade stats are unchanged. """ - display_name = "Randomize Keyblade Stats" + display_name = "Keyblade Stats" + option_randomize = 0 + option_shuffle = 1 + option_vanilla = 2 class KeybladeMinStrength(Range): """ @@ -237,6 +286,60 @@ class KeybladeMaxStrength(Range): range_start = 0 range_end = 20 +class KeybladeMinCritRateBonus(Range): + """ + Determines the minimum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 200 + +class KeybladeMaxCritRateBonus(Range): + """ + Determines the maximum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 200 + range_start = 0 + range_end = 200 + +class KeybladeMinCritSTRBonus(Range): + """ + Determines the minimum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 16 + +class KeybladeMaxCritSTRBonus(Range): + """ + Determines the maximum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 16 + range_start = 0 + range_end = 16 + +class KeybladeMinRecoil(Range): + """ + Determines the minimum recoil a keyblade can have. + """ + display_name = "Keyblade Minimum Recoil" + default = 1 + range_start = 1 + range_end = 90 + +class KeybladeMaxRecoil(Range): + """ + Determines the maximum recoil a keyblade can have. + """ + display_name = "Keyblade Maximum Recoil" + default = 90 + range_start = 1 + range_end = 90 + class KeybladeMinMP(Range): """ Determines the minimum MP bonus a keyblade can have. @@ -260,31 +363,43 @@ class LevelChecks(Range): Determines the maximum level for which checks can be obtained. """ display_name = "Level Checks" - default = 100 + default = 99 range_start = 0 - range_end = 100 + range_end = 99 class ForceStatsOnLevels(NamedRange): """ If this value is less than the value for Level Checks, this determines the minimum level from which only stat ups are obtained at level up locations. - For example, if you want to be able to find any multiworld item from levels 1-50, then just stat ups for levels 51-100, set this value to 51. + + For example, if you want to be able to find any multiworld item from levels 2-50, then just stat ups for levels 51-100, set this value to 51. """ display_name = "Force Stats on Level Starting From" - default = 1 - range_start = 1 + default = 2 + range_start = 2 range_end = 101 special_range_names = { "none": 101, "multiworld-to-level-50": 51, - "all": 1 + "all": 2 } class BadStartingWeapons(Toggle): """ - Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have bad stats. + Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have vanilla stats. """ display_name = "Bad Starting Weapons" +class DeathLink(Choice): + """ + If Sora is KO'ed, the other players with "Death Link" on will also be KO'ed. + The opposite is also true. + """ + display_name = "Death Link" + option_off = 0 + option_toggle = 1 + option_on = 2 + default = 0 + class DonaldDeathLink(Toggle): """ If Donald is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone who enabled death link. @@ -300,35 +415,61 @@ class GoofyDeathLink(Toggle): class KeybladesUnlockChests(Toggle): """ If toggled on, the player is required to have a certain keyblade to open chests in certain worlds. + TT - Lionheart + WL - Lady Luck + OC - Olympia + DJ - Jungle King + AG - Three Wishes + MS - Wishing Star + HT - Pumpkinhead + NL - Fairy Harp + HB - Divine Rose + EotW - Oblivion - HAW - Oathkeeper + + HAW - Spellbinder + + DI - Oathkeeper Note: Does not apply to Atlantica, the emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently. """ display_name = "Keyblades Unlock Chests" -class InteractInBattle(Toggle): +class InteractInBattle(DefaultOnToggle): """ Allow Sora to talk to people, examine objects, and open chests in battle. """ display_name = "Interact in Battle" -class AdvancedLogic(Toggle): +class LogicDifficulty(Choice): """ - If on, logic may expect you to do advanced skips like using Combo Master, Dumbo, and other unusual methods to reach locations. - """ - display_name = "Advanced Logic" + Determines what the randomizer logic may expect you to do to reach certain locations. -class ExtraSharedAbilities(Toggle): + Beginner: Logic only expects what would be the natural solution in vanilla gameplay or similar, as well as a guarantee of tools for boss fights. + + Normal: Logic expects some clever use of abilities, exploration of options, and competent combat ability; generally does not require advanced knowledge. + + Proud: Logic expects advanced knowledge of tricks and obscure interactions, such as using Combo Master, Dumbo, and other unusual methods to reach locations. + + Minimal: Logic expects the bare minimum to get to locations; may require extensive grinding, beating fights with no tools, and performing very difficult or tedious tricks. + """ + display_name = "Logic Difficulty" + option_beginner = 0 + option_normal = 5 + option_proud = 10 + option_minimal = 15 + default = 5 + +class ExtraSharedAbilities(DefaultOnToggle): """ If on, adds extra shared abilities to the pool. These can stack, so multiple high jumps make you jump higher and multiple glides make you superglide faster. """ @@ -340,51 +481,361 @@ class EXPZeroInPool(Toggle): """ display_name = "EXP Zero in Pool" -class VanillaEmblemPieces(DefaultOnToggle): +class RandomizeEmblemPieces(Toggle): """ - If on, the Hollow Bastion emblem pieces are in their vanilla locations. + If off, the Hollow Bastion emblem pieces are in their vanilla locations. """ - display_name = "Vanilla Emblem Pieces" + display_name = "Randomize Emblem Pieces" + +class RandomizePostcards(Choice): + """ + Determines how Postcards are randomized + + All: All Postcards are randomized + + Chests: Only the 3 Postcards in chests are randomized + + Vanilla: Postcards are in their original location + """ + display_name = "Randomize Postcards" + option_all = 0 + option_chests = 1 + option_vanilla = 2 + +class JungleSlider(Toggle): + """ + Determines whether checks are behind the Jungle Slider minigame. + """ + display_name = "Jungle Slider" class StartingWorlds(Range): """ - Number of random worlds to start with in addition to Traverse Town, which is always available. Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + Number of random worlds to start with in addition to Traverse Town, which is always available. + + Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + + These are given by the server, and are received after connection. """ display_name = "Starting Worlds" - default = 0 + default = 4 range_start = 0 range_end = 10 + +class StartingTools(DefaultOnToggle): + """ + Determines whether you start with Scan and Dodge Roll. + + These are given by the server, and are received after connection. + """ + display_name = "Starting Tools" + +class RemoteItems(Choice): + """ + Determines if items can be placed on locations in your own world in such a way that will force them to be remote items. + + Off: When your items are placed in your world, they can only be placed in locations that they can be acquired without server connection (stats on levels, items in chests, etc). + + Allow: When your items are placed in your world, items that normally can't be placed in a location in-game are simply made remote (abilities on static events, etc). + + Full: All items are remote. Use this when doing something like a co-op seed. + """ + display_name = "Remote Items" + option_off = 0 + option_allow = 1 + option_full = 2 + default = 0 + +class Slot2LevelChecks(Range): + """ + Determines how many levels have an additional item. Usually, this item is an ability. + + If Remote Items is OFF, these checks will only contain abilities. + """ + display_name = "Slot 2 Level Checks" + default = 0 + range_start = 0 + range_end = 33 + +class ShortenGoMode(DefaultOnToggle): + """ + If on, the player warps to the final cutscene after defeating Ansem 1 > Darkside > Ansem 2, skipping World of Chaos. + """ + display_name = "Shorten Go Mode" + +class DestinyIslands(Toggle): + """ + If on, Adds a Destiny Islands item and a number of Raft Materials items to the pool. + + When "Destiny Islands" is found, Traverse Town will have an additional place to land - Seashore. + + "Raft Materials" allow progress into Day 2 and to Homecoming. The amount is defined in Day 2 Materials and Homecoming Materials. + """ + display_name = "Destiny Islands" + +class MythrilInPool(Range): + """ + Determines how much Mythril, one of the two synthesis items, is in the item pool. + + You need 16 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 16 + range_end = 30 + +class OrichalcumInPool(Range): + """ + Determines how much Orichalcum, one of the two synthesis items, is in the item pool. + + You need 17 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 17 + range_end = 30 + +class MythrilPrice(Range): + """ + Determines the cost of Mythril in each shop. + """ + display_name = "Mythril Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OrichalcumPrice(Range): + """ + Determines the cost of Orichalcum in each shop. + """ + display_name = "Orichalcum Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OneHP(Toggle): + """ + If on, forces Sora's max HP to 1 and removes the low health warning sound. + """ + display_name = "One HP" + +class FourByThree(Toggle): + """ + If on, changes the aspect ratio to 4 by 3. + """ + display_name = "4 by 3" + +class AutoAttack(Toggle): + """ + If on, you can combo by holding confirm. + """ + display_name = "Auto Attack" + +class BeepHack(Toggle): + """ + If on, removes low health warning sound. Works up to max health of 41. + """ + display_name = "Beep Hack" + +class ConsistentFinishers(Toggle): + """ + If on, 30% chance finishers are now 100% chance. + """ + display_name = "Consistent Finishers" + +class EarlySkip(DefaultOnToggle): + """ + If on, allows skipping cutscenes immediately that normally take time to be able to skip. + """ + display_name = "Early Skip" + +class FastCamera(Toggle): + """ + If on, speeds up camera movement and camera centering. + """ + display_name = "Fast Camera" + +class FasterAnimations(DefaultOnToggle): + """ + If on, speeds up animations during which you can't play. + """ + display_name = "Faster Animations" + +class Unlock0Volume(Toggle): + """ + If on, volume 1 mutes the audio channel. + """ + display_name = "Unlock 0 Volume" + +class Unskippable(DefaultOnToggle): + """ + If on, makes unskippable cutscenes skippable. + """ + display_name = "Unskippable" + +class AutoSave(DefaultOnToggle): + """ + If on, enables auto saving. + + Press L1+L2+R1+R2+D-Pad Left to instantly load continue state. + + Press L1+L2+R1+R2+D-Pad Right to instantly load autosave. + """ + display_name = "AutoSave" + +class WarpAnywhere(Toggle): + """ + If on, enables the player to warp at any time, even when not at a save point. + + Press L1+L2+R2+Select to open the Save/Warp menu at any time. + """ + display_name = "WarpAnywhere" + +class RandomizePartyMemberStartingAccessories(DefaultOnToggle): + """ + If on, the 10 accessories that some party members (Aladdin, Ariel, Jack, Peter Pan, Beast) start with are randomized. + + 10 random accessories will be distributed amongst any party member aside from Sora in their starting equipment. + """ + display_name = "Randomize Party Member Starting Accessories" + +class MaxLevelForSlot2LevelChecks(Range): + """ + Determines the max level for slot 2 level checks. + """ + display_name = "Max Level for Slot 2 Level Checks" + default = 50 + range_start = 2 + range_end = 100 + +class RandomizeAPCosts(Choice): + """ + Off: No randomization + Shuffle: Ability AP Costs will be shuffled amongst themselves. + + Randomize: Ability AP Costs will be randomized to the specified max and min. + + Distribute: Ability AP Costs will totalled and re-distributed randomly between the specified max and min. + """ + display_name = "Randomize AP Costs" + option_off = 0 + option_shuffle = 1 + option_randomize = 2 + option_distribute = 3 + default = 0 + +class MaxAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the max AP cost an ability can have. + """ + display_name = "Max AP Cost" + default = 5 + range_start = 4 + range_end = 9 + +class MinAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the min AP cost an ability can have. + """ + display_name = "Min AP Cost" + default = 0 + range_start = 0 + range_end = 2 + +class Day2Materials(Range): + """ + The amount of Raft Materials required to access Day 2. + """ + display_name = "Day 2 Materials" + default = 4 + range_start = 0 + range_end = 20 + +class HomecomingMaterials(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Homecoming Materials" + default = 10 + range_start = 0 + range_end = 20 + +class MaterialsInPool(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Materials in Pool" + default = 16 + range_start = 0 + range_end = 20 + +class StackingWorldItems(DefaultOnToggle): + """ + Multiple world items give you the world's associated key item. + + WL - Footprints + + OC - Entry Pass + + DJ - Slides + + HT - Forget-Me-Not and Jack-In-The-Box + + HB - Theon Vol. 6 + + Adds an extra world to the pool for each that has a key item (WL, OC, DJ, HT, HB). + + Forces Halloween Town Key Item Bundle ON. + """ + display_name = "Stacking World Items" + +class HalloweenTownKeyItemBundle(DefaultOnToggle): + """ + Obtaining the Forget-Me-Not automatically gives Jack-in-the-Box as well. + + Removes Jack-in-the-Box from the pool. + """ + display_name = "Halloween Town Key Item Bundle" @dataclass class KH1Options(PerGameCommonOptions): - goal: Goal + final_rest_door_key: FinalRestDoorKey end_of_the_world_unlock: EndoftheWorldUnlock - final_rest_door: FinalRestDoor - required_reports_eotw: RequiredReportsEotW - required_reports_door: RequiredReportsDoor - reports_in_pool: ReportsInPool + required_lucky_emblems_eotw: RequiredLuckyEmblemsEotW + required_lucky_emblems_door: RequiredLuckyEmblemsDoor + lucky_emblems_in_pool: LuckyEmblemsInPool + required_postcards: RequiredPostcards + required_puppies: RequiredPuppies super_bosses: SuperBosses atlantica: Atlantica hundred_acre_wood: HundredAcreWood cups: Cups - puppies: Puppies + randomize_puppies: RandomizePuppies + puppy_value: PuppyValue starting_worlds: StartingWorlds keyblades_unlock_chests: KeybladesUnlockChests interact_in_battle: InteractInBattle exp_multiplier: EXPMultiplier - advanced_logic: AdvancedLogic + logic_difficulty: LogicDifficulty extra_shared_abilities: ExtraSharedAbilities exp_zero_in_pool: EXPZeroInPool - vanilla_emblem_pieces: VanillaEmblemPieces + randomize_emblem_pieces: RandomizeEmblemPieces + randomize_postcards: RandomizePostcards donald_death_link: DonaldDeathLink goofy_death_link: GoofyDeathLink - randomize_keyblade_stats: RandomizeKeybladeStats + keyblade_stats: KeybladeStats bad_starting_weapons: BadStartingWeapons keyblade_min_str: KeybladeMinStrength keyblade_max_str: KeybladeMaxStrength + keyblade_min_crit_rate: KeybladeMinCritRateBonus + keyblade_max_crit_rate: KeybladeMaxCritRateBonus + keyblade_min_crit_str: KeybladeMinCritSTRBonus + keyblade_max_crit_str: KeybladeMaxCritSTRBonus + keyblade_min_recoil: KeybladeMinRecoil + keyblade_max_recoil: KeybladeMaxRecoil keyblade_min_mp: KeybladeMinMP keyblade_max_mp: KeybladeMaxMP level_checks: LevelChecks + slot_2_level_checks: Slot2LevelChecks force_stats_on_levels: ForceStatsOnLevels strength_increase: StrengthIncrease defense_increase: DefenseIncrease @@ -394,26 +845,68 @@ class KH1Options(PerGameCommonOptions): accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease start_inventory_from_pool: StartInventoryPool + jungle_slider: JungleSlider + starting_tools: StartingTools + remote_items: RemoteItems + shorten_go_mode: ShortenGoMode + death_link: DeathLink + destiny_islands: DestinyIslands + orichalcum_in_pool: OrichalcumInPool + orichalcum_price: OrichalcumPrice + mythril_in_pool: MythrilInPool + mythril_price: MythrilPrice + one_hp: OneHP + four_by_three: FourByThree + auto_attack: AutoAttack + beep_hack: BeepHack + consistent_finishers: ConsistentFinishers + early_skip: EarlySkip + fast_camera: FastCamera + faster_animations: FasterAnimations + unlock_0_volume: Unlock0Volume + unskippable: Unskippable + auto_save: AutoSave + warp_anywhere: WarpAnywhere + randomize_party_member_starting_accessories: RandomizePartyMemberStartingAccessories + max_level_for_slot_2_level_checks: MaxLevelForSlot2LevelChecks + randomize_ap_costs: RandomizeAPCosts + max_ap_cost: MaxAPCost + min_ap_cost: MinAPCost + day_2_materials: Day2Materials + homecoming_materials: HomecomingMaterials + materials_in_pool: MaterialsInPool + stacking_world_items: StackingWorldItems + halloween_town_key_item_bundle: HalloweenTownKeyItemBundle + kh1_option_groups = [ OptionGroup("Goal", [ - Goal, + FinalRestDoorKey, EndoftheWorldUnlock, - FinalRestDoor, - RequiredReportsDoor, - RequiredReportsEotW, - ReportsInPool, + RequiredLuckyEmblemsDoor, + RequiredLuckyEmblemsEotW, + LuckyEmblemsInPool, + RequiredPostcards, + RequiredPuppies, + DestinyIslands, + Day2Materials, + HomecomingMaterials, + MaterialsInPool, ]), OptionGroup("Locations", [ SuperBosses, Atlantica, Cups, HundredAcreWood, - VanillaEmblemPieces, + JungleSlider, + RandomizeEmblemPieces, + RandomizePostcards, ]), OptionGroup("Levels", [ EXPMultiplier, LevelChecks, + Slot2LevelChecks, + MaxLevelForSlot2LevelChecks, ForceStatsOnLevels, StrengthIncrease, DefenseIncrease, @@ -425,21 +918,58 @@ kh1_option_groups = [ ]), OptionGroup("Keyblades", [ KeybladesUnlockChests, - RandomizeKeybladeStats, + KeybladeStats, BadStartingWeapons, - KeybladeMaxStrength, KeybladeMinStrength, - KeybladeMaxMP, + KeybladeMaxStrength, + KeybladeMinCritRateBonus, + KeybladeMaxCritRateBonus, + KeybladeMinCritSTRBonus, + KeybladeMaxCritSTRBonus, + KeybladeMinRecoil, + KeybladeMaxRecoil, KeybladeMinMP, + KeybladeMaxMP, + ]), + OptionGroup("Synth", [ + OrichalcumInPool, + OrichalcumPrice, + MythrilInPool, + MythrilPrice, + ]), + OptionGroup("AP Costs", [ + RandomizeAPCosts, + MaxAPCost, + MinAPCost ]), OptionGroup("Misc", [ StartingWorlds, - Puppies, + StartingTools, + RandomizePuppies, + PuppyValue, InteractInBattle, - AdvancedLogic, + LogicDifficulty, ExtraSharedAbilities, + StackingWorldItems, + HalloweenTownKeyItemBundle, EXPZeroInPool, + RandomizePartyMemberStartingAccessories, + DeathLink, DonaldDeathLink, GoofyDeathLink, + RemoteItems, + ShortenGoMode, + OneHP, + FourByThree, + AutoAttack, + BeepHack, + ConsistentFinishers, + EarlySkip, + FastCamera, + FasterAnimations, + Unlock0Volume, + Unskippable, + AutoSave, + WarpAnywhere ]) ] diff --git a/worlds/kh1/Presets.py b/worlds/kh1/Presets.py index 77b43b76..33949a24 100644 --- a/worlds/kh1/Presets.py +++ b/worlds/kh1/Presets.py @@ -3,24 +3,33 @@ from typing import Any, Dict from .Options import * kh1_option_presets: Dict[str, Dict[str, Any]] = { - # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough reports. + # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough lucky emblems. "Final Ansem": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -30,40 +39,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, - "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, + "starting_worlds": 4, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Puppies are found individually, and the goal is to return them all. "Puppy Hunt": { - "goal": Goal.option_puppies, + "final_rest_door_key": FinalRestDoorKey.option_puppies, "end_of_the_world_unlock": EndoftheWorldUnlock.option_item, - "final_rest_door": FinalRestDoor.option_puppies, - "required_reports_eotw": 13, - "required_reports_door": 13, - "reports_in_pool": 13, + "required_lucky_emblems_eotw": 13, + "required_lucky_emblems_door": 13, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": False, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -73,40 +125,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_individual, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 1, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Advanced playthrough with most settings on. "Advanced": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": True, "atlantica": True, "hundred_acre_wood": True, - "cups": True, - "vanilla_emblem_pieces": False, + "cups": Cups.option_off, + "jungle_slider": True, + "randomize_emblem_pieces": True, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -116,40 +211,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": True, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": True, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, + "starting_tools": True, "interact_in_battle": True, - "advanced_logic": True, + "logic_difficulty": LogicDifficulty.option_proud, "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": True, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Playthrough meant to enhance the level 1 experience. "Level 1": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, "exp_multiplier": 16, "level_checks": 0, - "force_stats_on_levels": 101, + "slot_2_level_checks": 0, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 0, "defense_increase": 0, "hp_increase": 0, @@ -158,20 +296,54 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 5, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": True, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False } } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6189adf2..ac622ce0 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,12 +9,16 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, options): +def create_regions(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + regions: Dict[str, KH1RegionData] = { - "Menu": KH1RegionData([], ["Awakening", "Levels"]), - "Awakening": KH1RegionData([], ["Destiny Islands"]), - "Destiny Islands": KH1RegionData([], ["Traverse Town"]), - "Traverse Town": KH1RegionData([], ["World Map"]), + "Menu": KH1RegionData([], ["Awakening", "Levels", "World Map"]), + "Awakening": KH1RegionData([], []), + "Destiny Islands": KH1RegionData([], []), + "Traverse Town": KH1RegionData([], []), "Wonderland": KH1RegionData([], []), "Olympus Coliseum": KH1RegionData([], []), "Deep Jungle": KH1RegionData([], []), @@ -27,17 +31,27 @@ def create_regions(multiworld: MultiWorld, player: int, options): "End of the World": KH1RegionData([], []), "100 Acre Wood": KH1RegionData([], []), "Levels": KH1RegionData([], []), - "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", + "Homecoming": KH1RegionData([], []), + "World Map": KH1RegionData([], ["Destiny Islands", "Traverse Town", + "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", - "End of the World", "100 Acre Wood"]) + "End of the World", "100 Acre Wood", "Homecoming"]) } + + if not options.atlantica: + del regions["Atlantica"] + regions["World Map"].region_exits.remove("Atlantica") + if not options.destiny_islands: + del regions["Destiny Islands"] + regions["World Map"].region_exits.remove("Destiny Islands") # Set up locations regions["Agrabah"].locations.append("Agrabah Aladdin's House Main Street Entrance Chest") regions["Agrabah"].locations.append("Agrabah Aladdin's House Plaza Entrance Chest") regions["Agrabah"].locations.append("Agrabah Alley Chest") regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest") + regions["Agrabah"].locations.append("Agrabah Bazaar Blue Trinity") regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest") @@ -59,6 +73,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Above Fire Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Red Trinity") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") @@ -96,15 +111,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Center Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Left Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Right Chest") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Jungle King Event") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Red Trinity Event") regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event") + regions["Deep Jungle"].locations.append("Deep Jungle Treetop Green Trinity") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Beneath Tree House Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Rooftop Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas") @@ -138,7 +149,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["End of the World"].locations.append("End of the World World Terminus Atlantica Chest") regions["End of the World"].locations.append("End of the World World Terminus Deep Jungle Chest") regions["End of the World"].locations.append("End of the World World Terminus Halloween Town Chest") - #regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") + regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") regions["End of the World"].locations.append("End of the World World Terminus Neverland Chest") regions["End of the World"].locations.append("End of the World World Terminus Olympus Coliseum Chest") regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest") @@ -181,6 +192,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon By Candles Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Corner Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)") @@ -192,6 +204,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Steps Right Side Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest") @@ -203,6 +216,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop from Waterway Examine Node") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node Gravity Chest") @@ -230,6 +244,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest") + regions["Monstro"].locations.append("Monstro Chamber 5 Blue Trinity") regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest") @@ -240,26 +255,28 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event") + regions["Monstro"].locations.append("Monstro Mouth Blue Trinity") regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest") regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest") regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest") + regions["Monstro"].locations.append("Monstro Throat Blue Trinity") regions["Neverland"].locations.append("Neverland Cabin Chest") regions["Neverland"].locations.append("Neverland Captain's Cabin Chest") - #regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") regions["Neverland"].locations.append("Neverland Clock Tower Chest") regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") @@ -276,6 +293,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest") regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Navi-G Piece Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event") @@ -292,14 +310,16 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest") #regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest") + regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity by Exit Door") regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest") - #regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") + regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") - regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") + #regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest") regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") + regions["Traverse Town"].locations.append("Traverse Town 3rd District Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest") @@ -310,6 +330,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Dodge Roll Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Fire Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") + regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Navi-G Piece Event") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1") @@ -329,6 +350,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest") regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event") regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All Arts Items") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV1 Magic") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV3 Magic") @@ -357,26 +379,62 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 1") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 2") regions["Traverse Town"].locations.append("Traverse Town Red Room Chest") + regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Navi Gummi Event") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest") - regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") - regions["Traverse Town"].locations.append("Traverse Town Synth Fish") - regions["Traverse Town"].locations.append("Traverse Town Synth Log") - regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - regions["Traverse Town"].locations.append("Traverse Town Synth Rope") - regions["Traverse Town"].locations.append("Traverse Town Synth Seagull Egg") + regions["Traverse Town"].locations.append("Traverse Town Synth 15 Items") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 01") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 02") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 03") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 04") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 05") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 06") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 07") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 08") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 09") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 10") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 11") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 12") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 13") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 14") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 15") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 16") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 17") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 18") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 19") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 20") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 21") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 22") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 23") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 24") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 25") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 26") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 27") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 28") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 29") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 30") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 31") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 32") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 33") + regions["Wonderland"].locations.append("Wonderland Bizarre Room Examine Flower Pot") regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity in Alcove") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity by Moving Boulder") regions["Wonderland"].locations.append("Wonderland Lotus Forest Corner Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Glide Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Nut Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flower Raise Lily Pads") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flowers on the Main Path") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Elixir Flower Through Painting") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Red Chest") @@ -388,6 +446,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Cushioned Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Gray Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Pink Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Brown Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Yellow Chair") if options.hundred_acre_wood: regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Left Cliff Chest") @@ -440,7 +503,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - if options.cups: + if options.cups.current_key != "off": regions["Olympus Coliseum"].locations.append("Complete Phil Cup") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Time Trial") @@ -450,50 +513,84 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Olympus Coliseum"].locations.append("Complete Hercules Cup") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup": + regions["Olympus Coliseum"].locations.append("Complete Hades Cup") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup" and options.super_bosses: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") if options.super_bosses: regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") - for i in range(options.level_checks): - regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0')) - if options.goal.current_key == "final_ansem": - regions["End of the World"].locations.append("Final Ansem") + if options.jungle_slider: + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") + for i in range(1,options.level_checks+1): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 1)") + if i+1 in kh1world.get_slot_2_levels(): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 2)") + if options.destiny_islands: + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 1 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 2 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 3 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Seagull Egg (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log on Riku's Island (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log under Bridge (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Cloth (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Rope (Day 1)") + #regions["Destiny Islands"].locations.append("Destiny Islands Seashore Deliver Kairi Items (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Secret Place Gather Mushroom (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Talk to Kairi (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Gather Drinking Water (Day 2)") + #regions["Destiny Islands"].locations.append("Destiny Islands Cove Deliver Kairi Items (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Chest") + regions["Homecoming"].locations.append("Final Ansem") + + for location in kh1world.get_starting_accessory_locations(): + regions[location_table[location].category].locations.append(location) # Set up the regions correctly. for name, data in regions.items(): multiworld.regions.append(create_region(multiworld, player, name, data)) - -def connect_entrances(multiworld: MultiWorld, player: int): +def connect_entrances(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + multiworld.get_entrance("Awakening", player).connect(multiworld.get_region("Awakening", player)) - multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) + if options.destiny_islands: + multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) multiworld.get_entrance("Traverse Town", player).connect(multiworld.get_region("Traverse Town", player)) multiworld.get_entrance("Wonderland", player).connect(multiworld.get_region("Wonderland", player)) multiworld.get_entrance("Olympus Coliseum", player).connect(multiworld.get_region("Olympus Coliseum", player)) multiworld.get_entrance("Deep Jungle", player).connect(multiworld.get_region("Deep Jungle", player)) multiworld.get_entrance("Agrabah", player).connect(multiworld.get_region("Agrabah", player)) multiworld.get_entrance("Monstro", player).connect(multiworld.get_region("Monstro", player)) - multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) + if options.atlantica: + multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) multiworld.get_entrance("Halloween Town", player).connect(multiworld.get_region("Halloween Town", player)) multiworld.get_entrance("Neverland", player).connect(multiworld.get_region("Neverland", player)) multiworld.get_entrance("Hollow Bastion", player).connect(multiworld.get_region("Hollow Bastion", player)) @@ -501,7 +598,7 @@ def connect_entrances(multiworld: MultiWorld, player: int): multiworld.get_entrance("100 Acre Wood", player).connect(multiworld.get_region("100 Acre Wood", player)) multiworld.get_entrance("World Map", player).connect(multiworld.get_region("World Map", player)) multiworld.get_entrance("Levels", player).connect(multiworld.get_region("Levels", player)) - + multiworld.get_entrance("Homecoming", player).connect(multiworld.get_region("Homecoming", player)) def create_region(multiworld: MultiWorld, player: int, name: str, data: KH1RegionData): region = Region(name, player, multiworld) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 130238e5..54a94326 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,41 +1,69 @@ from BaseClasses import CollectionState -from worlds.generic.Rules import add_rule +from worlds.generic.Rules import add_rule, add_item_rule from math import ceil +from BaseClasses import ItemClassification +from .Data import WORLD_KEY_ITEMS, LOGIC_BEGINNER, LOGIC_NORMAL, LOGIC_PROUD, LOGIC_MINIMAL -SINGLE_PUPPIES = ["Puppy " + str(i).rjust(2,"0") for i in range(1,100)] -TRIPLE_PUPPIES = ["Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0") for i in range(1,34)] -TORN_PAGES = ["Torn Page " + str(i) for i in range(1,6)] -WORLDS = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World"] -KEYBLADES = ["Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion"] +from .Locations import KH1Location, location_table +from .Items import KH1Item, item_table -def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: - worlds_acquired = 0.0 - for i in range(len(WORLDS)): - if state.has(WORLDS[i], player): - worlds_acquired = worlds_acquired + 0.5 - if (state.has(WORLDS[i], player) and (not keyblades_unlock_chests or state.has(KEYBLADES[i], player))) or (state.has(WORLDS[i], player) and WORLDS[i] == "Atlantica"): - worlds_acquired = worlds_acquired + 0.5 - return worlds_acquired >= num_of_worlds +WORLDS = ["Destiny Islands", "Traverse Town", "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World", "100 Acre Wood"] +KEYBLADES = ["Oathkeeper", "Lionheart", "Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion", "Spellbinder"] +BROKEN_KEYBLADE_LOCKING_LOCATIONS = [ + "End of the World Final Dimension 2nd Chest", + "End of the World Final Dimension 4th Chest", + "End of the World Final Dimension 7th Chest", + "End of the World Final Dimension 8th Chest", + "End of the World Final Dimension 10th Chest", + "Neverland Hold Aero Chest", + "Hollow Bastion Library 1st Floor Turn the Carousel Chest", + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest", + "Hollow Bastion Entrance Hall Emblem Piece (Chest)", + "Atlantica Sunken Ship In Flipped Boat Chest", + "Atlantica Sunken Ship Seabed Chest", + "Atlantica Sunken Ship Inside Ship Chest", + "Atlantica Ariel's Grotto High Chest", + "Atlantica Ariel's Grotto Middle Chest", + "Atlantica Ariel's Grotto Low Chest", + "Atlantica Ursula's Lair Use Fire on Urchin Chest", + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest", + "Atlantica Triton's Palace White Trinity Chest", + "Atlantica Sunken Ship Crystal Trident Event" +] -def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: +def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + worlds_acquired = 0.0 + for i in range(len(WORLDS)): + if WORLDS[i] == "Traverse Town": + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif WORLDS[i] == "100 Acre Wood" and hundred_acre_wood: + if state.has("Progressive Fire", player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif state.has(WORLDS[i], player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + return worlds_acquired >= num_of_worlds + +def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: return state.has_all({ "Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Statue)", "Emblem Piece (Fountain)", - "Hollow Bastion"}, player) and has_x_worlds(state, player, 5, keyblades_unlock_chests) + "Hollow Bastion"}, player) and has_x_worlds(state, player, 6, keyblades_unlock_chests, logic_difficulty, hundred_acre_wood) -def has_puppies_all(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has("All Puppies", player) - -def has_puppies_triplets(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(TRIPLE_PUPPIES, player, ceil(puppies_required / 3)) - -def has_puppies_individual(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(SINGLE_PUPPIES, player, puppies_required) - -def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: - return state.count_from_list_unique(TORN_PAGES, player) >= pages_required +def has_puppies(state: CollectionState, player: int, puppies_required: int, puppy_value: int) -> bool: + return (state.count("Puppy", player) * puppy_value) >= puppies_required def has_all_arts(state: CollectionState, player: int) -> bool: return state.has_all({"Fire Arts", "Blizzard Arts", "Thunder Arts", "Cure Arts", "Gravity Arts", "Stop Arts", "Aero Arts"}, player) @@ -53,198 +81,248 @@ def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: "Progressive Aero": level, "Progressive Stop": level}, player) -def has_offensive_magic(state: CollectionState, player: int) -> bool: - return state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Gravity", "Progressive Stop"}, player) - -def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: - return state.has_group_unique("Reports", player, eotw_required_reports) - -def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool, puppies_choice: str): - if final_rest_door_requirement == "reports": - return state.has_group_unique("Reports", player, final_rest_door_required_reports) - if final_rest_door_requirement == "puppies": - if puppies_choice == "individual": - return has_puppies_individual(state, player, 99) - if puppies_choice == "triplets": - return has_puppies_triplets(state, player, 99) - return has_puppies_all(state, player, 99) - if final_rest_door_requirement == "postcards": - return state.has("Postcard", player, 10) - if final_rest_door_requirement == "superbosses": - return ( - state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup", "Entry Pass"}, player) - and has_emblems(state, player, keyblades_unlock_chests) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_x_worlds(state, player, 7, keyblades_unlock_chests) - ) - -def has_defensive_tools(state: CollectionState, player: int) -> bool: +def has_offensive_magic(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( + state.has_any({"Progressive Fire", "Progressive Blizzard"}, player) + or (logic_difficulty > LOGIC_NORMAL and state.has_any({"Progressive Thunder", "Progressive Gravity"}, player)) + or (logic_difficulty > LOGIC_PROUD and state.has("Progressive Stop", player)) + ) + +def has_lucky_emblems(state: CollectionState, player: int, required_amt: int) -> bool: + return state.has("Lucky Emblem", player, required_amt) + +def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_lucky_emblems: int): + if final_rest_door_requirement == "lucky_emblems": + return state.has("Lucky Emblem", player, final_rest_door_required_lucky_emblems) + else: + return state.has("Final Door Key", player) + +def has_defensive_tools(state: CollectionState, player: int, logic_difficulty: int) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + return ( state.has_all_counts({"Progressive Cure": 2, "Leaf Bracer": 1, "Dodge Roll": 1}, player) and state.has_any_count({"Second Chance": 1, "MP Rage": 1, "Progressive Aero": 2}, player) ) +def has_basic_tools(state: CollectionState, player: int) -> bool: + return ( + state.has_all({"Dodge Roll", "Progressive Cure"}, player) + and state.has_any({"Combo Master", "Strike Raid", "Sonic Blade", "Counterattack"}, player) + and state.has_any({"Leaf Bracer", "Second Chance", "Guard"}, player) + and has_offensive_magic(state, player, 6) + ) + def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( state.has("Dumbo", player) and state.has_group("Magic", player) ) -def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: +def has_oogie_manor(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( - state.has("Progressive Fire", player) - or (advanced_logic and state.has("High Jump", player, 2)) - or (advanced_logic and state.has("High Jump", player) and state.has("Progressive Glide", player)) + state.has("Progressive Fire", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2) or (state.has_all({"High Jump", "Progressive Glide"}, player))) + or (logic_difficulty > LOGIC_PROUD and state.has_any({"High Jump", "Progressive Glide"}, player)) ) +def has_item_workshop(state: CollectionState, player: int, logic_difficulty: int) -> bool: + return ( + state.has("Green Trinity", player) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) + ) + +def has_parasite_cage(state: CollectionState, player: int, logic_difficulty: int, worlds: bool) -> bool: + return ( + state.has("Monstro", player) + and + ( + state.has("High Jump", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + ) + and worlds + ) + +def has_key_item(state: CollectionState, player: int, key_item: str, stacking_world_items: bool, halloween_town_key_item_bundle: bool, difficulty: int, keyblades_unlock_chests: bool): + return ( + ( + state.has(key_item, player) + or (stacking_world_items and state.has(WORLD_KEY_ITEMS[key_item], player, 2)) + or (key_item == "Jack-In-The-Box" and state.has("Forget-Me-Not", player) and halloween_town_key_item_bundle) + ) + # Adding this to make sure that if a beginner logic player is playing with keyblade locking, + # anything that would require the Crystal Trident should expect the player to be able to + # open the Crystal Trident chest. + and (key_item != "Crystal Trident" or difficulty > LOGIC_BEGINNER or not keyblades_unlock_chests or state.has("Crabclaw", player)) + ) + def set_rules(kh1world): - multiworld = kh1world.multiworld - player = kh1world.player - options = kh1world.options - eotw_required_reports = kh1world.determine_reports_required_to_open_end_of_the_world() - final_rest_door_required_reports = kh1world.determine_reports_required_to_open_final_rest_door() - final_rest_door_requirement = kh1world.options.final_rest_door.current_key - - has_puppies = has_puppies_individual - if kh1world.options.puppies == "triplets": - has_puppies = has_puppies_triplets - elif kh1world.options.puppies == "full": - has_puppies = has_puppies_all + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + eotw_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_end_of_the_world() + final_rest_door_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_final_rest_door() + final_rest_door_requirement = kh1world.options.final_rest_door_key.current_key + day_2_materials = kh1world.options.day_2_materials.value + homecoming_materials = kh1world.options.homecoming_materials.value + difficulty = kh1world.options.logic_difficulty.value # difficulty > 0 is Normal or higher; difficulty > 5 is Proud or higher; difficulty > 10 is Minimal and higher; others are for if another difficulty is added + stacking_world_items = kh1world.options.stacking_world_items.value + halloween_town_key_item_bundle = kh1world.options.halloween_town_key_item_bundle.value + end_of_the_world_unlock = kh1world.options.end_of_the_world_unlock.current_key + hundred_acre_wood = kh1world.options.hundred_acre_wood + add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), lambda state: state.has("Progressive Blizzard", player)) + add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), # this check could justifiably require high jump for Beginners + lambda state: state.has("High Jump", player)) or difficulty > LOGIC_BEGINNER add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), lambda state: ( state.has("Progressive Fire", player) and ( state.has("Yellow Trinity", player) - or (options.advanced_logic and state.has("High Jump", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) ) )) add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) + add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), lambda state: ( (state.has("Blue Trinity", player) and state.has("Progressive Glide", player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), lambda state: ( + state.has("Progressive Fire", player) + and ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and ( - (state.has("High Jump", player) and state.has("Yellow Trinity", player)) - or state.has("High Jump", player, 2) + state.has("High Jump", player, 3) + or + ( + state.has("Combo Master", player) + and + ( + state.has("High Jump", player, 2) + or + ( + state.has("High Jump", player) + and state.has("Air Combo Plus", player, 2) + #or state.has("Yellow Trinity", player) + ) + ) + ) ) - and state.has("Combo Master", player) ) or ( - options.advanced_logic - and state.has("Mermaid Kick", player) + difficulty > LOGIC_PROUD + and + ( + state.has("Mermaid Kick", player) + or state.has("Combo Master", player) and (state.has("High Jump", player) or state.has("Air Combo Plus", player, 2)) + ) ) ) - and state.has("Progressive Fire", player) )) add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), lambda state: state.has("Red Trinity", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: ( + has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_NORMAL and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or difficulty > LOGIC_PROUD + )) + add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or can_dumbo_skip(state, player)) - and state.has("Footprints", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), lambda state: ( - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER and state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), @@ -252,289 +330,330 @@ def set_rules(kh1world): state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), lambda state: ( - - state.has("Footprints", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 3) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 3) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints", - "Combo Master"}, player) + difficulty > LOGIC_NORMAL + and + ( + ( + state.has_all({"High Jump", "Combo Master"}, player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or (state.has("High Jump", player, 2) and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + ) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Footprints"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), lambda state: ( - - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or + ( + difficulty > LOGIC_BEGINNER + and (state.has("High Jump", player) + or state.has("Progressive Glide", player)) + ) + or + difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Slides"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), lambda state: ( state.has("Progressive Glide", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), lambda state: ( + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or ( - state.has_all({ - "High Jump", - "Progressive Glide"}, player) - or + difficulty > LOGIC_NORMAL + and ( - options.advanced_logic - and - ( - state.has("Combo Master", player) - or can_dumbo_skip(state, player) - ) + state.has("High Jump", player, 2) + or state.has("Progressive Glide", player) + or state.has_all({"High Jump", "Combo Master"}, player) ) ) - or state.has("High Jump", player, 3) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) # can_dumbo_skip(state, player) )) add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), lambda state: ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or can_dumbo_skip(state, player) + or state.has("High Jump", player) + ) + ) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), lambda state: ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), lambda state: state.has("White Trinity", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) - )) add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL + )) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), + lambda state: state.has_any({"High Jump", "Progressive Glide"}, player) or difficulty > LOGIC_BEGINNER) + add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), + lambda state: ( + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Forget-Me-Not"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Forget-Me-Not", player)) + lambda state: has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and ( state.has("Progressive Glide", player) - or options.advanced_logic + or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) + or difficulty > LOGIC_PROUD ) )) add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has("Progressive Glide", player)) + # difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2) + # difficulty > LOGIC_NORMAL and state.has("Combo Master", player) or state.has("High Jump", player) + # difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has_all({"High Jump", "Progressive Glide"})) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Red Trinity"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), lambda state: ( - state.has("High Jump", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and (state.has("High Jump", player) or state.has("Progressive Glide", player))) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and - ( - state.has("Progressive Glide", player) - or state.has("High Jump", player) - or options.advanced_logic - ) - )) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) - )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and + ( + state.has("Progressive Glide", player) + or state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + ) + )) + add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), @@ -548,37 +667,47 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), lambda state: ( ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) ) and state.has("Green Trinity", player) )) + add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump","Progressive Glide"}, player) or has_basic_tools)) + add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), + lambda state: ( + state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER + )) add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("High Jump", player)) + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), lambda state: ( @@ -598,27 +727,23 @@ def set_rules(kh1world): lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: ( - state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - )) + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), #might be possible with CM and 2ACP lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) @@ -633,87 +758,99 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), lambda state: ( state.has("Progressive Glide", player) - or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests)) - or (options.advanced_logic and state.has("Combo Master", player)) + or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or state.has("Combo Master", player))) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) and ( - has_emblems(state, player, options.keyblades_unlock_chests) - or (options.advanced_logic and state.has("High Jump", player, 2) and state.has("Progressive Glide", player)) - or (options.advanced_logic and can_dumbo_skip(state, player) and state.has("Progressive Glide", player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) ) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) + add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"Progressive Glide", "High Jump"}, player))) add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and state.has_all({ - "Progressive Glide", - "Progressive Gravity"}, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Progressive Gravity", player) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and + ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + ) )) add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), lambda state: ( (state.has("Progressive Blizzard", player) and state.has("High Jump", player)) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) ) )) add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), @@ -721,84 +858,87 @@ def set_rules(kh1world): add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), lambda state: ( state.has("Progressive Glide", player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) + or difficulty > LOGIC_PROUD )) + add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) + add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), lambda state: ( + state.has("Progressive Glide", player) + or ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Combo Master", player) + difficulty > LOGIC_NORMAL + and + ( + state.has_all({"High Jump", "Combo Master"}, player) + or state.has("High Jump", player, 2) + ) ) - or state.has("Progressive Glide", player) )) add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) and state.has("Progressive Glide", player) - ) + ) #difficulty > LOGIC_PROUD and (can_dumbo_skip(state, player) or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and state.has("Hollow Bastion", player) - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Traverse Town Secret Waterway Navi Gummi Event"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Hollow Bastion", player) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Deep Jungle Defeat Sabor White Fang Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Defeat Clayton Cure Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Jungle King Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Red Trinity Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Cloud Sonic Blade Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Blizzard Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Monstro Defeat Parasite Cage II Stop Event"), - lambda state: ( - state.has("High Jump", player) - or - ( - options.advanced_logic - and state.has("Progressive Glide", player) - ) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Defeat Oogie's Manor Gravity Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Seal Keyhole Pumpkinhead Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Anti Sora Raven's Claw Event"), lambda state: state.has("Green Trinity", player)) @@ -810,18 +950,20 @@ def set_rules(kh1world): lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Seal Keyhole Glide Event"), lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Seal Keyhole Navi-G Piece Event"), + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Defeat Captain Hook Ars Arcanum Event"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Riku II Ragnarok Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak to Princesses Fire Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 01 Event"), lambda state: state.has("Postcard", player)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 02 Event"), @@ -844,130 +986,76 @@ def set_rules(kh1world): lambda state: state.has("Postcard", player, 10)) add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Aero Event"), lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Navi-G Piece Event"), + lambda state: state.has("Red Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Progressive Fire"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Hook Ansem's Report 9"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 1"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 2"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 3"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 4"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 5"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) + lambda state: + has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and has_all_summons(state, player) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Traverse Town Geppetto's House Talk to Pinocchio"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All Arts Items"), lambda state: ( has_all_magic_lvx(state, player, 1) and has_all_arts(state, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, 0, hundred_acre_wood) #due to the softlock potential, I'm forcing it to logic normally instead of allowing the bypass )) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV1 Magic"), lambda state: has_all_magic_lvx(state, player, 1)) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV3 Magic"), lambda state: has_all_magic_lvx(state, player, 3)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 10 Puppies"), - lambda state: has_puppies(state, player, 10)) + lambda state: has_puppies(state, player, 10, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 20 Puppies"), - lambda state: has_puppies(state, player, 20)) + lambda state: has_puppies(state, player, 20, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 30 Puppies"), - lambda state: has_puppies(state, player, 30)) + lambda state: has_puppies(state, player, 30, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 40 Puppies"), - lambda state: has_puppies(state, player, 40)) + lambda state: has_puppies(state, player, 40, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 60 Puppies"), - lambda state: has_puppies(state, player, 60)) + lambda state: has_puppies(state, player, 60, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 70 Puppies"), - lambda state: has_puppies(state, player, 70)) + lambda state: has_puppies(state, player, 70, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 80 Puppies"), - lambda state: has_puppies(state, player, 80)) + lambda state: has_puppies(state, player, 80, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 90 Puppies"), - lambda state: has_puppies(state, player, 90)) + lambda state: has_puppies(state, player, 90, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Neverland Hold Aero Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Camp Hi-Potion Experiment"), @@ -977,258 +1065,312 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Deep Jungle Camp Replication Experiment"), lambda state: state.has("Progressive Blizzard", player)) add_rule(kh1world.get_location("Deep Jungle Cliff Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Tree House Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Camp Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Bamboo Thicket Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Save Gorillas"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Read Book"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Green Trinity"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Hero's License Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Navi-G Piece Event"), - lambda state: state.has("Footprints", player)) - add_rule(kh1world.get_location("Traverse Town Synth Log"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Traverse Town Synth 15 Items"), lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Cloth"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Rope"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Seagull Egg"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Fish"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Mushroom"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) + min(state.count("Orichalcum", player),9) + min(state.count("Mythril", player),9) >= 15 + and has_item_workshop(state, player, difficulty) )) + for i in range(33): + add_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda state: ( + state.has("Orichalcum", player, 17) + and state.has("Mythril", player, 16) + and has_item_workshop(state, player, difficulty) + )) + add_item_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda i: (i.player != player or i.name not in ["Orichalcum", "Mythril"])) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 1"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 2"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Item Workshop Postcard"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Postcard"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Progressive Fire", player) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has("Progressive Glide", player) or state.has("Progressive Thunder", player) - or options.advanced_logic + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Belle Divine Rose"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Aerith Cure"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity by Exit Door"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town 3rd District Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Magician's Study Blue Trinity"), + lambda state: ( + state.has_all({ + "Blue Trinity", + "Progressive Fire"}, player) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity in Alcove"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity by Moving Boulder"), + lambda state: ( + state.has("Blue Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Agrabah Bazaar Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Mouth Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Throat Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + )) + add_rule(kh1world.get_location("Monstro Chamber 5 Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Hollow Bastion Great Crest Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Hollow Bastion Dungeon Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Deep Jungle Treetop Green Trinity"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Red Trinity"), + lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Wonderland Bizarre Room Examine Flower Pot"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Yellow Elixir Flower Through Painting"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Red Flower Raise Lily Pads"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Cushioned Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Pink Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Yellow Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Gray Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Brown Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Hollow Bastion Lift Stop from Waterway Examine Node"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + )) + for i in range(1,13): + add_rule(kh1world.get_location("Neverland Clock Tower " + str(i).rjust(2, "0") + ":00 Door"), + lambda state: state.has("Green Trinity", player)) if options.hundred_acre_wood: add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) ) )) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Owl Cheer"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 1"), - lambda state: has_torn_pages(state, player, 1)) + lambda state: state.has("Torn Page", player, 1)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 2"), - lambda state: has_torn_pages(state, player, 2)) + lambda state: state.has("Torn Page", player, 2)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 3"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 4"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 5"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Start Fire"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Break Log"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) if options.atlantica: add_rule(kh1world.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest"), lambda state: ( - state.has_all({ - "Progressive Fire", - "Crystal Trident"}, player) + state.has("Progressive Fire", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Triton's Palace White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Atlantica Defeat Ursula I Mermaid Kick Event"), lambda state: ( - has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Thunder Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Seal Keyhole Crabclaw Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Undersea Gorge Blizzard Clam"), lambda state: state.has("Progressive Blizzard", player)) @@ -1237,721 +1379,411 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Atlantica Triton's Palace Thunder Clam"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Atlantica Cavern Nook Clam"), - lambda state: state.has("Crystal Trident", player)) + lambda state: has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Ansem's Report 3"), lambda state: ( - state.has_all({ - "Mermaid Kick", - "Crystal Trident"}, player) - and has_offensive_magic(state, player) - )) - if options.cups: - add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Mermaid Kick", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_offensive_magic(state, player, difficulty) )) + if options.cups.current_key != "off": + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Complete Phil Cup"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Solo"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Time Trial"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Solo"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Time Trial"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Hercules Cup"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Solo"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Time Trial"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Complete Hades Cup"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Solo"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Defeat Cloud Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Yellow Trinity Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass", - "Guard"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Complete Hades Cup"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Solo"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + if options.cups.current_key == "hades_cup" and options.super_bosses: + add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and (state.has("Guard", player) or difficulty > LOGIC_PROUD) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Olympia Chest"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) if options.super_bosses: add_rule(kh1world.get_location("Neverland Defeat Phantom Stop Event"), lambda state: ( state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and + ( + has_all_magic_lvx(state, player, 3) + or (difficulty > LOGIC_BEGINNER and has_all_magic_lvx(state, player, 2)) + or (difficulty > LOGIC_NORMAL and state.has_all({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Stop"}, player)) + or + ( + difficulty > LOGIC_PROUD + and state.has_any({"Progressive Fire","Progressive Blizzard"}, player) + and state.has_any({"Progressive Fire","Progressive Thunder"}, player) + and state.has_any({"Progressive Thunder","Progressive Blizzard"}, player) + and state.has("Progressive Stop", player) + ) + ) + and (state.has("Leaf Bracer", player) or difficulty > LOGIC_NORMAL) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) - for i in range(options.level_checks): - add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0')), + if options.jungle_slider: + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + if options.destiny_islands: + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 1 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 2 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 3 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Gather Seagull Egg (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Seashore Deliver Kairi Items (Day 1)"), + # lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Talk to Kairi (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Gather Drinking Water (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Chest"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Cove Deliver Kairi Items (Day 2)"), + # lambda state: state.has("Raft Materials", player, homecoming_materials)) + for i in range(1,options.level_checks+1): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 1)"), lambda state, level_num=i: ( - has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) - if options.goal.current_key == "final_ansem": - add_rule(kh1world.get_location("Final Ansem"), - lambda state: ( - has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests, options.puppies) - )) - if options.keyblades_unlock_chests: - add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Rooftop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Blue Room Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Corner Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Clock Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Table Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Red Room Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Accessory Shop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway Near Stairs Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Nut Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Beneath Tree House Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Center Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines 2 Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tunnel Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tent Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Agrabah Plaza By Storage Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Raised Terrace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Top Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Alley Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar Across Windows Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar High Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street Right Palace Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Alley Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates Low Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Behind Barrel Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall High Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Main Street Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Plaza Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Low Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Monstro Mouth Boat Deck Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Near Teeth Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 2nd Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 1st Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Crows Nest Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Right Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Left Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Galley Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 1st Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Water's Surface Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 1st Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Library Top of Bookshelf Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Near Crystal Switch Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon By Candles Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon Corner Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 6th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 10th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 9th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 8th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 7th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Traverse Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Wonderland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Olympus Coliseum Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Deep Jungle Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Halloween Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Neverland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus 100 Acre Wood Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Rest Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), - lambda state: state.has("Oblivion", player)) - if options.hundred_acre_wood: - add_rule(kh1world.get_location("100 Acre Wood Meadow Inside Log Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: state.has("Oathkeeper", player)) - + if i+1 in kh1world.get_slot_2_levels(): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 2)"), + lambda state, level_num=i: ( + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Final Ansem"), + lambda state: ( + has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) # In logic, player is strong enough + and + ( + ( # Can DI Finish + state.has("Destiny Islands", player) + and state.has("Raft Materials", player, homecoming_materials) + ) + or + ( + ( # Has access to EotW + ( + has_lucky_emblems(state, player, eotw_required_lucky_emblems) + and end_of_the_world_unlock == "lucky_emblems" + ) + or state.has("End of the World", player) + ) + and has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_lucky_emblems) # Can open the Door + ) + ) + and has_defensive_tools(state, player, difficulty) + )) + for location in location_table.keys(): + try: + kh1world.get_location(location) + except KeyError: + continue + if difficulty == LOGIC_BEGINNER and location_table[location].behind_boss: + add_rule(kh1world.get_location(location), + lambda state: has_basic_tools(state, player)) + if options.remote_items.current_key == "off": + if location_table[location].type == "Static": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].type == "Item")) + if location_table[location].type == "Level Slot 1": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].category in ["Level Up", "Limited Level Up"])) + if location_table[location].type == "Level Slot 2": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].category in ["Level Up", "Limited Level Up"] or item_table[i.name].type == "Ability"))) + if location_table[location].type == "Synth": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if location_table[location].type == "Prize": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if options.keyblades_unlock_chests: + if location_table[location].type == "Chest" or location in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + location_world = location_table[location].category + location_required_keyblade = KEYBLADES[WORLDS.index(location_world)] + if location not in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player)) + else: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player) or difficulty > LOGIC_BEGINNER) + + if options.destiny_islands: + add_rule(kh1world.get_entrance("Destiny Islands"), + lambda state: state.has("Destiny Islands", player)) add_rule(kh1world.get_entrance("Wonderland"), - lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Olympus Coliseum"), - lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Deep Jungle"), - lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Agrabah"), - lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Monstro"), - lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) if options.atlantica: add_rule(kh1world.get_entrance("Atlantica"), - lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Halloween Town"), - lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Neverland"), - lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests)) + lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Hollow Bastion"), - lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("End of the World"), - lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or state.has("End of the World", player))) + lambda state: has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and ((has_lucky_emblems(state, player, eotw_required_lucky_emblems) and end_of_the_world_unlock == "lucky_emblems") or state.has("End of the World", player))) add_rule(kh1world.get_entrance("100 Acre Wood"), lambda state: state.has("Progressive Fire", player)) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ac0afca5..f14f6ea3 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -1,23 +1,29 @@ import logging +import re from typing import List +from math import ceil from BaseClasses import Tutorial from worlds.AutoWorld import WebWorld, World from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table, item_name_groups -from .Locations import KH1Location, location_table, get_locations_by_category, location_name_groups +from .Locations import KH1Location, location_table, get_locations_by_type, location_name_groups from .Options import KH1Options, kh1_option_groups from .Regions import connect_entrances, create_regions from .Rules import set_rules from .Presets import kh1_option_presets -from worlds.LauncherComponents import Component, components, Type, launch as launch_component - +from worlds.LauncherComponents import Component, components, Type, launch as launch_component, icon_paths +from .GenerateJSON import generate_json +from .Data import VANILLA_KEYBLADE_STATS, VANILLA_PUPPY_LOCATIONS, CHAR_TO_KH, VANILLA_ABILITY_AP_COSTS, WORLD_KEY_ITEMS +from worlds.LauncherComponents import Component, components, Type, launch_subprocess def launch_client(): from .Client import launch launch_component(launch, name="KH1 Client") -components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart")) + +icon_paths["kh1_heart"] = f"ap:{__name__}/icons/kh1_heart.png" class KH1Web(WebWorld): @@ -54,6 +60,19 @@ class KH1World(World): fillers.update(get_items_by_category("Item")) fillers.update(get_items_by_category("Camping")) fillers.update(get_items_by_category("Stat Ups")) + slot_2_levels: list[int] + keyblade_stats: list[dict[str, int]] + starting_accessory_locations: list[str] + starting_accessories: list[str] + ap_costs: list[dict[str, str | int | bool]] + + def __init__(self, multiworld, player): + super(KH1World, self).__init__(multiworld, player) + self.slot_2_levels = None + self.keyblade_stats = None + self.starting_accessory_locations = None + self.starting_accessories = None + self.ap_costs = None def create_items(self): self.place_predetermined_items() @@ -63,12 +82,29 @@ class KH1World(World): possible_starting_worlds = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Halloween Town", "Neverland", "Hollow Bastion"] if self.options.atlantica: possible_starting_worlds.append("Atlantica") + if self.options.destiny_islands: + possible_starting_worlds.append("Destiny Islands") if self.options.end_of_the_world_unlock == "item": possible_starting_worlds.append("End of the World") starting_worlds = self.random.sample(possible_starting_worlds, min(self.options.starting_worlds.value, len(possible_starting_worlds))) for starting_world in starting_worlds: self.multiworld.push_precollected(self.create_item(starting_world)) + # Handle starting tools + starting_tools = [] + if self.options.starting_tools: + starting_tools = ["Scan", "Dodge Roll"] + self.multiworld.push_precollected(self.create_item("Scan")) + self.multiworld.push_precollected(self.create_item("Dodge Roll")) + + # Handle starting party member accessories + starting_party_member_accessories = [] + starting_party_member_locations = [] + starting_party_member_locations = self.get_starting_accessory_locations() + starting_party_member_accessories = self.get_starting_accessories() + for i in range(len(starting_party_member_locations)): + self.get_location(self.starting_accessory_locations[i]).place_locked_item(self.create_item(self.starting_accessories[i])) + item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -94,19 +130,26 @@ class KH1World(World): # Fill remaining pool with items from other pool self.random.shuffle(possible_level_up_item_pool) - level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(100 - len(level_up_item_pool))] - - level_up_locations = list(get_locations_by_category("Levels").keys()) + level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(99 - len(level_up_item_pool))] + + level_up_locations = list(get_locations_by_type("Level Slot 1").keys()) self.random.shuffle(level_up_item_pool) - current_level_for_placing_stats = self.options.force_stats_on_levels.value - while len(level_up_item_pool) > 0 and current_level_for_placing_stats <= self.options.level_checks: - self.get_location(level_up_locations[current_level_for_placing_stats - 1]).place_locked_item(self.create_item(level_up_item_pool.pop())) - current_level_for_placing_stats += 1 + current_level_index_for_placing_stats = self.options.force_stats_on_levels.value - 2 # Level 2 is index 0, Level 3 is index 1, etc + if self.options.remote_items.current_key == "off" and self.options.force_stats_on_levels.value != 2: + logging.info(f"{self.player_name}'s value {self.options.force_stats_on_levels.value} for force_stats_on_levels was changed\n" + f"Set to 2 as remote_items if \"off\"") + self.options.force_stats_on_levels.value = 2 + current_level_index_for_placing_stats = 0 + while len(level_up_item_pool) > 0 and current_level_index_for_placing_stats < self.options.level_checks: # With all levels in location pool, 99 level ups so need to go index 0-98 + self.get_location(level_up_locations[current_level_index_for_placing_stats]).place_locked_item(self.create_item(level_up_item_pool.pop())) + current_level_index_for_placing_stats += 1 + + # Calculate prefilled locations and items - prefilled_items = [] - if self.options.vanilla_emblem_pieces: - prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] + exclude_items = ["Final Door Key", "Lucky Emblem"] + if not self.options.randomize_emblem_pieces: + exclude_items = exclude_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] total_locations = len(self.multiworld.get_unfilled_locations(self.player)) @@ -117,27 +160,29 @@ class KH1World(World): quantity = data.max_quantity if data.category not in non_filler_item_categories: continue - if name in starting_worlds: + if name in starting_worlds or name in starting_tools or name in starting_party_member_accessories: continue - if data.category == "Puppies": - if self.options.puppies == "triplets" and "-" in name: - item_pool += [self.create_item(name) for _ in range(quantity)] - if self.options.puppies == "individual" and "Puppy" in name: - item_pool += [self.create_item(name) for _ in range(0, quantity)] - if self.options.puppies == "full" and name == "All Puppies": - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items and name in WORLD_KEY_ITEMS.keys() and name not in ("Crystal Trident", "Jack-In-The-Box"): # Handling these special cases separately + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + elif self.options.halloween_town_key_item_bundle and name == "Jack-In-The-Box": + continue + elif name == "Puppy": + if self.options.randomize_puppies: + item_pool += [self.create_item(name) for _ in range(ceil(99/self.options.puppy_value.value))] elif name == "Atlantica": if self.options.atlantica: item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Mermaid Kick": - if self.options.atlantica: - if self.options.extra_shared_abilities: - item_pool += [self.create_item(name) for _ in range(0, 2)] - else: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.atlantica and self.options.extra_shared_abilities: + item_pool += [self.create_item(name) for _ in range(0, 2)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Crystal Trident": if self.options.atlantica: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items: + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "High Jump": if self.options.extra_shared_abilities: item_pool += [self.create_item(name) for _ in range(0, 3)] @@ -154,11 +199,26 @@ class KH1World(World): elif name == "EXP Zero": if self.options.exp_zero_in_pool: item_pool += [self.create_item(name) for _ in range(0, quantity)] - elif name not in prefilled_items: + elif name == "Postcard": + if self.options.randomize_postcards.current_key == "chests": + item_pool += [self.create_item(name) for _ in range(0, 3)] + if self.options.randomize_postcards.current_key == "all": + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Orichalcum": + item_pool += [self.create_item(name) for _ in range(0, self.options.orichalcum_in_pool.value)] + elif name == "Mythril": + item_pool += [self.create_item(name) for _ in range(0, self.options.mythril_in_pool.value)] + elif name == "Destiny Islands": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Raft Materials": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, self.options.materials_in_pool.value)] + elif name not in exclude_items: item_pool += [self.create_item(name) for _ in range(0, quantity)] - for i in range(self.determine_reports_in_pool()): - item_pool += [self.create_item("Ansem's Report " + str(i+1))] + for i in range(self.determine_lucky_emblems_in_pool()): + item_pool += [self.create_item("Lucky Emblem")] while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] @@ -170,63 +230,117 @@ class KH1World(World): self.multiworld.itempool += item_pool def place_predetermined_items(self) -> None: - goal_dict = { - "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", - "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", - "postcards": "Traverse Town Mail Postcard 10 Event", - "final_ansem": "Final Ansem", - "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2", - "final_rest": "End of the World Final Rest Chest" - } - self.get_location(goal_dict[self.options.goal.current_key]).place_locked_item(self.create_item("Victory")) - if self.options.vanilla_emblem_pieces: + if self.options.final_rest_door_key.current_key not in ["puppies", "postcards", "lucky_emblems"]: + goal_dict = { + "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", + "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", + "final_rest": "End of the World Final Rest Chest" + } + goal_location_name = goal_dict[self.options.final_rest_door_key.current_key] + elif self.options.final_rest_door_key.current_key == "postcards": + lpad_number = str(self.options.required_postcards).rjust(2, "0") + goal_location_name = "Traverse Town Mail Postcard " + lpad_number + " Event" + elif self.options.final_rest_door_key.current_key == "puppies": + required_puppies = self.options.required_puppies.value + goal_location_name = "Traverse Town Piano Room Return " + str(required_puppies) + " Puppies" + if required_puppies == 50 or required_puppies == 99: + goal_location_name = goal_location_name + " Reward 2" + if self.options.final_rest_door_key.current_key != "lucky_emblems": + self.get_location(goal_location_name).place_locked_item(self.create_item("Final Door Key")) + self.get_location("Final Ansem").place_locked_item(self.create_event("Victory")) + + if not self.options.randomize_emblem_pieces: self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)").place_locked_item(self.create_item("Emblem Piece (Flame)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)").place_locked_item(self.create_item("Emblem Piece (Statue)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)").place_locked_item(self.create_item("Emblem Piece (Fountain)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)").place_locked_item(self.create_item("Emblem Piece (Chest)")) + if self.options.randomize_postcards != "all": + self.get_location("Traverse Town Item Shop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Safe Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 1").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 2").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Item Workshop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 3rd District Balcony Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Geppetto's House Postcard").place_locked_item(self.create_item("Postcard")) + if self.options.randomize_postcards.current_key == "vanilla": + self.get_location("Traverse Town 1st District Accessory Shop Roof Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Blue Trinity Balcony Chest").place_locked_item(self.create_item("Postcard")) + if not self.options.randomize_puppies: + if self.options.puppy_value.value != 3: + self.options.puppy_value.value = 3 + logging.info(f"{self.player_name}'s value of {self.options.puppy_value.value} for puppy value was changed to 3 as Randomize Puppies is OFF") + for i, location in enumerate(VANILLA_PUPPY_LOCATIONS): + self.get_location(location).place_locked_item(self.create_item("Puppy")) def get_filler_item_name(self) -> str: weights = [data.weight for data in self.fillers.values()] return self.random.choices([filler for filler in self.fillers.keys()], weights)[0] def fill_slot_data(self) -> dict: - slot_data = {"xpmult": int(self.options.exp_multiplier)/16, - "required_reports_eotw": self.determine_reports_required_to_open_end_of_the_world(), - "required_reports_door": self.determine_reports_required_to_open_final_rest_door(), - "door": self.options.final_rest_door.current_key, - "seed": self.multiworld.seed_name, - "advanced_logic": bool(self.options.advanced_logic), - "hundred_acre_wood": bool(self.options.hundred_acre_wood), + slot_data = { "atlantica": bool(self.options.atlantica), - "goal": str(self.options.goal.current_key)} - if self.options.randomize_keyblade_stats: - min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - self.options.keyblade_min_str.value = min_str_bonus - self.options.keyblade_max_str.value = max_str_bonus - min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - self.options.keyblade_min_mp.value = min_mp_bonus - self.options.keyblade_max_mp.value = max_mp_bonus - slot_data["keyblade_stats"] = "" - for i in range(22): - if i < 4 and self.options.bad_starting_weapons: - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0," - else: - str_bonus = int(self.random.randint(min_str_bonus, max_str_bonus)) - mp_bonus = int(self.random.randint(min_mp_bonus, max_mp_bonus)) - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + str(str_bonus) + "," + str(mp_bonus) + "," - slot_data["keyblade_stats"] = slot_data["keyblade_stats"][:-1] - if self.options.donald_death_link: - slot_data["donalddl"] = "" - if self.options.goofy_death_link: - slot_data["goofydl"] = "" - if self.options.keyblades_unlock_chests: - slot_data["chestslocked"] = "" - else: - slot_data["chestsunlocked"] = "" - if self.options.interact_in_battle: - slot_data["interactinbattle"] = "" + "auto_attack": bool(self.options.auto_attack), + "auto_save": bool(self.options.auto_save), + "bad_starting_weapons": bool(self.options.bad_starting_weapons), + "beep_hack": bool(self.options.beep_hack), + "consistent_finishers": bool(self.options.consistent_finishers), + "cups": str(self.options.cups.current_key), + "day_2_materials": int(self.options.day_2_materials.value), + "death_link": str(self.options.death_link.current_key), + "destiny_islands": bool(self.options.destiny_islands), + "donald_death_link": bool(self.options.donald_death_link), + "early_skip": bool(self.options.early_skip), + "end_of_the_world_unlock": str(self.options.end_of_the_world_unlock.current_key), + "exp_multiplier": int(self.options.exp_multiplier.value)/16, + "exp_zero_in_pool": bool(self.options.exp_zero_in_pool), + "extra_shared_abilities": bool(self.options.extra_shared_abilities), + "fast_camera": bool(self.options.fast_camera), + "faster_animations": bool(self.options.faster_animations), + "final_rest_door_key": str(self.options.final_rest_door_key.current_key), + "force_stats_on_levels": int(self.options.force_stats_on_levels.value), + "four_by_three": bool(self.options.four_by_three), + "goofy_death_link": bool(self.options.goofy_death_link), + "halloween_town_key_item_bundle": bool(self.options.halloween_town_key_item_bundle), + "homecoming_materials": int(self.options.homecoming_materials.value), + "hundred_acre_wood": bool(self.options.hundred_acre_wood), + "interact_in_battle": bool(self.options.interact_in_battle), + "jungle_slider": bool(self.options.jungle_slider), + "keyblades_unlock_chests": bool(self.options.keyblades_unlock_chests), + "level_checks": int(self.options.level_checks.value), + "logic_difficulty": str(self.options.logic_difficulty.current_key), + "materials_in_pool": int(self.options.materials_in_pool.value), + "max_ap_cost": int(self.options.max_ap_cost.value), + "min_ap_cost": int(self.options.min_ap_cost.value), + "mythril_in_pool": int(self.options.mythril_in_pool.value), + "mythril_price": int(self.options.mythril_price.value), + "one_hp": bool(self.options.one_hp), + "orichalcum_in_pool": int(self.options.orichalcum_in_pool.value), + "orichalcum_price": int(self.options.orichalcum_price.value), + "puppy_value": int(self.options.puppy_value.value), + "randomize_ap_costs": str(self.options.randomize_ap_costs.current_key), + "randomize_emblem_pieces": bool(self.options.exp_zero_in_pool), + "randomize_party_member_starting_accessories": bool(self.options.randomize_party_member_starting_accessories), + "randomize_postcards": str(self.options.randomize_postcards.current_key), + "randomize_puppies": str(self.options.randomize_puppies.current_key), + "remote_items": str(self.options.remote_items.current_key), + "remote_location_ids": self.get_remote_location_ids(), + "required_lucky_emblems_door": self.determine_lucky_emblems_required_to_open_final_rest_door(), + "required_lucky_emblems_eotw": self.determine_lucky_emblems_required_to_open_end_of_the_world(), + "required_postcards": int(self.options.required_postcards.value), + "required_puppies": int(self.options.required_puppies.value), + "seed": self.multiworld.seed_name, + "shorten_go_mode": bool(self.options.shorten_go_mode), + "slot_2_level_checks": int(self.options.slot_2_level_checks.value), + "stacking_world_items": bool(self.options.stacking_world_items), + "starting_items": [item.code for item in self.multiworld.precollected_items[self.player]], + "starting_tools": bool(self.options.starting_tools), + "super_bosses": bool(self.options.super_bosses), + "synthesis_item_name_byte_arrays": self.get_synthesis_item_name_byte_arrays(), + "unlock_0_volume": bool(self.options.unlock_0_volume), + "unskippable": bool(self.options.unskippable), + "warp_anywhere": bool(self.options.warp_anywhere) + } return slot_data def create_item(self, name: str) -> KH1Item: @@ -241,45 +355,260 @@ class KH1World(World): set_rules(self) def create_regions(self): - create_regions(self.multiworld, self.player, self.options) - + create_regions(self) + def connect_entrances(self): - connect_entrances(self.multiworld, self.player) + connect_entrances(self) + + def generate_output(self, output_directory: str): + """ + Generates the json file for use with mod generator. + """ + generate_json(self, output_directory) def generate_early(self): - value_names = ["Reports to Open End of the World", "Reports to Open Final Rest Door", "Reports in Pool"] - initial_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] - self.change_numbers_of_reports_to_consider() - new_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] + self.determine_level_checks() + + value_names = ["Lucky Emblems to Open End of the World", "Lucky Emblems to Open Final Rest Door", "Lucky Emblems in Pool"] + initial_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] + self.change_numbers_of_lucky_emblems_to_consider() + new_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] for i in range(3): - if initial_report_settings[i] != new_report_settings[i]: - logging.info(f"{self.player_name}'s value {initial_report_settings[i]} for \"{value_names[i]}\" was invalid\n" - f"Setting \"{value_names[i]}\" value to {new_report_settings[i]}") + if initial_lucky_emblem_settings[i] != new_lucky_emblem_settings[i]: + logging.info(f"{self.player_name}'s value {initial_lucky_emblem_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_lucky_emblem_settings[i]}") + + value_names = ["Day 2 Materials", "Homecoming Materials", "Materials in Pool"] + initial_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + self.change_numbers_of_materials_to_consider() + new_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + for i in range(3): + if initial_materials_settings[i] != new_materials_settings[i]: + logging.info(f"{self.player_name}'s value {initial_materials_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_materials_settings[i]}") + + if self.options.stacking_world_items.value and not self.options.halloween_town_key_item_bundle.value: + logging.info(f"{self.player_name}'s value {self.options.halloween_town_key_item_bundle.value} for Halloween Town Key Item Bundle must be TRUE when Stacking World Items is on. Setting to TRUE") + self.options.halloween_town_key_item_bundle.value = True - def change_numbers_of_reports_to_consider(self) -> None: - if self.options.end_of_the_world_unlock == "reports" and self.options.final_rest_door == "reports": - self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value]) + def change_numbers_of_lucky_emblems_to_consider(self) -> None: + if self.options.end_of_the_world_unlock == "lucky_emblems" and self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.end_of_the_world_unlock == "reports": - self.options.required_reports_eotw.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.reports_in_pool.value]) + elif self.options.end_of_the_world_unlock == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.final_rest_door == "reports": - self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_door.value, self.options.reports_in_pool.value]) + elif self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - def determine_reports_in_pool(self) -> int: - if self.options.end_of_the_world_unlock == "reports" or self.options.final_rest_door == "reports": - return self.options.reports_in_pool.value + def determine_lucky_emblems_in_pool(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems" or self.options.final_rest_door_key == "lucky_emblems": + return self.options.lucky_emblems_in_pool.value return 0 - def determine_reports_required_to_open_end_of_the_world(self) -> int: - if self.options.end_of_the_world_unlock == "reports": - return self.options.required_reports_eotw.value - return 14 + def determine_lucky_emblems_required_to_open_end_of_the_world(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems": + return self.options.required_lucky_emblems_eotw.value + return -1 - def determine_reports_required_to_open_final_rest_door(self) -> int: - if self.options.final_rest_door == "reports": - return self.options.required_reports_door.value - return 14 + def determine_lucky_emblems_required_to_open_final_rest_door(self) -> int: + if self.options.final_rest_door_key == "lucky_emblems": + return self.options.required_lucky_emblems_door.value + return -1 + + def change_numbers_of_materials_to_consider(self) -> None: + if self.options.destiny_islands: + self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value = sorted( + [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value]) + + def get_remote_location_ids(self): + remote_location_ids = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if self.options.remote_items.current_key == "full": + if location_data.type != "Starting Accessory": + remote_location_ids.append(location_data.code) + elif self.player == location.item.player and location.item.name != "Victory": + item_data = item_table[location.item.name] + if location_data.type == "Chest": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Reward": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Static": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 1": + if item_data.category not in ["Level Up", "Limited Level Up"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 2": + if item_data.category not in ["Level Up", "Limited Level Up", "Abilities"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Synth": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Prize": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + return remote_location_ids + + def get_slot_2_levels(self): + if self.slot_2_levels is None: + self.slot_2_levels = [] + if self.options.max_level_for_slot_2_level_checks - 1 > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.max_level_for_slot_2_level_checks.value} for max level for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting max level for slot 2 level checks's value to {self.options.level_checks.value + 1}") + self.options.max_level_for_slot_2_level_checks.value = self.options.level_checks.value + 1 + if self.options.slot_2_level_checks.value > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting slot 2 level check's value to {self.options.level_checks.value}") + self.options.slot_2_level_checks.value = self.options.level_checks.value + if self.options.slot_2_level_checks > self.options.max_level_for_slot_2_level_checks - 1: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.max_level_for_slot_2_level_checks.value} for Max Level for Slot 2 Level Checks\n" + f"Setting slot 2 level check's value to {self.options.max_level_for_slot_2_level_checks.value - 1}") + self.options.slot_2_level_checks.value = self.options.max_level_for_slot_2_level_checks.value - 1 + # Range is exclusive of the top, so if max_level_for_slot_2_level_checks is 2 then the top end of the range needs to be 3 as the only level it can choose is 2. + self.slot_2_levels = self.random.sample(range(2,self.options.max_level_for_slot_2_level_checks.value + 1), self.options.slot_2_level_checks.value) + return self.slot_2_levels + + def get_keyblade_stats(self): + # Create keyblade stat array from vanilla + keyblade_stats = [x.copy() for x in VANILLA_KEYBLADE_STATS] + # Handle shuffling keyblade stats + if self.options.keyblade_stats != "vanilla": + if self.options.keyblade_stats == "randomize": + # Fix any minimum and max values from settings + min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + self.options.keyblade_min_str.value = min_str_bonus + self.options.keyblade_max_str.value = max_str_bonus + min_crit_rate = min(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + max_crit_rate = max(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + self.options.keyblade_min_crit_rate.value = min_crit_rate + self.options.keyblade_max_crit_rate.value = max_crit_rate + min_crit_str = min(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + max_crit_str = max(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + self.options.keyblade_min_crit_str.value = min_crit_str + self.options.keyblade_max_crit_str.value = max_crit_str + min_recoil = min(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + max_recoil = max(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + self.options.keyblade_min_recoil.value = min_recoil + self.options.keyblade_max_recoil.value = max_recoil + min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + self.options.keyblade_min_mp.value = min_mp_bonus + self.options.keyblade_max_mp.value = max_mp_bonus + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + else: + starting_weapons = [] + other_weapons = keyblade_stats + for keyblade in other_weapons: + keyblade["STR"] = self.random.randint(min_str_bonus, max_str_bonus) + keyblade["CRR"] = self.random.randint(min_crit_rate, max_crit_rate) + keyblade["CRB"] = self.random.randint(min_crit_str, max_crit_str) + keyblade["REC"] = self.random.randint(min_recoil, max_recoil) + keyblade["MP"] = self.random.randint(min_mp_bonus, max_mp_bonus) + keyblade_stats = starting_weapons + other_weapons + elif self.options.keyblade_stats == "shuffle": + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + self.random.shuffle(other_weapons) + keyblade_stats = starting_weapons + other_weapons + else: + self.random.shuffle(keyblade_stats) + return keyblade_stats + + def determine_level_checks(self): + # Handle if remote_items is off and level_checks > number of stats items + total_level_up_items = min(99, + self.options.strength_increase.value +\ + self.options.defense_increase.value +\ + self.options.hp_increase.value +\ + self.options.mp_increase.value +\ + self.options.ap_increase.value +\ + self.options.accessory_slot_increase.value +\ + self.options.item_slot_increase.value) + if self.options.level_checks.value > total_level_up_items and self.options.remote_items.current_key == "off": + logging.info(f"{self.player_name}'s value {self.options.level_checks.value} for level_checks was changed.\n" + f"This value cannot be more than the number of stat items in the pool when \"remote_items\" is \"off\".\n" + f"Set to be equal to number of stat items in pool, {total_level_up_items}.") + self.options.level_checks.value = total_level_up_items + + def get_synthesis_item_name_byte_arrays(self): + # Get synth item names to show in synthesis menu + synthesis_byte_arrays = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if location_data.type == "Synth": + item_name = re.sub('[^A-Za-z0-9 ]+', '',str(location.item.name.replace("Progressive", "Prog")))[:14] + byte_array = [] + for character in item_name: + byte_array.append(CHAR_TO_KH[character]) + synthesis_byte_arrays.append(byte_array) + return synthesis_byte_arrays + + def get_starting_accessory_locations(self): + if self.starting_accessory_locations is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessory_locations = list(get_locations_by_type("Starting Accessory").keys()) + if not self.options.atlantica: + self.starting_accessory_locations.remove("Ariel Starting Accessory 1") + self.starting_accessory_locations.remove("Ariel Starting Accessory 2") + self.starting_accessory_locations.remove("Ariel Starting Accessory 3") + self.starting_accessory_locations = self.random.sample(self.starting_accessory_locations, 10) + else: + self.starting_accessory_locations = [] + return self.starting_accessory_locations + + def get_starting_accessories(self): + if self.starting_accessories is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessories = list(get_items_by_category("Accessory").keys()) + self.starting_accessories = self.random.sample(self.starting_accessories, 10) + else: + self.starting_accessories = [] + return self.starting_accessories + + def get_ap_costs(self): + if self.ap_costs is None: + ap_costs = VANILLA_ABILITY_AP_COSTS.copy() + if self.options.randomize_ap_costs.current_key == "shuffle": + possible_costs = [] + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + possible_costs.append(ap_cost["AP Cost"]) + self.random.shuffle(possible_costs) + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = possible_costs.pop(0) + elif self.options.randomize_ap_costs.current_key == "randomize": + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = self.random.randint(self.options.min_ap_cost.value, self.options.max_ap_cost.value) + elif self.options.randomize_ap_costs.current_key == "distribute": + total_ap_value = 0 + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value + ap_cost["AP Cost"] + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value - self.options.min_ap_cost.value + ap_cost["AP Cost"] = self.options.min_ap_cost.value + while total_ap_value > 0: + ap_cost = self.random.choice(ap_costs) + if ap_cost["Randomize"]: + if ap_cost["AP Cost"] < self.options.max_ap_cost.value: + amount_to_add = self.random.randint(1, min(self.options.max_ap_cost.value - ap_cost["AP Cost"], total_ap_value)) + ap_cost["AP Cost"] = ap_cost["AP Cost"] + amount_to_add + total_ap_value = total_ap_value - amount_to_add + self.ap_costs = ap_costs + return self.ap_costs diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 5167505e..f0862672 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -7,7 +7,7 @@ configure and export a config file. ## What does randomization do to this game? -The Kingdom Hearts AP Randomizer randomizes most rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. +The Kingdom Hearts AP Randomizer randomizes rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. Worlds can only be accessed by finding the corresponding item. For example, you need to find the `Monstro` item to enter Monstro. @@ -21,49 +21,26 @@ Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consuma ### Locations -Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards. +Locations the player can find items include: +- Chests +- Rewards +- Static Events +- Map Prizes from things such as Trinities, Wonderland flowers and chairs, etc. +- Level ups ## Which items can be in another player's world? Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit certain items to your own world. + ## When the player receives an item, what happens? -When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "LEVEL UP" box. +When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "INFORMATION" box. ## What do I do if I encounter a bug with the game? Please reach out to Gicu#7034 on Discord. -## How do I progress in a certain world? - -### The evidence boxes aren't spawning in Wonderland. - -Find `Footprints` in the multiworld. - -### I can't enter any cups in Olympus Coliseum. - -Firstly, find `Entry Pass` in the multiworld. Additionally, `Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to the Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. - -### The slides aren't spawning in Deep Jungle. - -Find `Slides` in the multiworld. - -### I can't progress in Atlantica. -Find `Crystal Trident` in the multiworld. - -### I can't progress in Halloween Town. - -Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld. - -### The Hollow Bastion Library is missing a book. - -Find `Theon Vol. 6` in the multiworld. - -## How do I enter the End of the World? - -You can enter End of the World by obtaining a number of Ansem's Reports or by finding `End of the World` in the multiworld, depending on your options. - ## Credits This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 522da20b..f6b6a640 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,54 +1,99 @@ -# Kingdom Hearts Randomizer Setup Guide +# Kingdom Hearts Archipelago Randomizer Setup Guide -## Setting up the required mods +

Required software

-BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. +- KINGDOM HEARTS -HD 1.5+2.5 ReMIX- from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) -1. Install OpenKH and the LUA Backend +- The latest release of [OpenKH](https://github.com/OpenKH/OpenKh/releases) - Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest) - - Extract the files to a directory of your choosing. - - Open `OpenKh.Tools.ModsManager.exe` and run first time set up - - When prompted for game edition, choose `PC Release`, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next` - - When prompted, install Panacea, then click `Next` - - When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next` - - Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP - - Click `Finish` - -2. Open `OpenKh.Tools.ModsManager.exe` +- The latest release of the [Kingdom Hearts 1FM Randomizer Software](https://github.com/gaithern/KH1FM-RANDOMIZER/releases) -3. Click the drop-down menu at the top-right and choose `Kingdom Hearts 1` +- The latest release of [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) for the ArchipelagoKH1Client.exe -4. Click `Mods>Install a New Mod` +

Setting up the required software

-5. In `Add a new mod from GitHub` paste `gaithern/KH-1FM-AP-LUA` +

OpenKH

-6. Click `Install` +- Extract the OpenKH files to a directory of your choosing. +- When prompted for game edition, choose PC Release, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next`. +- When prompted, install Panacea, then click `Next`. +- When prompted, check KH1 plus any other AP game you want to play, and click `Install and configure Lua backend`, then click `Next`. +- Extract the data for KH1. +- Click `Finish` -7. Navigate to Mod Loader and click `Build and Run` +

Kingdom Hearts 1FM Randomizer Software

+- Extract the Kingdom Hearts 1FM Randomizer Software files in a directory of your choosing. -## Configuring your YAML file +

Obtaining and using the seed zip

-### What is a YAML file and why do I need one? +- When you generate a game you will see a download link for a KH1 .zip seed on the room page. +- After downloading this zip, open `mod_generator.exe` in your Kingdom Hearts 1FM Randomizer Software folder. +- Direct `mod_generator.exe` to both your seed zip and your KH1 data folder extracted during your OpenKH set up. +- Click `start`. +- After some time, you will find a file in your `Output` folder called `mod_YYYYMMDDHHMMSS.zip` +- Open `OpenKh.Tools.ModsManager.exe` and ensure that the dropdown in the top right is set to `Kingdom Hearts 1` +- Click the green plus, choose `Select and install Mod Archive or Lua Script`, and direct the prompt to your new mod zip. +- You should now see a mod on your list called `KH1 Randomizer Seed XYZ` where XYZ is your seed hex value. +- Ensure this mod is checked, then, if you want to play right away, click `Mod Loader` at the top. +- Click `Build and Run`. Your modded game should now open. -Your YAML file contains a set of configuration options which provide the generator with information about how it should -generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy -an experience customized for their taste, and different players in the same multiworld can all have different options. +

Connecting to your multiworld via the KH1 Client

-### Where do I get a YAML file? +- Once your game is being hosted, open `ArchipelagoLauncher.exe`. +- Find `KH1 Client` and open it. +- At the top, in the `Server:` bar, type in the host address and port. +- Click the `Connect` button in the top right. +- If connection to the server was successful, you'll be prompted to type in your slot named in the `Command:` bar at the bottom. +- After typing your slot name, press enter. +- If all is well, you are now connected. -you can customize your settings by visiting the [Kingdom Hearts Options Page](/games/Kingdom%20Hearts/player-options). +

FAQ

-## Connect to the MultiWorld +

The client did not confirm connection to the game, is that normal?

-For first-time players, it is recommended to open your KH1 Client first before opening the game. +Yes, the game and client communicate via a game communication path set up in your in your `%AppData%` folder, and therefore don't need to establish a socket connection. -On the title screen, open your KH1 Client and connect to your multiworld. +

I am not sending or receiving items.

+ +Check out this [troubleshooting guide](https://docs.google.com/document/d/1oAXxJWrNeqSL-tkB_01bLR0eT0urxz2FBo4URpq3VbM/edit?usp=sharing) + +

Why aren't the evidence boxes spawning in Wonderland?

+ +You'll need to find `Footprints` in your multiworld. + +

Why won't Phil let me start the Prelims?

+ +You'll need to find `Entry Pass` in the multiworld. + +

Why aren't the slides spawning in Deep Jungle?

+ +You'll need to find `Slides` in the multiworld. + +

Why can't I make progress in Atlantica?

+ +You'll need to find `Crystal Trident` in the multiworld. + +

Why won't the doctor let me progress in Halloween Town?

+ +You'll need to find either `Forget-Me-Not` or `Jack-in-the-Box` in the multiworld. + +

Why is there a book missing in the Hollow Bastion library?

+ +You'll need to find `Theon Vol. 6` in the multiworld. + +

How do I unlock End of the World?

+ +Depending on your settings, your options are either finding a specified amount of `Lucky Emblems` or finding the item `End of the World`. + +

How do I enter Destiny Islands?

+ +After obtaining the item `Destiny Islands`, you can land there as an additional option in Traverse Town. + +

How do I progress to Destiny Islands Day 2 and 3?

+ +In order to access Day 2 and 3, you need to collect an amount of `Raft Materials` specified in your settings. When you start Day 3, you'll be immediately warped to Homecoming. + +

Why can't I use the summon I obtained?

+ +You need at least one magic spell before you can use summons. diff --git a/worlds/kh1/icons/kh1_heart.ico b/worlds/kh1/icons/kh1_heart.ico new file mode 100644 index 0000000000000000000000000000000000000000..3c1bf320f6a471c455486952b9d402f31e137d53 GIT binary patch literal 4286 zcmcgvYiv|S6uysr+}-WIEEGzm+ZS4dS_>jCrEOYjZLySx;-fJ6xA!v+I;D;o} zM-+dkm|!&4C{o2x#72cGVodlUDi{=m7K#K6wjkI-+dY2YbhoVS7Ob_M=G%Mk%$f6@ zIp@rosix`pOH0%EtGyS{v?NW_vH^5y1pxb1!`Log7rHtI{HqUG!@v}zV|wbqRP=wg z7aonYrFbsnyMsSN)ZB*Rw`aJGEvYV}8nmW4MBJo_tUjwG$#%48xa|sF6e+AD+Q$6Cf>57~DLAx&7rzgmP5}y=|s6-S}TL{%s5MYHnlGv=!XsT*J8x9<+VJw zbj}T`d@H-mx?^pj4Rc`UQP|s#xi4SuirP>Gxqs6NT&8~f#T>VUBizh8OzaoRVK05w z0UhhcxeyDz5js?jiRk})32IwwWkAKUBDw$E(4lO-GsUiQ;r#4?+}l+nw_(iR z2RFMHW_pZ^Kh5;1wXeFy68aPU{|Pvkv;^ZXvV&-L!J8p=kA}V2a9p`EXA76A-;QY4u6I-i89>#vHYwV z?byTLBL+!My#-@afS#>1E5W$Xgq%GC9XACp@uU99hf_TA?06UJnvC_Dau9aX4(7^! z0CNR*5?P`cANzT3y#tx&tcEHy8$ld6CKG%-5 z5K zGX6D)RcsuYi}xYUc>z;_dwb_CUiljNK$~-XrcA;aKrZGAlq>K(np0blHV*SJ$6Wnqge9augnDX!RM4RkFo^d^oV6Qxmyx@M>0b3>`X7mGPIcGd< zdTXLb`I9*nsR7j(w*&E7DQf;7yjN0Z7+@V`Zoi3pCVg`fwVnQ9t|wc1C+`2@Z*l)% z-wDKHdqkG!F>{GJSVuR)4#ejaNDJc;NBVf~Jegt{t*;}FXOZL7D|cMgjW(Ps^e6n? z3E6jm_a_9*Fz;g*;Imj+&TT<1GjB#X_4ANj2^hfTnhS#~+@{vVJ;T%Ga_Rvd^8wQL3Ud3JP?A%cfc>yw%-2|}i^FCskS|enZ16RDGvo69w+L#Bd!}kuv zbU&~U@Ac>-Zy^w?i@C!+wH`8G#>jtxzO_IOaHVxa2+@LkBN}in)SDt}bO~$P>JClI$6*peF(dp9 X@CQ+kyG~!=I6?U~eN8CrY*_s_$G7B9 literal 0 HcmV?d00001 diff --git a/worlds/kh1/icons/kh1_heart.png b/worlds/kh1/icons/kh1_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..512dc03c184f324b5a42d20b3dc6b29e3647ac8e GIT binary patch literal 7821 zcmV;89&+J{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D9tcT9K~#8N?VSmj z996Z)PgO6oPeL}#0wIKug(X0M1d^Z-Hf0wiK76=-pUcDD_w>W3@}8i8PZ34MT~yR3 z2(tJ@KnNHDS%8ED1K9|HERcjGv-e)_|G!l|)77bO(@Ax+f2(SMw$X>`lAdf@# zL-_q_i-^o>(4_8zXx|5Lf8NBY7$gm0Llz@hrJzDQ4fz3NIz)%`HzCMe$WI}wA#7MS zFt5q&THS=-wHvY(awlXFgzsC`Xu6C(0?q$>v=g6%APruOP>I$&iTm$J>JFP$8{3r;YoMR#0pQD9EZW=sb8htTt;1sks4d&u8jI_Fe>5i8rw((n%-nT-GRQ6$Yg}ng` zPx(J}VBrM8NOdYDh;R9UBzN5}Mtl#? zn!mKelk|2z09nElm88-N!1wzm%W!Q z=3A{N%k^f`^8R-SjX5`NfqW9e?mrJrHFm?SuS@vQ^F@z(=ynNY68q6B+$}vXUoS?_ z4xDklcG@7kwqL8G3Qg-r!lD$bpUjDTwph>&D@_zbB0+{7AxwoP^%0!TL>Q z;QNISnWK6{XqKc7JWs8#e%lKlsPiE-5?Ap=C8%T%@Er&npMzfxIvQqyG@befjP(<& zbNx@cbBlDXc#ovpR`YSn|DNm#E`vOxjzqo)xdD>b_#r&)=Sb6>J4COi7kF?;cWjW( z~d2IJ89rFC2ul~Mq9`Sic--M$u)`Wau5`svqJ{E06HBh@Y4t3QUJ z;Z7QY`GYi#s`-$kA^!`pk4IWm>SumU>W}^su02nu4+69ix>tV!*ZzAP@$zlJ^3^WK zUp;IcmrNxTfEM##Aa=i1Z%|!+^ziqiORi)`6AZ)1NY4wOmiQ|_#*xF~-Uexcj8R8f z^g49;-B6k%6sy|(s2AOQh($ptP=wVJ&W+TvrUfyUJkUt z{DldHLv$1xV}fL;8xIBK`ur*CLK>M#QWzvFDmRk8}hn33P`C6!2kCYgkw-I zTEisVz_svX4zbP@52JjsEw@Q(?^3hTQ?PT4BqVq2!^fhFrmLjkGa{qUkmwN~lJMBG zioUr$FW(@s_1EE5o?(UeZ9eTmiM)-TR$(|kCtmxVBzN8`seQ|FsqH@38^MoO36GkK zp6EREG9N6-l}vYRl=da3h^T;<4Mr_XGFVDg0N$ksAbqAiZ{WQ9Br^U2>qK#+4y=*b zOaCp&J&)mlu@2WDh&TA$P|GX~JKs__w-9W&_D5z&rfaix#v}}7YI*yU){#H)SAHU~ zjW?U2X#Y^I3p#p(5m2;uNy9NWq1RzAUOYXxSG-?&_lY--_P_>p6o69tX)4W6AdL0* z5*js68jk%&(N7|~wC?9VEIsSK0Dt#Ix4=h{p!t}hdl z)NUwTFCl3>`BxHZI>I`3$4GWa=Q9^W0e*9(evDi&u2WS7rNiPf!Vl5(Uj5yFq*^1r>_r#zu$7^3JH&7LQi2*`=6Jtl~>{^ zqz6;VP4q%jipZWwuODZfb7G`>r0uVhtVYB$*)&aB&wa^PaZ+t-rEB>WxaLjPnM$Ec z=#W!z&G#sqp%~&@f2QIadH0Tn(iBL+*|A(ou}b~}Vl(_gBaVmA4k=9XjfbRj*}1rp zTX0m##wP~crDvpL={sOG@3hW2;rJUlv~R4hJM!QB8-L$Q>3r(EerSA>k@Wr*Fz^;g z8a-Gs&{NUs9Z^-rGJ=i2AgBVc$2iCO*-OK$>x=5b((Nxv*R$_e7Jh%i5GuQB`p;g3 zMl%SAuK^n(JZ7PJ(gi9KL&`>+6HNU_ru$XteELF+4vg>k!^otXH?YGtxypQ5JV6zJ zQ()|7deNez(S@CA9eG3Js}tS6k>ET`1<>o%Q=m5HykdFbABbQ=d70z=WWK=y-`L$S{6Qz zVdwSou$j}A2*i7Tm-*oK>={qZ@{@zmLpZd+<wp8>zvm>MJK>QhsR*GL@y)mL z;;kcM!0*3D+Mk%Kf-;G1cVGl*Qh}+48UHD*i(XJhXj$O%de(nM1(yop;&OA=%I2LF zB8UQTjKN*c1y;B1sdGmqX_VRZGaTA<%5U)0wyI+z9hZ(LPJ>T;9lB1qzbZA%>6544 zTBfXiH`s+UH^GfeY&VRujn+{PRESiEiuiH1u5s*qG<0 zy2JE27ml%h7DZ46V2)fLcmj3U0EI}t!8IJEKmA&GgfyM>a~MB;!&~?BAA$AE5V-&Q z8u7g_u-xPST67c?$~|hCdTS~4iD?6Vq|qb%S>l_R3SmM8!<(*lQBE2gFHeo zXL6J(myCB>SssSj!{zickuhh$Fy?4kI>|R5vR-);YME(%2Rq&Y5Ep_d0LK@bv&`|& z>jq}Ybi&_HbInHSFm|3xV*4NQp588=4Q1(%wGQksbbU)Ms=)C`dx}G2kz&piWpbvg{0so(4FrUJbK_lq(c562~J6H_5a@P*C zj`Cn;u`}C7!Tdr_;1q`e)4<-#gqoRXWWQa3NOj`jvCmgHV3w6rft~H-Ll6Zh2?jWL zgGxrPcQk~`yD#cHYQ9mvO!5G9v&}lPqoHf%giUeaTJpMLy=e;H#5yX446cncz5PoN z1>mD%Z^;ZSVxvIg7U9nL0vp1}%kEXlCPf&ZT(D7h#D}dTC+U65CH3attRpA&$H2Gu zFcNcNs(U!k{o^E0x!=8@E2!?j<8PephSxyjZBPZUJKCu(&zqMe*Lp9N^nOPcj6}y@BrWfFMlI4{Xtoa>e)vpj zK4Xc558)KKJFyKnDu3SS*(u3g%xQHedf0oV`Sibt)<8QVJM3tx2Z|p4L1{hfc?pj= z-a6lhOZrwo@EHYqA0xgS|2W#)u^7USAXW_ zv}p9^8Pa;ri{4{-_v@1Bd0ln8YHniWiJswI!c?<%UXzts!?-@9czz*mx{|53)yg#5R2!jbGl3rv?S^a$mEUOW+*1Pkwk1L;+}6aFJpTaH5oz?*lA$ zj@jjrmM%09!?Wc;qpI`i3tYSBK5khCHdx~(z%RN*|zV+Ji9>C!9f*(f6s~)3)GQ9ljivkOXN^yih0wqbP;Znw;@*& zXe9diEHI(NA7@n#dIHR?Q;Rb){w`{9;44GnbXxw+(@cAYS-t4)jh^k65gbst3Q%{{ z=cMs?u2%P^XZ>{&dzp1CY_M7ym$(;ADg83%KDipWm+-iArDcKtLe<3fyG-l5!Z)kx z(Cf|k#z_A>i?&Cmqi1vEE3lNzpUjuV5!41CKZMw(_c$+aPM>-cnRtaYe?5#J;W2M7 z*!Y}a%XB&Hapt(YT7`a;q5v$kWOFq*p^|jBNPFQp&6+wiaE9?fi%P>x7B%xnO@}+} z4Gzt=)gr}EiUQD#riq+mP8%4Hu2+_+AJHivRci=_aVIk2Vl@rz2i;(^XoL;4g~p1b zfhk1+$W0L23KUw}YVO|$_5uyFZ&l;mFm^bx)o|?1){!^ytv_~)GVX*9JZQZRM5zkE ziR!#QKO;SBKc`$HKNwC`IqfCcpVbP6$C>}-JEuYzpo(q&o^@n{c3DY2XsHT7I9S<@ z!M1fp<+3qpl56INF`?mCHP=ISTM1gasmUKrgW7lgcRc zgSmuFr(npkP2<)kTv^m~%5ObqI!dMQ zXsteT=o!Q@jnX{#?t*R~>3;TVx9n=pH(w1YZSn$?(*qE$^}5e|nZ+{@R@wS{+OO>4mW>Yw;PfE>yx29jKX!P}S&*Tu35ZHW zWf*YhpwATA-bb0S_)O1sSp1HR6&rL7qZ2NXjSxdxhJtKoYx8Vm1LzPV>opCNnVkJg<=?Yl-Eejr1sal2Ld_u?4v#c7q z)kk>jB56MDe&q!ff~%>y_!KUcb*2|uf=sZe#8hWRtuGEztZ8q*uym(%F24k0S>fJ_ zD}Y+&KcbRAs|}X2Yo7P#q8gtDpDJ$QY9wn01Q5Kl>^aq@*Obv3ReYXnc0qI?{xEo_{IMK zVZfx~*);t*Bg41=OK);RM;oD$Crk7Ezxgi2$ilF4=QEc`YA>g|hl&!wwVnI{X*}Wf zqOARN`+DhI_Aa>1u7xZZZs%I_lB0co^!Jn;D~j<8IM#=ST8}q-f+BX}VBKJrVoB|0 zG;FXdfi87ZuaSo1ZYh}8Pg47z!*{z>7J$Ba$#56H1|&unRF$N4#s5%1dU%m<7;UA8;fdumV)czlkeX6 zoJctf(yxtA4pxF5zX&TuT?DZw*rz%qx&4o@_>YrNv%LmYKD@D!375m8c*QCSH%Nv9 zEg}uGZjgo9BFg>0(>~QAh5K>k0o-j6@YLl&D{__>MYQo)6!{4?^`L{A2>4pLRiuMHFzTv zE>ROs9{cO{FKW#Hs;UrL2(D`GTy`E5oC{MO1}uGhrgU+AdcU}Oehh>H5atqcSutY- z^b&HcCIbz+9v1TBDvIV8J6FTOgv;PcJqv@fKt-*J!ukBqqU*n*;F!-HQMiUL)9z~M zGQ7(SYi?&-dIgO#7$^lG)O;>uVvO_@i0xYF7bmyhEs=4Hd}9S>KEb7GVG0X991J3p z7OUDpn(lx5XxDVDxB}PZ>f=&8pO3T-_9G2_sS${xpnQj(t z^uWv~xJW5XCD!Kqp+ed7?kgDKi*349x?i{kU4ZM5P79yoeV}!G{lQ>R0Kz;1t}3Ag zZ13~oAtZM`fG0g9;W0UjlJnqX3ky+j5vt3wsfxf1UNuwcQyzwNt^T;gH{OhEceV7n zgquD-qkIF-U{L_VKsaX+*%R3Bu#u9~-Y208yI>c*Q+4}putot5N3)(#g?m-KUYh6r zQSBb?1uLd;rxNx=<_Kql7sR=db0Mx{!ay*X6o9a6+1PEUb*$1ti_R7D_-5 z!M%6_*Vd)>t*G$+J{pX^&rAK0oQ`*gxem1S)9#a2)P_4C{|Y&%ZeAh$P1u2htxJcQ zJCx)psiqpaY2KebyJGIU)Be~AQmK7@n4F?AoWt$~BRQ3;wtIKmU%<5VzX9RS6@zXP zW3crAS@^`H9HQ6(9@7OpOjc$4#5r%_5AChQFG}6v?75w=PEQwi3`w}I&EPE0#Sj*59JCD9As`J5{n_3X8-y$q{}b**}zmzzgRpGsTS-u?%JK{&7K3SC6b zA2?ErxmiQUQ;Q_+Qd^&S2Ii{U67-yL{@LGmZT#dLfAeenRS>R`81#)#hDr~Rg#$6W zRL90h+yJWO?aNd`X)dg$-TvsTz@cI;*=}CA#1ZOc)^6vr^TlNgdXDi-d|}%5ptAJ+ z7%DwL7Ft@26EKKkGpf|io6M-?w(~hKE>J&{iOK=Y9r*kzr7N%T>FROMW0%IKrO8FI zTn9H~8lMa`1t9e8IKDD^XoE&y_ZnxRg}TG9mXJ>XC!gqqce@6BIGyWK8<~p8#%B#Y zM>79lXRvz#UT|d$w+*`lVoNTePtH>A`8E7$EGBm_^j^R%3^hs9slRu`7`oSeNo6kO zbv%TTpNg*5IhYK^9v}l+25;f$Ypny5 zOwSH;18HZE!Hs=?WWF5QREq*I#q1i0Z33Qi2Ij8iebi0)7z{$kw(AmVJyt?_8(Z|e zc&$oO&4Xb@DqI0;a%fO33P6|ykhk%^A+e1&szs(*xLhlG*!!%bESl8Myv}AXaJ^n) zC-=v&!C{6odqX11R}9sp0OT_en^(Zv1c}#vZ5^4^PyMuV_p&h4Co+~vI(_uKd;_$= zVcfIf=?+v4)usTPmSfpeTlXB>^c{5NeE~Wap$LyzXdS^gJp5{y0DZ+9=t3rUF-_kF zllhs%IVAmkFRD!e$n_AL&&KW5@=Mr8591UszP=WP0@$Z}W1DWl)9(oCagt|HPwkdM zH7Wq}>se7brx!3(mrkEPOLWqeX!}v3H&2BDc${?>f0;>0Vms?G*x-A93E~I?4t1(g z0SJrg+IoRZ#|B9s=u5=qBoQ}(q&<*p{3W*C0lUGG;K7}^xNfiN80wKgFZiUgE(>!A ztky+`poLUOxDQ>`FwBko^{oATex(kM{am&+q$7S_*ylT|3nrGb(RvdEw7R#+i1Rl0 zE;mykvSgjr%)DZ^N+|LrN8#GT|_gyT%~C z?HBotPdnnjAXVA;q?#3gaN%W6EZ9(EycaIp$a4V)t5{bp)vf>x3fWpUxo3&8^z&gg zGA>KcgS$5d+K+#zQSAyqz6tH84-)L zr1mYhUiZPIkG!FtHH`x8#61+L1qC3se1ZJA0g~Kn+y02IANS&^dTK=hZin>F>vG%G z+_`~F_v`QwY(=>k2zc6jS>4o%0&oJScQSy*m|0sWOJdjk3<6k33Putg>$|IwT2TPP zVZbWSm9eFFGfbR=O$U0ee|nE1g; zBPJTGe`AGpP&3q=0yN1b|In-i5KjJNdTaZHm^)x!P&iC=qRZ%q@xus@USQ}=)7bw* z>bTfrnA#x9E!Q&`3efN&Dgb8-kL7QMsSWBO+`GVf`i1plYSA95%`Xk;_i>sy3oCq7 z#ah3h)T#oI+<;Hb#QulrgM|gz6EJP8@D7&4R3+S}U{I88A1G>h2p}x*bf@{UHmP+5 zpdrXbpTpEBlOWDou*1|0TpCx+%j1R_W|(1y8O9xv{|7rR*JWvgfztp001jnXNoGw= f04e|g00;m8000000Mb*F00000NkvXXu0mjf`~WVA literal 0 HcmV?d00001 diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 6b501404..b788be2f 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -5,29 +5,29 @@ class TestDefault(KH1TestBase): class TestSephiroth(KH1TestBase): options = { - "Goal": 0, + "Final Rest Door Key": 0, } class TestUnknown(KH1TestBase): options = { - "Goal": 1, + "Final Rest Door Key": 1, } class TestPostcards(KH1TestBase): options = { - "Goal": 2, + "Final Rest Door Key": 2, } -class TestFinalAnsem(KH1TestBase): +class TestLuckyEmblems(KH1TestBase): options = { - "Goal": 3, + "Final Rest Door Key": 3, } class TestPuppies(KH1TestBase): options = { - "Goal": 4, + "Final Rest Door Key": 4, } class TestFinalRest(KH1TestBase): options = { - "Goal": 5, + "Final Rest Door Key": 5, } From aaaceebd91e23a5cec70ce20d411358fff355162 Mon Sep 17 00:00:00 2001 From: Ben Dixon Date: Wed, 10 Sep 2025 16:56:04 -0500 Subject: [PATCH 071/204] Timespinner: Add Boss Rando Type Options (#4466) * adding in boss rando type options for Timespinner * removing new options from the backwards compatible section * adding in boss rando type options for Timespinner * removing new options from the backwards compatible section * re-adding accidentally deleted line * better documenting the different boss rando types * adding missing options to the interpret_slot_data function * making boss override schema more strict and allow for weights * now actually rolling using the weights for boss rando overrides * adding boss rando overrides to the spoiler header * simplifying the schema for the manual boss mappings --- worlds/timespinner/Options.py | 71 ++++++++++++++++++++++ worlds/timespinner/PreCalculatedWeights.py | 51 ++++++++++++++++ worlds/timespinner/__init__.py | 12 +++- 3 files changed, 132 insertions(+), 2 deletions(-) diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 35d9d630..23a688b8 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -53,6 +53,75 @@ class BossRando(Choice): option_unscaled = 2 alias_true = 1 +class BossRandoType(Choice): + """ + Sets what type of boss shuffling occurs. + Shuffle: Bosses will be shuffled amongst each other + Chaos: Bosses will be randomized with the chance of duplicate bosses + Singularity: All bosses will be replaced with a single boss + Manual: Bosses will be placed according to the Boss Rando Overrides setting + """ + display_name = "Boss Randomization Type" + option_shuffle = 0 + option_chaos = 1 + option_singularity = 2 + option_manual = 3 + +class BossRandoOverrides(OptionDict): + """ + Manual mapping of bosses to the boss they will be replaced with. + Bosses that you don't specify will be the vanilla boss. + """ + bosses = [ + "FelineSentry", + "Varndagroth", + "AzureQueen", + "GoldenIdol", + "Aelana", + "Maw", + "Cantoran", + "Genza", + "Nuvius", + "Vol", + "Prince", + "Xarion", + "Ravenlord", + "Ifrit", + "Sandman", + "Nightmare", + ] + + schema = Schema( + { + Optional(Or(*bosses)): Or( + And( + {Optional(boss): And(int, lambda n: n >= 0) for boss in bosses}, + lambda d: any(v > 0 for v in d.values()), + ), + *bosses + ) + } + ) + display_name = "Boss Rando Overrides" + default = { + "FelineSentry": "FelineSentry", + "Varndagroth": "Varndagroth", + "AzureQueen": "AzureQueen", + "GoldenIdol": "GoldenIdol", + "Aelana": "Aelana", + "Maw": "Maw", + "Cantoran": "Cantoran", + "Genza": "Genza", + "Nuvius": "Nuvius", + "Vol": "Vol", + "Prince": "Prince", + "Xarion": "Xarion", + "Ravenlord": "Ravenlord", + "Ifrit": "Ifrit", + "Sandman": "Sandman", + "Nightmare": "Nightmare" + } + class EnemyRando(Choice): "Wheter enemies will be randomized, and if their damage/hp should be scaled." display_name = "Enemy Randomization" @@ -420,6 +489,8 @@ class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): cantoran: Cantoran lore_checks: LoreChecks boss_rando: BossRando + boss_rando_type: BossRandoType + boss_rando_overrides: BossRandoOverrides enemy_rando: EnemyRando damage_rando: DamageRando damage_rando_overrides: DamageRandoOverrides diff --git a/worlds/timespinner/PreCalculatedWeights.py b/worlds/timespinner/PreCalculatedWeights.py index 96551ea7..916de346 100644 --- a/worlds/timespinner/PreCalculatedWeights.py +++ b/worlds/timespinner/PreCalculatedWeights.py @@ -21,6 +21,8 @@ class PreCalculatedWeights: flood_lake_serene_bridge: bool flood_lab: bool + boss_rando_overrides: Dict[str, str] + def __init__(self, options: TimespinnerOptions, random: Random): if options.rising_tides: weights_overrrides: Dict[str, Union[str, Dict[str, int]]] = self.get_flood_weights_overrides(options) @@ -51,6 +53,26 @@ class PreCalculatedWeights: self.flood_lake_serene_bridge = False self.flood_lab = False + boss_rando_weights_overrides: Dict[str, Union[str, Dict[str, int]]] = self.get_boss_rando_weights_overrides(options) + self.boss_rando_overrides = { + "FelineSentry": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "FelineSentry"), + "Varndagroth": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Varndagroth"), + "AzureQueen": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "AzureQueen"), + "GoldenIdol": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "GoldenIdol"), + "Aelana": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Aelana"), + "Maw": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Maw"), + "Cantoran": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Cantoran"), + "Genza": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Genza"), + "Nuvius": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Nuvius"), + "Vol": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Vol"), + "Prince": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Prince"), + "Xarion": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Xarion"), + "Ravenlord": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Ravenlord"), + "Ifrit": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Ifrit"), + "Sandman": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Sandman"), + "Nightmare": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Nightmare") + } + self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ self.get_pyramid_keys_unlocks(options, random, self.flood_maw, self.flood_xarion, self.flood_lab) @@ -142,3 +164,32 @@ class PreCalculatedWeights: return True, True elif result == "FloodedWithSavePointAvailable": return True, False + + @staticmethod + def get_boss_rando_weights_overrides(options: TimespinnerOptions) -> Dict[str, Union[str, Dict[str, int]]]: + weights_overrides_option: Union[int, Dict[str, Union[str, Dict[str, int]]]] = \ + options.boss_rando_overrides.value + + default_weights: Dict[str, Dict[str, int]] = options.boss_rando_overrides.default + + if not weights_overrides_option: + weights_overrides_option = default_weights + else: + for key, weights in default_weights.items(): + if not key in weights_overrides_option: + weights_overrides_option[key] = weights + + return weights_overrides_option + + @staticmethod + def roll_boss_rando_setting(random: Random, all_weights: Dict[str, Union[Dict[str, int], str]], + key: str) -> str: + + weights: Union[Dict[str, int], str] = all_weights[key] + + if isinstance(weights, dict): + result: str = random.choices(list(weights.keys()), weights=list(map(int, weights.values())))[0] + else: + result: str = weights + + return result diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 0bd9c7d1..3f117837 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -3,7 +3,7 @@ from BaseClasses import Item, Tutorial, ItemClassification from .Items import get_item_names_per_category from .Items import item_table, starter_melee_weapons, starter_spells, filler_items, starter_progression_items, pyramid_start_starter_progression_items from .Locations import get_location_datas, EventId -from .Options import BackwardsCompatiableTimespinnerOptions, Toggle +from .Options import BackwardsCompatiableTimespinnerOptions, Toggle, BossRandoType from .PreCalculatedWeights import PreCalculatedWeights from .Regions import create_regions_and_locations from worlds.AutoWorld import World, WebWorld @@ -104,6 +104,8 @@ class TimespinnerWorld(World): "Cantoran": self.options.cantoran.value, "LoreChecks": self.options.lore_checks.value, "BossRando": self.options.boss_rando.value, + "BossRandoType": self.options.boss_rando_type.value, + "BossRandoOverrides": self.precalculated_weights.boss_rando_overrides, "EnemyRando": self.options.enemy_rando.value, "DamageRando": self.options.damage_rando.value, "DamageRandoOverrides": self.options.damage_rando_overrides.value, @@ -181,6 +183,8 @@ class TimespinnerWorld(World): self.options.cantoran.value = slot_data["Cantoran"] self.options.lore_checks.value = slot_data["LoreChecks"] self.options.boss_rando.value = slot_data["BossRando"] + self.options.boss_rando_type.value = slot_data["BossRandoType"] + self.precalculated_weights.boss_rando_overrides = slot_data["BossRandoOverrides"] self.options.damage_rando.value = slot_data["DamageRando"] self.options.damage_rando_overrides.value = slot_data["DamageRandoOverrides"] self.options.hp_cap.value = slot_data["HpCap"] @@ -201,6 +205,7 @@ class TimespinnerWorld(World): self.options.rising_tides.value = slot_data["RisingTides"] self.options.unchained_keys.value = slot_data["UnchainedKeys"] self.options.back_to_the_future.value = slot_data["PresentAccessWithWheelAndSpindle"] + self.options.prism_break.value = slot_data["PrismBreak"] self.options.traps.value = slot_data["Traps"] self.options.death_link.value = slot_data["DeathLink"] # Readonly slot_data["StinkyMaw"] @@ -237,7 +242,10 @@ class TimespinnerWorld(World): spoiler_handle.write(f'Mysterious Warp Beacon unlock: {self.precalculated_weights.time_key_unlock}\n') else: spoiler_handle.write(f'Twin Pyramid Keys unlock: {self.precalculated_weights.pyramid_keys_unlock}\n') - + + if self.options.boss_rando.value and self.options.boss_rando_type.value == BossRandoType.option_manual: + spoiler_handle.write(f'Selected bosses: {self.precalculated_weights.boss_rando_overrides}\n') + if self.options.rising_tides: flooded_areas: List[str] = [] From 27e50aa81a3684c02c5eaf0900d81a389cc70ca6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 11 Sep 2025 00:42:52 +0200 Subject: [PATCH 072/204] =?UTF-8?q?MultiServer:=20Make=20it=20so=20hint=5F?= =?UTF-8?q?location=20doesn't=20set=20an=20automatic=20priority=C2=A0#4713?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MultiServer.py | 90 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 2b58b340..45b1178d 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1135,8 +1135,13 @@ def register_location_checks(ctx: Context, team: int, slot: int, locations: typi ctx.save() -def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, str], auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, str], + status: HintStatus | None = None) -> typing.List[Hint]: + """ + Collect a new hint for a given item id or name, with a given status. + If status is None (which is the default value), an automatic status will be determined from the item's quality. + """ + hints = [] slots: typing.Set[int] = {slot} for group_id, group in ctx.groups.items(): @@ -1152,25 +1157,38 @@ def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, st else: found = location_id in ctx.location_checks[team, finding_player] entrance = ctx.er_hint_data.get(finding_player, {}).get(location_id, "") - new_status = auto_status + if found: - new_status = HintStatus.HINT_FOUND - elif item_flags & ItemClassification.trap: - new_status = HintStatus.HINT_AVOID - hints.append(Hint(receiving_player, finding_player, location_id, item_id, found, entrance, - item_flags, new_status)) + status = HintStatus.HINT_FOUND + elif status is None: + if item_flags & ItemClassification.trap: + status = HintStatus.HINT_AVOID + else: + status = HintStatus.HINT_PRIORITY + + hints.append( + Hint(receiving_player, finding_player, location_id, item_id, found, entrance, item_flags, status) + ) return hints -def collect_hint_location_name(ctx: Context, team: int, slot: int, location: str, auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hint_location_name(ctx: Context, team: int, slot: int, location: str, + status: HintStatus | None = HintStatus.HINT_UNSPECIFIED) -> typing.List[Hint]: + """ + Collect a new hint for a given location name, with a given status (defaults to "unspecified"). + If None is passed for the status, then an automatic status will be determined from the item's quality. + """ seeked_location: int = ctx.location_names_for_game(ctx.games[slot])[location] - return collect_hint_location_id(ctx, team, slot, seeked_location, auto_status) + return collect_hint_location_id(ctx, team, slot, seeked_location, status) -def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location: int, auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location: int, + status: HintStatus | None = HintStatus.HINT_UNSPECIFIED) -> typing.List[Hint]: + """ + Collect a new hint for a given location id, with a given status (defaults to "unspecified"). + If None is passed for the status, then an automatic status will be determined from the item's quality. + """ prev_hint = ctx.get_hint(team, slot, seeked_location) if prev_hint: return [prev_hint] @@ -1180,13 +1198,16 @@ def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location found = seeked_location in ctx.location_checks[team, slot] entrance = ctx.er_hint_data.get(slot, {}).get(seeked_location, "") - new_status = auto_status + if found: - new_status = HintStatus.HINT_FOUND - elif item_flags & ItemClassification.trap: - new_status = HintStatus.HINT_AVOID - return [Hint(receiving_player, slot, seeked_location, item_id, found, entrance, item_flags, - new_status)] + status = HintStatus.HINT_FOUND + elif status is None: + if item_flags & ItemClassification.trap: + status = HintStatus.HINT_AVOID + else: + status = HintStatus.HINT_PRIORITY + + return [Hint(receiving_player, slot, seeked_location, item_id, found, entrance, item_flags, status)] return [] @@ -1610,7 +1631,6 @@ class ClientMessageProcessor(CommonCommandProcessor): def get_hints(self, input_text: str, for_location: bool = False) -> bool: points_available = get_client_points(self.ctx, self.client) cost = self.ctx.get_hint_cost(self.client.slot) - auto_status = HintStatus.HINT_UNSPECIFIED if for_location else HintStatus.HINT_PRIORITY if not input_text: hints = {hint.re_check(self.ctx, self.client.team) for hint in self.ctx.hints[self.client.team, self.client.slot]} @@ -1636,9 +1656,9 @@ class ClientMessageProcessor(CommonCommandProcessor): self.output(f"Sorry, \"{hint_name}\" is marked as non-hintable.") hints = [] elif not for_location: - hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_id, auto_status) + hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_id) else: - hints = collect_hint_location_id(self.ctx, self.client.team, self.client.slot, hint_id, auto_status) + hints = collect_hint_location_id(self.ctx, self.client.team, self.client.slot, hint_id) else: game = self.ctx.games[self.client.slot] @@ -1658,16 +1678,18 @@ class ClientMessageProcessor(CommonCommandProcessor): hints = [] for item_name in self.ctx.item_name_groups[game][hint_name]: if item_name in self.ctx.item_names_for_game(game): # ensure item has an ID - hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item_name, auto_status)) + hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item_name)) elif not for_location and hint_name in self.ctx.item_names_for_game(game): # item name - hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_name, auto_status) + hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_name) elif hint_name in self.ctx.location_name_groups[game]: # location group name hints = [] for loc_name in self.ctx.location_name_groups[game][hint_name]: if loc_name in self.ctx.location_names_for_game(game): - hints.extend(collect_hint_location_name(self.ctx, self.client.team, self.client.slot, loc_name, auto_status)) + hints.extend( + collect_hint_location_name(self.ctx, self.client.team, self.client.slot, loc_name) + ) else: # location name - hints = collect_hint_location_name(self.ctx, self.client.team, self.client.slot, hint_name, auto_status) + hints = collect_hint_location_name(self.ctx, self.client.team, self.client.slot, hint_name) else: self.output(response) @@ -1945,8 +1967,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): target_item, target_player, flags = ctx.locations[client.slot][location] if create_as_hint: - hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location, - HintStatus.HINT_UNSPECIFIED)) + hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location)) locs.append(NetworkItem(target_item, location, target_player, flags)) ctx.notify_hints(client.team, hints, only_new=create_as_hint == 2, persist_even_if_found=True) if locs and create_as_hint: @@ -2359,9 +2380,9 @@ class ServerCommandProcessor(CommonCommandProcessor): hints = [] for item_name_from_group in self.ctx.item_name_groups[game][item]: if item_name_from_group in self.ctx.item_names_for_game(game): # ensure item has an ID - hints.extend(collect_hints(self.ctx, team, slot, item_name_from_group, HintStatus.HINT_PRIORITY)) + hints.extend(collect_hints(self.ctx, team, slot, item_name_from_group)) else: # item name or id - hints = collect_hints(self.ctx, team, slot, item, HintStatus.HINT_PRIORITY) + hints = collect_hints(self.ctx, team, slot, item) if hints: self.ctx.notify_hints(team, hints) @@ -2395,17 +2416,14 @@ class ServerCommandProcessor(CommonCommandProcessor): if usable: if isinstance(location, int): - hints = collect_hint_location_id(self.ctx, team, slot, location, - HintStatus.HINT_UNSPECIFIED) + hints = collect_hint_location_id(self.ctx, team, slot, location) elif game in self.ctx.location_name_groups and location in self.ctx.location_name_groups[game]: hints = [] for loc_name_from_group in self.ctx.location_name_groups[game][location]: if loc_name_from_group in self.ctx.location_names_for_game(game): - hints.extend(collect_hint_location_name(self.ctx, team, slot, loc_name_from_group, - HintStatus.HINT_UNSPECIFIED)) + hints.extend(collect_hint_location_name(self.ctx, team, slot, loc_name_from_group)) else: - hints = collect_hint_location_name(self.ctx, team, slot, location, - HintStatus.HINT_UNSPECIFIED) + hints = collect_hint_location_name(self.ctx, team, slot, location) if hints: self.ctx.notify_hints(team, hints) else: From 76a8b0d582b61e4457af0c54a06700528b8e9065 Mon Sep 17 00:00:00 2001 From: Yaranorgoth Date: Fri, 12 Sep 2025 23:32:42 +0200 Subject: [PATCH 073/204] CCCharles: Bug fix for cyclic connections of Entrances with the ignored rules by the logic (#5442) * Add cccharles world to AP > The logic has been tested, the game can be completed > The logic is simple and it does not take into account options ! The documentations are a work in progress * Update documentations > Redacted French and English Setup Guides > Redacted French and English Game Pages * Handling PR#5287 remarks > Revert unexpected changes on .run\Archipelago Unittests.run.xml (base Archipelago file) > Fixed typo "querty" -> "qwerty" in fr and eng Game Pages > Adding "Game page in other languages" section to eng Game Page documentation > Improved Steam path in fr and eng Setup Guides * Handled PR remarks + fixes > Added get_filler_item_name() to remove warnings > Fixed irrelevant links for documentations > Used the Player Options page instead of the default YAML on GitHub > Reworded all locations to make them simple and clear > Split some locations that can be linked with an entrance rule > Reworked all options > Updated regions according to locations > Replaced unnecessary rules by rules on entrances * Empty Options.py Only the base options are handled yet, "work in progress" features removed. * Handled PR remark > Fixed specific UT name * Handled PR remarks > UT updated by replacing depreciated features * Add start_inventory_from_pool as option This start_inventory_from_pool option is like regular start inventory but it takes items from the pool and replaces them with fillers Co-authored-by: Scipio Wright * Handled PR remarks > Mainly fixed editorial and minor issues without impact on UT results (still passed) * Update the guides according to releases > Updated the depreciated guides because the may to release the Mod has been changed > Removed the fixed issues from 'Known Issues' > Add the "Mod Download" section to simplify the others sections. * Handled PR remark > base_id reduced to ensure it fits to signed int (32 bits) in case of future AP improvements * Handled PR remarks > Set topology_present to False because unnecessary > Added an exception in case of unknown item instead of using filler classification > Fixed an issue that caused the "Bug Spray" to be considered as filler > Reworked the test_claire_breakers() test to ensure the lighthouse mission can only be finished if at least 4 breakers are collected * Added Choo-Choo Charles to README.md * CCCharles: Added rules to win > The victory could be accessed from sphere 1, this is now fixed by adding the following items as requirements: - Temple Key - Green Egg - Blue Egg - Red Egg * CCCharles: Fixed cyclic Entrances connections --------- Co-authored-by: Scipio Wright --- worlds/cccharles/Regions.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/worlds/cccharles/Regions.py b/worlds/cccharles/Regions.py index 42230145..68239dc0 100644 --- a/worlds/cccharles/Regions.py +++ b/worlds/cccharles/Regions.py @@ -232,11 +232,9 @@ def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> # Connect the Regions by named Entrances that must have access Rules menu_region.connect(start_camp_region) menu_region.connect(tony_tiddle_mission_region) - menu_region.connect(barn_region) - tony_tiddle_mission_region.connect(barn_region, "Barn Door") + menu_region.connect(barn_region, "Barn Door") menu_region.connect(candice_mission_region) - menu_region.connect(tutorial_house_region) - candice_mission_region.connect(tutorial_house_region, "Tutorial House Door") + menu_region.connect(tutorial_house_region, "Tutorial House Door") menu_region.connect(swamp_edges_region) menu_region.connect(swamp_mission_region) menu_region.connect(junkyard_area_region) @@ -244,7 +242,6 @@ def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> menu_region.connect(junkyard_shed_region) menu_region.connect(military_base_region) menu_region.connect(south_mine_outside_region) - menu_region.connect(south_mine_inside_region) south_mine_outside_region.connect(south_mine_inside_region, "South Mine Gate") menu_region.connect(middle_station_region) menu_region.connect(canyon_region) @@ -258,13 +255,11 @@ def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> menu_region.connect(lost_stairs_region) menu_region.connect(east_house_region) menu_region.connect(rockets_testing_ground_region) - menu_region.connect(rockets_testing_bunker_region) rockets_testing_ground_region.connect(rockets_testing_bunker_region, "Stuck Bunker Door") menu_region.connect(workshop_region) menu_region.connect(east_tower_region) menu_region.connect(lighthouse_region) menu_region.connect(north_mine_outside_region) - menu_region.connect(north_mine_inside_region) north_mine_outside_region.connect(north_mine_inside_region, "North Mine Gate") menu_region.connect(wood_bridge_region) menu_region.connect(museum_region) @@ -278,11 +273,9 @@ def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> menu_region.connect(north_beach_region) menu_region.connect(mine_shaft_region) menu_region.connect(mob_camp_region) - menu_region.connect(mob_camp_locked_room_region) mob_camp_region.connect(mob_camp_locked_room_region, "Mob Camp Locked Door") menu_region.connect(mine_elevator_exit_region) menu_region.connect(mountain_ruin_outside_region) - menu_region.connect(mountain_ruin_inside_region) mountain_ruin_outside_region.connect(mountain_ruin_inside_region, "Mountain Ruin Gate") menu_region.connect(prism_temple_region) menu_region.connect(pickle_val_region) From 4e085894d2b177fdd34eccbcde70df804fc89842 Mon Sep 17 00:00:00 2001 From: Salzkorn Date: Fri, 12 Sep 2025 23:48:29 +0200 Subject: [PATCH 074/204] SC2: Region access rule speedups (#5426) --- worlds/sc2/mission_order/entry_rules.py | 75 +++++++++++++++++++++++-- worlds/sc2/mission_order/generation.py | 63 ++++++++++++++++----- 2 files changed, 120 insertions(+), 18 deletions(-) diff --git a/worlds/sc2/mission_order/entry_rules.py b/worlds/sc2/mission_order/entry_rules.py index cb3afb37..afa872de 100644 --- a/worlds/sc2/mission_order/entry_rules.py +++ b/worlds/sc2/mission_order/entry_rules.py @@ -10,6 +10,10 @@ from BaseClasses import CollectionState if TYPE_CHECKING: from .nodes import SC2MOGenMission +def always_true(state: CollectionState) -> bool: + """Helper method to avoid creating trivial lambdas""" + return True + class EntryRule(ABC): buffer_fulfilled: bool @@ -60,6 +64,11 @@ class EntryRule(ABC): """Used in the client to determine accessibility while playing and to populate tooltips.""" pass + @abstractmethod + def find_mandatory_mission(self) -> SC2MOGenMission | None: + """Should return any mission that is mandatory to fulfill the entry rule, or `None` if there is no such mission.""" + return None + @dataclass class RuleData(ABC): @@ -103,6 +112,11 @@ class BeatMissionsEntryRule(EntryRule): mission_ids, resolved_reqs ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if len(self.missions_to_beat) > 0: + return self.missions_to_beat[0] + return None @dataclass @@ -140,7 +154,7 @@ class CountMissionsEntryRule(EntryRule): def __init__(self, missions_to_count: List[SC2MOGenMission], target_amount: int, visual_reqs: List[Union[str, SC2MOGenMission]]): super().__init__() self.missions_to_count = missions_to_count - if target_amount == -1 or target_amount > len(missions_to_count): + if target_amount <= -1 or target_amount > len(missions_to_count): self.target_amount = len(missions_to_count) else: self.target_amount = target_amount @@ -155,7 +169,20 @@ class CountMissionsEntryRule(EntryRule): return max(mission_depth, self.target_amount - 1) # -1 because depth is zero-based but amount is one-based def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: - return lambda state: self.target_amount <= sum(state.has(mission.beat_item(), player) for mission in self.missions_to_count) + if self.target_amount == 0: + return always_true + + beat_items = [mission.beat_item() for mission in self.missions_to_count] + def count_missions(state: CollectionState) -> bool: + count = 0 + for mission in range(len(self.missions_to_count)): + if state.has(beat_items[mission], player): + count += 1 + if count == self.target_amount: + return True + return False + + return count_missions def to_slot_data(self) -> RuleData: resolved_reqs: List[Union[str, int]] = [req if isinstance(req, str) else req.mission.id for req in self.visual_reqs] @@ -165,6 +192,11 @@ class CountMissionsEntryRule(EntryRule): self.target_amount, resolved_reqs ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if self.target_amount > 0 and self.target_amount == len(self.missions_to_count): + return self.missions_to_count[0] + return None @dataclass @@ -216,13 +248,21 @@ class SubRuleEntryRule(EntryRule): self.rule_id = rule_id self.rules_to_check = rules_to_check self.min_depth = -1 - if target_amount == -1 or target_amount > len(rules_to_check): + if target_amount <= -1 or target_amount > len(rules_to_check): self.target_amount = len(rules_to_check) else: self.target_amount = target_amount def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: - return self.target_amount <= sum(rule.is_fulfilled(beaten_missions, in_region_check) for rule in self.rules_to_check) + if len(self.rules_to_check) == 0: + return True + count = 0 + for rule in self.rules_to_check: + if rule.is_fulfilled(beaten_missions, in_region_check): + count += 1 + if count == self.target_amount: + return True + return False def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: if len(self.rules_to_check) == 0: @@ -235,7 +275,21 @@ class SubRuleEntryRule(EntryRule): def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: sub_lambdas = [rule.to_lambda(player) for rule in self.rules_to_check] - return lambda state, sub_lambdas=sub_lambdas: self.target_amount <= sum(sub_lambda(state) for sub_lambda in sub_lambdas) + if self.target_amount == 0: + return always_true + if len(sub_lambdas) == 1: + return sub_lambdas[0] + + def count_rules(state: CollectionState) -> bool: + count = 0 + for sub_lambda in sub_lambdas: + if sub_lambda(state): + count += 1 + if count == self.target_amount: + return True + return False + + return count_rules def to_slot_data(self) -> SubRuleRuleData: sub_rules = [rule.to_slot_data() for rule in self.rules_to_check] @@ -244,6 +298,14 @@ class SubRuleEntryRule(EntryRule): sub_rules, self.target_amount ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if self.target_amount > 0 and self.target_amount == len(self.rules_to_check): + for sub_rule in self.rules_to_check: + mandatory_mission = sub_rule.find_mandatory_mission() + if mandatory_mission is not None: + return mandatory_mission + return None @dataclass @@ -362,6 +424,9 @@ class ItemEntryRule(EntryRule): item_ids, visual_reqs ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + return None @dataclass diff --git a/worlds/sc2/mission_order/generation.py b/worlds/sc2/mission_order/generation.py index 5582d7c3..928c0a45 100644 --- a/worlds/sc2/mission_order/generation.py +++ b/worlds/sc2/mission_order/generation.py @@ -491,23 +491,60 @@ def make_connections(mission_order: SC2MOGenMissionOrder, world: 'SC2World'): for layout in campaign.layouts: for mission in layout.missions: if not mission.option_empty: + mission_uses_rule = mission.entry_rule.target_amount > 0 mission_rule = mission.entry_rule.to_lambda(player) + mandatory_prereq = mission.entry_rule.find_mandatory_mission() # Only layout entrances need to consider campaign & layout prerequisites if mission.option_entrance: - campaign_rule = mission.parent().parent().entry_rule.to_lambda(player) - layout_rule = mission.parent().entry_rule.to_lambda(player) - unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule, mission_rule=mission_rule: \ - campaign_rule(state) and layout_rule(state) and mission_rule(state) - else: + campaign_uses_rule = campaign.entry_rule.target_amount > 0 + campaign_rule = campaign.entry_rule.to_lambda(player) + layout_uses_rule = layout.entry_rule.target_amount > 0 + layout_rule = layout.entry_rule.to_lambda(player) + + # Any mandatory prerequisite mission is good enough + mandatory_prereq = campaign.entry_rule.find_mandatory_mission() if mandatory_prereq is None else mandatory_prereq + mandatory_prereq = layout.entry_rule.find_mandatory_mission() if mandatory_prereq is None else mandatory_prereq + + # Avoid calling obviously unused lambdas + if campaign_uses_rule: + if layout_uses_rule: + if mission_uses_rule: + unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule, mission_rule=mission_rule: \ + campaign_rule(state) and layout_rule(state) and mission_rule(state) + else: + unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule: \ + campaign_rule(state) and layout_rule(state) + else: + if mission_uses_rule: + unlock_rule = lambda state, campaign_rule=campaign_rule, mission_rule=mission_rule: \ + campaign_rule(state) and mission_rule(state) + else: + unlock_rule = campaign_rule + elif layout_uses_rule: + if mission_uses_rule: + unlock_rule = lambda state, layout_rule=layout_rule, mission_rule=mission_rule: \ + layout_rule(state) and mission_rule(state) + else: + unlock_rule = layout_rule + elif mission_uses_rule: + unlock_rule = mission_rule + else: + unlock_rule = None + elif mission_uses_rule: unlock_rule = mission_rule - # Individually connect to previous missions - for prev_mission in mission.prev: - connect(world, names, prev_mission.mission.mission_name, mission.mission.mission_name, - lambda state, unlock_rule=unlock_rule: unlock_rule(state)) - # If there are no previous missions, connect to Menu instead - if len(mission.prev) == 0: - connect(world, names, "Menu", mission.mission.mission_name, - lambda state, unlock_rule=unlock_rule: unlock_rule(state)) + else: + unlock_rule = None + + # Connect to a discovered mandatory mission if possible + if mandatory_prereq is not None: + connect(world, names, mandatory_prereq.mission.mission_name, mission.mission.mission_name, unlock_rule) + else: + # If no mission is known to be mandatory, connect to all previous missions instead + for prev_mission in mission.prev: + connect(world, names, prev_mission.mission.mission_name, mission.mission.mission_name, unlock_rule) + # As a last resort connect to Menu + if len(mission.prev) == 0: + connect(world, names, "Menu", mission.mission.mission_name, unlock_rule) def connect(world: 'SC2World', used_names: Dict[str, int], source: str, target: str, From 597583577a3207f6a4ad2afd9165778a010d9070 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 13 Sep 2025 16:07:13 +0200 Subject: [PATCH 075/204] KH1: Remove top level script & remove script_name from its component (#5443) --- KH1Client.py | 9 --------- worlds/kh1/__init__.py | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 KH1Client.py diff --git a/KH1Client.py b/KH1Client.py deleted file mode 100644 index 4c3ed501..00000000 --- a/KH1Client.py +++ /dev/null @@ -1,9 +0,0 @@ -if __name__ == '__main__': - import ModuleUpdate - ModuleUpdate.update() - - import Utils - Utils.init_logging("KH1Client", exception_logger="Client") - - from worlds.kh1.Client import launch - launch() diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index f14f6ea3..fbdc9920 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -21,7 +21,7 @@ def launch_client(): launch_component(launch, name="KH1 Client") -components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart")) +components.append(Component("KH1 Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart")) icon_paths["kh1_heart"] = f"ap:{__name__}/icons/kh1_heart.png" From 9c00eb91d6eeb822ae565ab5a1dd86882d60e857 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 14 Sep 2025 02:01:41 +0200 Subject: [PATCH 076/204] WebHost: fix Internal Server Error if parallel access to /room/* happens (#5444) --- WebHostLib/misc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index c57a6386..b3088267 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -260,7 +260,10 @@ def host_room(room: UUID): # indicate that the page should reload to get the assigned port should_refresh = ((not room.last_port and now - room.creation_time < datetime.timedelta(seconds=3)) or room.last_activity < now - datetime.timedelta(seconds=room.timeout)) - with db_session: + + if now - room.last_activity > datetime.timedelta(minutes=1): + # we only set last_activity if needed, otherwise parallel access on /room will cause an internal server error + # due to "pony.orm.core.OptimisticCheckError: Object Room was updated outside of current transaction" room.last_activity = now # will trigger a spinup, if it's not already running browser_tokens = "Mozilla", "Chrome", "Safari" From 71de33d7ddc00780f8af864c96b31d97bf61f788 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 13 Sep 2025 18:02:03 -0600 Subject: [PATCH 077/204] CI: Fix peer review tag on undrafting a PR (#5282) * Move ready for review condition out of non-draft check * Remove condition on labeler * Revert condition --- .github/workflows/label-pull-requests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/label-pull-requests.yml b/.github/workflows/label-pull-requests.yml index 4a7d4034..1675c942 100644 --- a/.github/workflows/label-pull-requests.yml +++ b/.github/workflows/label-pull-requests.yml @@ -12,7 +12,6 @@ env: jobs: labeler: name: 'Apply content-based labels' - if: github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'synchronize' runs-on: ubuntu-latest steps: - uses: actions/labeler@v5 From 174d89c81f0a6e7115f78f8ddbf8af33762e062b Mon Sep 17 00:00:00 2001 From: Adrian Priestley <47989725+a-priestley@users.noreply.github.com> Date: Sun, 14 Sep 2025 09:54:53 -0230 Subject: [PATCH 078/204] feat(workflow): Implement new Github workflow for building and pushing container images (#5242) * fix(workflows): Update Docker workflow tag pattern - Change tag pattern from "v*" to "*.*.*" for better version matching - Add new semver pattern type for major version * squash! fix(workflows): Update Docker workflow tag pattern - Change tag pattern from "v*" to "*.*.*" for better version matching - Add new semver pattern type for major version * Update docker.yml * Update docker.yml * Update docker.yml * fix(docker): Correct copy command to use recursive flag for EnemizerCLI - Changed 'cp' to 'cp -r' to properly copy EnemizerCLI directory * fixup! Update docker.yml * fix(docker): Correct copy command to use recursive flag for EnemizerCLI - Changed 'cp' to 'cp -r' to properly copy EnemizerCLI directory * chore(workflow): Update Docker workflow to support multiple platforms - Removed matrix strategy for platform selection - Set platforms directly in the Docker Buildx step * docs(deployment): Update container deployment documentation - Specify minimum versions for Docker and Podman - Add requirement for Docker Buildx plugin * fix(workflows): Exclude specific paths from Docker build triggers - Prevent unnecessary builds for documentation and deployment files * feat(ci): Update Docker workflow for multi-architecture builds - Added new build job for ARM64 architecture support - Created a multi-arch manifest to manage image variants - Improved Docker Buildx setup and push steps for both architectures * fixup! feat(ci): Update Docker workflow for multi-architecture builds - Added new build job for ARM64 architecture support - Created a multi-arch manifest to manage image variants - Improved Docker Buildx setup and push steps for both architectures * fixup! feat(ci): Update Docker workflow for multi-architecture builds - Added new build job for ARM64 architecture support - Created a multi-arch manifest to manage image variants - Improved Docker Buildx setup and push steps for both architectures * fixup! feat(ci): Update Docker workflow for multi-architecture builds - Added new build job for ARM64 architecture support - Created a multi-arch manifest to manage image variants - Improved Docker Buildx setup and push steps for both architectures * fix(workflow): Cleanup temporary image tags * fixup! fix(workflow): Cleanup temporary image tags * fixup! fix(workflow): Cleanup temporary image tags * fixup! fix(workflow): Cleanup temporary image tags * fix(workflow): Apply scoped build cache to eliminate race condition between jobs. * fixup! fix(workflow): Apply scoped build cache to eliminate race condition between jobs. * Remove branch wildcard * Test comment * Revert wildcard removal * Remove `pr` event * Revert `pr` event removal * fixup! Revert `pr` event removal * Update docker.yml * Update docker.yml * Update docker.yml * feat(workflows): Add docker workflow to compute final tags - Introduce a step to compute final tags based on GitHub ref type - Ensure 'latest' tag is set for version tags * chore(workflow): Enable manual dispatch for Docker workflow - Add workflow_dispatch event trigger to allow manual runs * fix(workflows): Update Docker workflow to handle tag outputs correctly - Use readarray to handle tags as an array - Prevent duplicate latest tags in the tags list - Set multiline output for tags in GitHub Actions * Update docker.yml Use new `is_not_default_branch` condition * Update docker.yml Allow "v" prefix for semver git tags qualifying for `latest` image tag * Update docker.yml Tighten up `tags` push pattern mirroring that of `release` workflow. * Merge branch 'ArchipelagoMW:main' into main * Update docker.yml * Merge branch 'ArchipelagoMW:main' into docker_wf * Update docker.yml Use new `is_not_default_branch` condition * Update docker.yml Allow "v" prefix for semver git tags qualifying for `latest` image tag * Update docker.yml Tighten up `tags` push pattern mirroring that of `release` workflow. * ci(docker): refactor multi-arch build to use matrix strategy - Consolidate separate amd64 and arm64 jobs into a single build job - Introduce matrix for platform, runner, suffix, and cache-scope - Generalize tag computation and build steps with matrix variables * fixup! ci(docker): refactor multi-arch build to use matrix strategy - Consolidate separate amd64 and arm64 jobs into a single build job - Introduce matrix for platform, runner, suffix, and cache-scope - Generalize tag computation and build steps with matrix variables --- .github/workflows/docker.yml | 154 +++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..cf9ce08f --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,154 @@ +name: Build and Publish Docker Images + +on: + push: + paths: + - "**" + - "!docs/**" + - "!deploy/**" + - "!setup.py" + - "!.gitignore" + - "!.github/workflows/**" + - ".github/workflows/docker.yml" + branches: + - "*" + tags: + - "v?[0-9]+.[0-9]+.[0-9]*" + workflow_dispatch: + +env: + REGISTRY: ghcr.io + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + image-name: ${{ steps.image.outputs.name }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + package-name: ${{ steps.package.outputs.name }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set lowercase image name + id: image + run: | + echo "name=${GITHUB_REPOSITORY,,}" >> $GITHUB_OUTPUT + + - name: Set package name + id: package + run: | + echo "name=$(basename ${GITHUB_REPOSITORY,,})" >> $GITHUB_OUTPUT + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ steps.image.outputs.name }} + tags: | + type=ref,event=branch,enable={{is_not_default_branch}} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=nightly,enable={{is_default_branch}} + + - name: Compute final tags + id: final-tags + run: | + readarray -t tags <<< "${{ steps.meta.outputs.tags }}" + + if [[ "${{ github.ref_type }}" == "tag" ]]; then + tag="${{ github.ref_name }}" + if [[ "$tag" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + full_latest="${{ env.REGISTRY }}/${{ steps.image.outputs.name }}:latest" + # Check if latest is already in tags to avoid duplicates + if ! printf '%s\n' "${tags[@]}" | grep -q "^$full_latest$"; then + tags+=("$full_latest") + fi + fi + fi + + # Set multiline output + echo "tags<> $GITHUB_OUTPUT + printf '%s\n' "${tags[@]}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + build: + needs: prepare + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + strategy: + matrix: + include: + - platform: amd64 + runner: ubuntu-latest + suffix: amd64 + cache-scope: amd64 + - platform: arm64 + runner: ubuntu-24.04-arm + suffix: arm64 + cache-scope: arm64 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Compute suffixed tags + id: tags + run: | + readarray -t tags <<< "${{ needs.prepare.outputs.tags }}" + suffixed=() + for t in "${tags[@]}"; do + suffixed+=("$t-${{ matrix.suffix }}") + done + echo "tags=$(IFS=','; echo "${suffixed[*]}")" >> $GITHUB_OUTPUT + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/${{ matrix.platform }} + push: true + tags: ${{ steps.tags.outputs.tags }} + labels: ${{ needs.prepare.outputs.labels }} + cache-from: type=gha,scope=${{ matrix.cache-scope }} + cache-to: type=gha,mode=max,scope=${{ matrix.cache-scope }} + provenance: false + + manifest: + needs: [prepare, build] + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create and push multi-arch manifest + run: | + readarray -t tag_array <<< "${{ needs.prepare.outputs.tags }}" + + for tag in "${tag_array[@]}"; do + docker manifest create "$tag" \ + "$tag-amd64" \ + "$tag-arm64" + + docker manifest push "$tag" + done From 9fdeecd9965b188e712f7ef4024a709d9836a79b Mon Sep 17 00:00:00 2001 From: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:08:57 -0400 Subject: [PATCH 079/204] KH2: Remove top level client script (#5446) * initial commit * remove kh2client.exe from setup --- KH2Client.py | 8 -------- worlds/kh2/__init__.py | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 KH2Client.py diff --git a/KH2Client.py b/KH2Client.py deleted file mode 100644 index 69e4adf8..00000000 --- a/KH2Client.py +++ /dev/null @@ -1,8 +0,0 @@ -import ModuleUpdate -import Utils -from worlds.kh2.Client import launch -ModuleUpdate.update() - -if __name__ == '__main__': - Utils.init_logging("KH2Client", exception_logger="Client") - launch() diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index 19c2aee6..3068e7bb 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -20,7 +20,7 @@ def launch_client(): launch_component(launch, name="KH2Client") -components.append(Component("KH2 Client", "KH2Client", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH2 Client", func=launch_client, component_type=Type.CLIENT)) class KingdomHearts2Web(WebWorld): From 8f2b4a961f5c956ee5aa58aad01df919371fcb42 Mon Sep 17 00:00:00 2001 From: Sunny Bat Date: Tue, 16 Sep 2025 10:26:06 -0700 Subject: [PATCH 080/204] Raft: Add Zipline Tool requirement to Engine controls blueprint #5455 --- worlds/raft/locations.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/raft/locations.json b/worlds/raft/locations.json index 5f73c2f8..8d04e304 100644 --- a/worlds/raft/locations.json +++ b/worlds/raft/locations.json @@ -810,7 +810,10 @@ { "id": 48105, "name": "Engine controls blueprint", - "region": "CaravanIsland" + "region": "CaravanIsland", + "requiresAccessToItems": [ + "Zipline tool" + ] }, { "id": 48106, From 73718bbd618651d1f75da8382944173cc6295448 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 19 Sep 2025 03:52:31 +0200 Subject: [PATCH 081/204] Core: make APContainer seek archipelago.json (#5261) --- worlds/Files.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/worlds/Files.py b/worlds/Files.py index 27c0e9c4..ece60c69 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -92,7 +92,7 @@ class APContainer: version: ClassVar[int] = container_version compression_level: ClassVar[int] = 9 compression_method: ClassVar[int] = zipfile.ZIP_DEFLATED - + manifest_path: str = "archipelago.json" path: Optional[str] def __init__(self, path: Optional[str] = None): @@ -116,7 +116,7 @@ class APContainer: except Exception as e: raise Exception(f"Manifest {manifest} did not convert to json.") from e else: - opened_zipfile.writestr("archipelago.json", manifest_str) + opened_zipfile.writestr(self.manifest_path, manifest_str) def read(self, file: Optional[Union[str, BinaryIO]] = None) -> None: """Read data into patch object. file can be file-like, such as an outer zip file's stream.""" @@ -137,7 +137,18 @@ class APContainer: raise InvalidDataError(f"{message}This might be the incorrect world version for this file") from e def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: - with opened_zipfile.open("archipelago.json", "r") as f: + try: + assert self.manifest_path.endswith("archipelago.json"), "Filename should be archipelago.json" + manifest_info = opened_zipfile.getinfo(self.manifest_path) + except KeyError as e: + for info in opened_zipfile.infolist(): + if info.filename.endswith("archipelago.json"): + manifest_info = info + self.manifest_path = info.filename + break + else: + raise e + with opened_zipfile.open(manifest_info, "r") as f: manifest = json.load(f) if manifest["compatible_version"] > self.version: raise Exception(f"File (version: {manifest['compatible_version']}) too new " @@ -248,10 +259,8 @@ class APProcedurePatch(APAutoPatchInterface): manifest["compatible_version"] = 5 return manifest - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: - super(APProcedurePatch, self).read_contents(opened_zipfile) - with opened_zipfile.open("archipelago.json", "r") as f: - manifest = json.load(f) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + manifest = super(APProcedurePatch, self).read_contents(opened_zipfile) if "procedure" not in manifest: # support patching files made before moving to procedures self.procedure = [("apply_bsdiff4", ["delta.bsdiff4"])] @@ -260,6 +269,7 @@ class APProcedurePatch(APAutoPatchInterface): for file in opened_zipfile.namelist(): if file not in ["archipelago.json"]: self.files[file] = opened_zipfile.read(file) + return manifest def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: super(APProcedurePatch, self).write_contents(opened_zipfile) From 3af1e92813261639e484406bbd289b2b0ba07000 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 21 Sep 2025 12:47:11 -0400 Subject: [PATCH 082/204] TUNIC: Update name of a chest in the UT poptracker map integration #5462 --- worlds/tunic/ut_stuff.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/tunic/ut_stuff.py b/worlds/tunic/ut_stuff.py index 2cf2f96a..1192b30d 100644 --- a/worlds/tunic/ut_stuff.py +++ b/worlds/tunic/ut_stuff.py @@ -96,6 +96,7 @@ poptracker_data: dict[str, int] = { "[Southwest] Chest Guarded By Turret/Behind the Trees": 509342519, "[Northwest] Shadowy Corner Chest/Dark Ramps Chest": 509342520, "[Southwest] Obscured In Tunnel To Beach/Deep in the Wall": 509342521, + "[Southwest] Obscured In Tunnel To Beach/Deep between the Trees": 509342521, "[Southwest] Grapple Chest Over Walkway/Jeffry": 509342522, "[Northwest] Chest Beneath Quarry Gate/Across the Bridge": 509342523, "[Southeast] Chest Near Swamp/Under the Bridge": 509342524, From 7badc3e745f3b50f1dd6d6d4619a16d373574331 Mon Sep 17 00:00:00 2001 From: Phaneros <31861583+MatthewMarinets@users.noreply.github.com> Date: Sun, 21 Sep 2025 09:54:22 -0700 Subject: [PATCH 083/204] SC2: Logic bugfixes (#5461) * sc2: Fixing always-true rules in locations.py; fixed two over-constrained rules that put vanilla out-of-logic * sc2: Minor min2() optimization in rules.py * sc2: Fixing a Shatter the Sky logic bug where w/a upgrades were checked too many times and for the wrong units --- worlds/sc2/locations.py | 62 ++++++++++----------- worlds/sc2/rules.py | 116 +++++++++++++++++++++------------------- 2 files changed, 88 insertions(+), 90 deletions(-) diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py index 0e00f4d7..203d4d26 100644 --- a/worlds/sc2/locations.py +++ b/worlds/sc2/locations.py @@ -2150,8 +2150,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state) - and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + lambda state: logic.terran_competent_comp(state, 2), ), make_location_data( SC2Mission.SHATTER_THE_SKY.mission_name, @@ -2172,24 +2171,21 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) - and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + lambda state: logic.terran_competent_comp(state, 2), ), make_location_data( SC2Mission.SHATTER_THE_SKY.mission_name, "Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) - and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + lambda state: logic.terran_competent_comp(state, 2), ), make_location_data( SC2Mission.SHATTER_THE_SKY.mission_name, "Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) - and logic.terran_army_weapon_armor_upgrade_min_level(state) >= 2, + lambda state: logic.terran_competent_comp(state, 2), hard_rule=logic.terran_any_anti_air, ), make_location_data( @@ -2262,7 +2258,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 100, LocationType.VICTORY, lambda state: ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), ), @@ -2279,7 +2275,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: LocationType.VANILLA, lambda state: adv_tactics or ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), ), @@ -2290,7 +2286,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: LocationType.VANILLA, lambda state: adv_tactics or ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), ), @@ -2301,7 +2297,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: LocationType.VANILLA, lambda state: adv_tactics or ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), ), @@ -2324,7 +2320,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: LocationType.EXTRA, lambda state: adv_tactics or ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), ), @@ -2334,7 +2330,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 108, LocationType.CHALLENGE, lambda state: ( - logic.zerg_common_unit + logic.zerg_common_unit(state) or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) ), flags=LocationFlag.SPEEDRUN, @@ -3862,15 +3858,11 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2LOTV_LOC_ID_OFFSET + 300, LocationType.VICTORY, lambda state: adv_tactics - or state.count_from_list( - ( - item_names.STALKER_PHASE_REACTOR, - item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, - item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, - ), - player, - ) - >= 2, + or state.has_any(( + item_names.STALKER_PHASE_REACTOR, + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, + ), player), ), make_location_data( SC2Mission.EVIL_AWOKEN.mission_name, @@ -4582,7 +4574,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: lambda state: ( logic.protoss_deathball(state) and logic.protoss_power_rating(state) >= 6 - and (adv_tactics or logic.protoss_fleet(state)) + and (adv_tactics or logic.protoss_unsealing_the_past_ledge_requirement(state)) ), ), make_location_data( @@ -4593,7 +4585,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: lambda state: ( logic.protoss_deathball(state) and logic.protoss_power_rating(state) >= 6 - and (adv_tactics or logic.protoss_fleet(state)) + and (adv_tactics or logic.protoss_unsealing_the_past_ledge_requirement(state)) ), ), make_location_data( @@ -7256,7 +7248,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 1809, LocationType.MASTERY, lambda state: ( - logic.protoss_anti_armor_anti_air + logic.protoss_anti_armor_anti_air(state) and logic.protoss_defense_rating(state, False) >= 6 and logic.protoss_common_unit(state) and logic.protoss_deathball(state) @@ -9087,7 +9079,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Close Obelisk", SC2_RACESWAP_LOC_ID_OFFSET + 4801, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit, + lambda state: adv_tactics or logic.zerg_common_unit(state), ), make_location_data( SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, @@ -11841,7 +11833,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Victory", SC2_RACESWAP_LOC_ID_OFFSET + 9600, LocationType.VICTORY, - lambda state: logic.protoss_deathball + lambda state: logic.protoss_deathball(state) or (adv_tactics and logic.protoss_competent_comp(state)), ), make_location_data( @@ -11876,7 +11868,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Main Path Command Center", SC2_RACESWAP_LOC_ID_OFFSET + 9605, LocationType.EXTRA, - lambda state: logic.protoss_deathball + lambda state: logic.protoss_deathball(state) or (adv_tactics and logic.protoss_competent_comp(state)), ), make_location_data( @@ -12026,7 +12018,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Victory", SC2_RACESWAP_LOC_ID_OFFSET + 10000, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp + lambda state: logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state), ), make_location_data( @@ -12034,7 +12026,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "First Prisoner Group", SC2_RACESWAP_LOC_ID_OFFSET + 10001, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp + lambda state: logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state), ), make_location_data( @@ -12042,7 +12034,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Second Prisoner Group", SC2_RACESWAP_LOC_ID_OFFSET + 10002, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp + lambda state: logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state), ), make_location_data( @@ -12050,7 +12042,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "First Pylon", SC2_RACESWAP_LOC_ID_OFFSET + 10003, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp + lambda state: logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state), ), make_location_data( @@ -12058,7 +12050,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: "Second Pylon", SC2_RACESWAP_LOC_ID_OFFSET + 10004, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp + lambda state: logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state), ), make_location_data( @@ -12661,7 +12653,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 11406, LocationType.CHALLENGE, lambda state: ( - logic.zerg_brothers_in_arms_requirement + logic.zerg_brothers_in_arms_requirement(state) and logic.zerg_base_buster(state) and logic.zerg_power_rating(state) >= 8 ), diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index 03072594..e6068ab2 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -47,8 +47,15 @@ if TYPE_CHECKING: from . import SC2World +def min2(a: int, b: int) -> int: + """`min()` that only takes two values; faster than baseline int by about 2x""" + if a <= b: + return a + return b + + class SC2Logic: - def __init__(self, world: Optional["SC2World"]): + def __init__(self, world: Optional["SC2World"]) -> None: # Note: Don't store a reference to the world so we can cache this object on the world object self.player = -1 if world is None else world.player self.logic_level: int = world.options.required_tactics.value if world else RequiredTactics.default @@ -109,7 +116,7 @@ class SC2Logic: # has_group with count = 0 is always true for item placement and always false for SC2 item filtering return state.has_group("Missions", self.player, 0) - def get_very_hard_required_upgrade_level(self): + def get_very_hard_required_upgrade_level(self) -> bool: return 2 if self.advanced_tactics else 3 def weapon_armor_upgrade_count(self, upgrade_item: str, state: CollectionState) -> int: @@ -133,7 +140,7 @@ class SC2Logic: count += 1 return count - def soa_power_rating(self, state: CollectionState): + def soa_power_rating(self, state: CollectionState) -> bool: power_rating = 0 # Spear of Adun Ultimates (Strongest) for item, rating in soa_ultimate_ratings.items(): @@ -203,7 +210,7 @@ class SC2Logic: def terran_common_unit(self, state: CollectionState) -> bool: return state.has_any(self.basic_terran_units, self.player) - def terran_early_tech(self, state: CollectionState): + def terran_early_tech(self, state: CollectionState) -> bool: """ Basic combat unit that can be deployed quickly from mission start :param state @@ -447,7 +454,7 @@ class SC2Logic: defense_score += 2 return defense_score - def terran_competent_comp(self, state: CollectionState) -> bool: + def terran_competent_comp(self, state: CollectionState, upgrade_level: int = 1) -> bool: # All competent comps require anti-air if not self.terran_competent_anti_air(state): return False @@ -455,12 +462,12 @@ class SC2Logic: infantry_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state) infantry_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, state) infantry = state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) - if infantry_weapons >= 2 and infantry_armor >= 1 and infantry and self.terran_bio_heal(state): + if infantry_weapons >= upgrade_level + 1 and infantry_armor >= upgrade_level and infantry and self.terran_bio_heal(state): return True # Mass Air-To-Ground ship_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) ship_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, state) - if ship_weapons >= 1 and ship_armor >= 1: + if ship_weapons >= upgrade_level and ship_armor >= upgrade_level: air = ( state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) @@ -473,7 +480,7 @@ class SC2Logic: # Strong Mech vehicle_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, state) vehicle_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, state) - if vehicle_weapons >= 1 and vehicle_armor >= 1: + if vehicle_weapons >= upgrade_level and vehicle_armor >= upgrade_level: strong_vehicle = state.has_any({item_names.THOR, item_names.SIEGE_TANK}, self.player) light_frontline = state.has_any( {item_names.MARINE, item_names.DOMINION_TROOPER, item_names.HELLION, item_names.VULTURE}, self.player @@ -762,27 +769,27 @@ class SC2Logic: def zerg_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL if self.has_zerg_melee_unit: - count = min(count, self.zerg_melee_weapon_armor_upgrade_min_level(state)) + count = min2(count, self.zerg_melee_weapon_armor_upgrade_min_level(state)) if self.has_zerg_ranged_unit: - count = min(count, self.zerg_ranged_weapon_armor_upgrade_min_level(state)) + count = min2(count, self.zerg_ranged_weapon_armor_upgrade_min_level(state)) if self.has_zerg_air_unit: - count = min(count, self.zerg_flyer_weapon_armor_upgrade_min_level(state)) + count = min2(count, self.zerg_flyer_weapon_armor_upgrade_min_level(state)) return count def zerg_melee_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: - return min( + return min2( self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, state), self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), ) def zerg_ranged_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: - return min( + return min2( self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, state), self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), ) def zerg_flyer_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: - return min( + return min2( self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, state), self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE, state), ) @@ -1082,20 +1089,17 @@ class SC2Logic: ) ) - def zergling_hydra_roach_start(self, state: CollectionState): + def zergling_hydra_roach_start(self, state: CollectionState) -> bool: """ Created mainly for engine of destruction start, but works for other missions with no-build starts. """ - return state.has_any( - { + return state.has_any(( item_names.ZERGLING_ADRENAL_OVERLOAD, item_names.HYDRALISK_FRENZY, item_names.ROACH_HYDRIODIC_BILE, item_names.ZERGLING_RAPTOR_STRAIN, item_names.ROACH_CORPSER_STRAIN, - }, - self.player, - ) + ), self.player) def kerrigan_levels(self, state: CollectionState, target: int, story_levels_available=True) -> bool: if (story_levels_available and self.story_levels_granted) or not self.kerrigan_unit_available: @@ -1111,7 +1115,7 @@ class SC2Logic: # Levels from missions beaten levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player) if self.kerrigan_levels_per_mission_completed_cap != -1: - levels = min(levels, self.kerrigan_levels_per_mission_completed_cap) + levels = min2(levels, self.kerrigan_levels_per_mission_completed_cap) # Levels from items for kerrigan_level_item in kerrigan_levels: level_amount = get_full_item_list()[kerrigan_level_item].number @@ -1119,7 +1123,7 @@ class SC2Logic: levels += item_count * level_amount # Total level cap if self.kerrigan_total_level_cap != -1: - levels = min(levels, self.kerrigan_total_level_cap) + levels = min2(levels, self.kerrigan_total_level_cap) return levels >= target @@ -1625,20 +1629,17 @@ class SC2Logic: and state.has_any((item_names.SUPPLICANT, item_names.SHIELD_BATTERY), self.player) ) - def zealot_sentry_slayer_start(self, state: CollectionState): + def zealot_sentry_slayer_start(self, state: CollectionState) -> bool: """ Created mainly for engine of destruction start, but works for other missions with no-build starts. """ - return state.has_any( - { + return state.has_any(( item_names.ZEALOT_WHIRLWIND, item_names.SENTRY_DOUBLE_SHIELD_RECHARGE, item_names.SLAYER_PHASE_BLINK, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, - }, - self.player, - ) + ), self.player) # Mission-specific rules def ghost_of_a_chance_requirement(self, state: CollectionState) -> bool: @@ -2012,7 +2013,7 @@ class SC2Logic: and (self.advanced_tactics or state.has(item_names.YGGDRASIL, self.player)) ) - def protoss_supernova_requirement(self, state: CollectionState): + def protoss_supernova_requirement(self, state: CollectionState) -> bool: return ( ( state.count(item_names.PROGRESSIVE_WARP_RELOCATE, self.player) >= 2 @@ -2133,7 +2134,7 @@ class SC2Logic: and self.protoss_fleet(state) ) - def terran_engine_of_destruction_requirement(self, state: CollectionState) -> int: + def terran_engine_of_destruction_requirement(self, state: CollectionState) -> bool: power_rating = self.terran_power_rating(state) if power_rating < 3 or not self.marine_medic_upgrade(state) or not self.terran_common_unit(state): return False @@ -2146,7 +2147,7 @@ class SC2Logic: and state.has_any((item_names.BANSHEE, item_names.LIBERATOR), self.player) ) - def zerg_engine_of_destruction_requirement(self, state: CollectionState) -> int: + def zerg_engine_of_destruction_requirement(self, state: CollectionState) -> bool: power_rating = self.zerg_power_rating(state) if ( power_rating < 3 @@ -2161,21 +2162,21 @@ class SC2Logic: else: return self.zerg_base_buster(state) - def protoss_engine_of_destruction_requirement(self, state: CollectionState): + def protoss_engine_of_destruction_requirement(self, state: CollectionState) -> bool: return ( self.zealot_sentry_slayer_start(state) and self.protoss_repair_odin(state) and (self.protoss_deathball(state) or self.protoss_fleet(state)) ) - def zerg_repair_odin(self, state: CollectionState): + def zerg_repair_odin(self, state: CollectionState) -> bool: return ( self.zerg_has_infested_scv(state) or state.has_all({item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION, item_names.SWARM_QUEEN}, self.player) or (self.advanced_tactics and state.has(item_names.SWARM_QUEEN, self.player)) ) - def protoss_repair_odin(self, state: CollectionState): + def protoss_repair_odin(self, state: CollectionState) -> bool: return ( state.has(item_names.SENTRY, self.player) or state.has_all((item_names.CARRIER, item_names.CARRIER_REPAIR_DRONES), self.player) @@ -2196,7 +2197,7 @@ class SC2Logic: def protoss_in_utter_darkness_requirement(self, state: CollectionState) -> bool: return self.protoss_competent_comp(state) and self.protoss_defense_rating(state, True) >= 4 - def terran_all_in_requirement(self, state: CollectionState): + def terran_all_in_requirement(self, state: CollectionState) -> bool: """ All-in """ @@ -2228,7 +2229,7 @@ class SC2Logic: and state.has_any({item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER, item_names.MISSILE_TURRET}, self.player) ) - def zerg_all_in_requirement(self, state: CollectionState): + def zerg_all_in_requirement(self, state: CollectionState) -> bool: """ All-in (Zerg) """ @@ -2264,7 +2265,7 @@ class SC2Logic: and state.has_any({item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET}, self.player) ) - def protoss_all_in_requirement(self, state: CollectionState): + def protoss_all_in_requirement(self, state: CollectionState) -> bool: """ All-in (Protoss) """ @@ -2436,21 +2437,19 @@ class SC2Logic: def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: return ( - state.has_any( - { - item_names.SCOUT, - item_names.TEMPEST, - item_names.CARRIER, - item_names.SKYLORD, - item_names.TRIREME, - item_names.VOID_RAY, - item_names.DESTROYER, - item_names.PULSAR, - item_names.DAWNBRINGER, - item_names.MOTHERSHIP, - }, - self.player, - ) + state.has_any(( + item_names.SCOUT, + item_names.SKIRMISHER, + item_names.TEMPEST, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.DAWNBRINGER, + item_names.MOTHERSHIP, + ), self.player) or self.protoss_has_blink(state) or ( state.has(item_names.WARP_PRISM, self.player) @@ -2697,6 +2696,12 @@ class SC2Logic: and (self.take_over_ai_allies or (self.zerg_competent_comp(state) and self.zerg_big_monsters(state))) and self.zerg_power_rating(state) >= 6 ) + + def protoss_unsealing_the_past_ledge_requirement(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.COLOSSUS, item_names.WRATHWALKER), self.player) + or self.protoss_can_attack_behind_chasm(state) + ) def terran_unsealing_the_past_requirement(self, state: CollectionState) -> bool: return ( @@ -2704,7 +2709,7 @@ class SC2Logic: and self.terran_competent_comp(state) and self.terran_power_rating(state) >= 6 and ( - state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS}, self.player) + state.has_all((item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS), self.player) or state.has_all( {item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY, item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE}, self.player ) @@ -3132,8 +3137,9 @@ class SC2Logic: and (self.terran_cliffjumper(state) or state.has(item_names.BANSHEE, self.player)) and self.nova_splash(state) and self.terran_defense_rating(state, True, False) >= 3 - and self.advanced_tactics - or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + and (self.advanced_tactics + or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + ) ) def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool: From 1bd44e1e35bc45af61370323d79997369e49e007 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Sun, 21 Sep 2025 12:58:15 -0400 Subject: [PATCH 084/204] Stardew Valley: Fixed Traveling merchant flaky test (#5434) * - Made the traveling cart test not be flaky due to worlds caching # Conflicts: # worlds/stardew_valley/rules.py * - Made the traveling merchant test less flaky # Conflicts: # worlds/stardew_valley/test/rules/TestTravelingMerchant.py --- worlds/stardew_valley/rules.py | 2 +- worlds/stardew_valley/test/rules/TestTravelingMerchant.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 2fb95a98..7351871a 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -206,7 +206,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_entrance_rule(multiworld, player, Entrance.enter_skull_cavern, logic.received(Wallet.skull_key)) set_entrance_rule(multiworld, player, LogicEntrance.talk_to_mines_dwarf, logic.wallet.can_speak_dwarf() & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron)) - set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days() & logic.money.can_spend(1000)) + set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days() & logic.money.can_spend(1200)) set_entrance_rule(multiworld, player, LogicEntrance.buy_from_raccoon, logic.quest.has_raccoon_shop()) set_entrance_rule(multiworld, player, LogicEntrance.fish_in_waterfall, logic.skill.has_level(Skill.fishing, 5) & logic.tool.has_fishing_rod(2)) diff --git a/worlds/stardew_valley/test/rules/TestTravelingMerchant.py b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py index 57b88747..aa7f46d0 100644 --- a/worlds/stardew_valley/test/rules/TestTravelingMerchant.py +++ b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py @@ -1,8 +1,13 @@ from ..bases import SVTestBase +from ... import SeasonRandomization, EntranceRandomization from ...locations import location_table, LocationTags class TestTravelingMerchant(SVTestBase): + options = { + SeasonRandomization: SeasonRandomization.option_randomized_not_winter, + EntranceRandomization: EntranceRandomization.option_disabled, + } def test_purchase_from_traveling_merchant_requires_money(self): traveling_merchant_location_names = [l for l in self.get_real_location_names() if LocationTags.TRAVELING_MERCHANT in location_table[l].tags] From 9e96cece569c4fa9f0485a499c1d5862f1e10b0b Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Sun, 21 Sep 2025 12:59:40 -0400 Subject: [PATCH 085/204] LADX: Fix quickswap #5399 --- worlds/ladx/LADXR/generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/ladx/LADXR/generator.py b/worlds/ladx/LADXR/generator.py index 81ca6660..4ae31d58 100644 --- a/worlds/ladx/LADXR/generator.py +++ b/worlds/ladx/LADXR/generator.py @@ -242,9 +242,9 @@ def generateRom(base_rom: bytes, args, patch_data: Dict): # patches.health.setStartHealth(rom, 1) patches.inventory.songSelectAfterOcarinaSelect(rom) - if options["quickswap"] == 'a': + if options["quickswap"] == Options.Quickswap.option_a: patches.core.quickswap(rom, 1) - elif options["quickswap"] == 'b': + elif options["quickswap"] == Options.Quickswap.option_b: patches.core.quickswap(rom, 0) patches.core.addBootsControls(rom, options["boots_controls"]) From 6c45c8d606fdf771141807aad553b0953f8f2180 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 21 Sep 2025 19:23:29 +0200 Subject: [PATCH 086/204] Core: make countdown a "admin" only command (#5463) --- MultiServer.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 45b1178d..06223a3e 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1350,19 +1350,6 @@ class CommandProcessor(metaclass=CommandMeta): class CommonCommandProcessor(CommandProcessor): ctx: Context - def _cmd_countdown(self, seconds: str = "10") -> bool: - """Start a countdown in seconds""" - try: - timer = int(seconds, 10) - except ValueError: - timer = 10 - else: - if timer > 60 * 60: - raise ValueError(f"{timer} is invalid. Maximum is 1 hour.") - - async_start(countdown(self.ctx, timer)) - return True - def _cmd_options(self): """List all current options. Warning: lists password.""" self.output("Current options:") @@ -2259,6 +2246,19 @@ class ServerCommandProcessor(CommonCommandProcessor): self.output(f"Could not find player {player_name} to collect") return False + def _cmd_countdown(self, seconds: str = "10") -> bool: + """Start a countdown in seconds""" + try: + timer = int(seconds, 10) + except ValueError: + timer = 10 + else: + if timer > 60 * 60: + raise ValueError(f"{timer} is invalid. Maximum is 1 hour.") + + async_start(countdown(self.ctx, timer)) + return True + @mark_raw def _cmd_release(self, player_name: str) -> bool: """Send out the remaining items from a player to their intended recipients.""" From 68187ba25fae8fa5ac448d2cc5eae8932e37a961 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 22 Sep 2025 00:17:10 +0200 Subject: [PATCH 087/204] WebHost: remove team argument from tracker arguments where it's irrelevant (#5272) --- WebHostLib/templates/genericTracker.html | 4 +- WebHostLib/templates/multispheretracker.html | 10 +-- .../templates/multitrackerHintTable.html | 4 +- WebHostLib/tracker.py | 74 +++++++++---------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/WebHostLib/templates/genericTracker.html b/WebHostLib/templates/genericTracker.html index b92097ce..2598aa12 100644 --- a/WebHostLib/templates/genericTracker.html +++ b/WebHostLib/templates/genericTracker.html @@ -98,7 +98,7 @@ {% if hint.finding_player == player %} {{ player_names_with_alias[(team, hint.finding_player)] }} - {% elif get_slot_info(team, hint.finding_player).type == 2 %} + {% elif get_slot_info(hint.finding_player).type == 2 %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% else %} @@ -109,7 +109,7 @@ {% if hint.receiving_player == player %} {{ player_names_with_alias[(team, hint.receiving_player)] }} - {% elif get_slot_info(team, hint.receiving_player).type == 2 %} + {% elif get_slot_info(hint.receiving_player).type == 2 %} {{ player_names_with_alias[(team, hint.receiving_player)] }} {% else %} diff --git a/WebHostLib/templates/multispheretracker.html b/WebHostLib/templates/multispheretracker.html index a8669749..56aa8704 100644 --- a/WebHostLib/templates/multispheretracker.html +++ b/WebHostLib/templates/multispheretracker.html @@ -45,15 +45,15 @@ {%- set current_sphere = loop.index %} {%- for player, sphere_location_ids in sphere.items() %} {%- set checked_locations = tracker_data.get_player_checked_locations(team, player) %} - {%- set finder_game = tracker_data.get_player_game(team, player) %} - {%- set player_location_data = tracker_data.get_player_locations(team, player) %} + {%- set finder_game = tracker_data.get_player_game(player) %} + {%- set player_location_data = tracker_data.get_player_locations(player) %} {%- for location_id in sphere_location_ids.intersection(checked_locations) %} {%- set item_id, receiver, item_flags = player_location_data[location_id] %} - {%- set receiver_game = tracker_data.get_player_game(team, receiver) %} + {%- set receiver_game = tracker_data.get_player_game(receiver) %} {{ current_sphere }} - {{ tracker_data.get_player_name(team, player) }} - {{ tracker_data.get_player_name(team, receiver) }} + {{ tracker_data.get_player_name(player) }} + {{ tracker_data.get_player_name(receiver) }} {{ tracker_data.item_id_to_name[receiver_game][item_id] }} {{ tracker_data.location_id_to_name[finder_game][location_id] }} {{ finder_game }} diff --git a/WebHostLib/templates/multitrackerHintTable.html b/WebHostLib/templates/multitrackerHintTable.html index fcc15fb3..9d9d6249 100644 --- a/WebHostLib/templates/multitrackerHintTable.html +++ b/WebHostLib/templates/multitrackerHintTable.html @@ -22,14 +22,14 @@ -%} - {% if get_slot_info(team, hint.finding_player).type == 2 %} + {% if get_slot_info(hint.finding_player).type == 2 %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% else %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% endif %} - {% if get_slot_info(team, hint.receiving_player).type == 2 %} + {% if get_slot_info(hint.receiving_player).type == 2 %} {{ player_names_with_alias[(team, hint.receiving_player)] }} {% else %} {{ player_names_with_alias[(team, hint.receiving_player)] }} diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 356eb976..759bc7b6 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -85,27 +85,27 @@ class TrackerData: """Retrieves the seed name.""" return self._multidata["seed_name"] - def get_slot_data(self, team: int, player: int) -> Dict[str, Any]: + def get_slot_data(self, 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: + def get_slot_info(self, 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: + def get_player_name(self, player: int) -> str: """Retrieves the slot name for a given player.""" - return self.get_slot_info(team, player).name + return self.get_slot_info(player).name - def get_player_game(self, team: int, player: int) -> str: + def get_player_game(self, player: int) -> str: """Retrieves the game for a given player.""" - return self.get_slot_info(team, player).game + return self.get_slot_info(player).game - def get_player_locations(self, team: int, player: int) -> Dict[int, ItemMetadata]: + def get_player_locations(self, 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]: + def get_player_starting_inventory(self, player: int) -> List[int]: """Retrieves a list of all item codes a given slot starts with.""" return self._multidata["precollected_items"][player] @@ -116,7 +116,7 @@ class TrackerData: @_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) + return set(self.get_player_locations(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.""" @@ -126,7 +126,7 @@ class TrackerData: def get_player_inventory_counts(self, team: int, player: int) -> collections.Counter: """Retrieves a dictionary of all items received by their id and their received count.""" received_items = self.get_player_received_items(team, player) - starting_items = self.get_player_starting_inventory(team, player) + starting_items = self.get_player_starting_inventory(player) inventory = collections.Counter() for item in received_items: inventory[item.item] += 1 @@ -179,7 +179,7 @@ class TrackerData: 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) + team: sum(len(self.get_player_locations(player)) for player in players) for team, players in self.get_all_players().items() } @@ -210,7 +210,7 @@ class TrackerData: return { 0: [ player for player, slot_info in self._multidata["slot_info"].items() - if self.get_slot_info(0, player).type == SlotType.player + if self.get_slot_info(player).type == SlotType.player ] } @@ -226,7 +226,7 @@ class TrackerData: 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) + (team, player): self.get_player_locations(player) for team, players in self.get_all_players().items() for player in players } @@ -234,7 +234,7 @@ class TrackerData: 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) + (team, player): self.get_player_game(player) for team, players in self.get_all_slots().items() for player in players } @@ -262,9 +262,9 @@ class TrackerData: 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)})" + long_player_names[team, player] = f"{alias} ({self.get_player_name(player)})" else: - long_player_names[team, player] = self.get_player_name(team, player) + long_player_names[team, player] = self.get_player_name(player) return long_player_names @@ -344,7 +344,7 @@ def get_timeout_and_player_tracker(room: Room, tracked_team: int, tracked_player tracker_data = TrackerData(room) # 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) + game_specific_tracker = _player_trackers.get(tracker_data.get_player_game(tracked_player), None) if game_specific_tracker and not generic: tracker = game_specific_tracker(tracker_data, tracked_team, tracked_player) else: @@ -409,10 +409,10 @@ def get_enabled_multiworld_trackers(room: Room) -> Dict[str, Callable]: def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> str: - game = tracker_data.get_player_game(team, player) + game = tracker_data.get_player_game(player) received_items_in_order = {} - starting_inventory = tracker_data.get_player_starting_inventory(team, player) + starting_inventory = tracker_data.get_player_starting_inventory(player) for index, item in enumerate(starting_inventory): received_items_in_order[item] = index for index, network_item in enumerate(tracker_data.get_player_received_items(team, player), @@ -428,7 +428,7 @@ def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> 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), + locations=tracker_data.get_player_locations(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(), @@ -500,7 +500,7 @@ if "Factorio" in network_data_package["games"]: 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_all_players().items() for player in players - if tracker_data.get_player_game(team, player) == "Factorio" + if tracker_data.get_player_game(player) == "Factorio" } return render_template( @@ -589,7 +589,7 @@ if "A Link to the Past" in network_data_package["games"]: # Highlight 'bombs' if we received any bomb upgrades in bombless start. # In race mode, we'll just assume bombless start for simplicity. - if tracker_data.get_slot_data(team, player).get("bombless_start", True): + if tracker_data.get_slot_data(player).get("bombless_start", True): inventory["Bombs"] = sum(count for item, count in inventory.items() if item.startswith("Bomb Upgrade")) else: inventory["Bombs"] = 1 @@ -605,7 +605,7 @@ if "A Link to the Past" in network_data_package["games"]: for code, count in tracker_data.get_player_inventory_counts(team, player).items() }) for team, players in tracker_data.get_all_players().items() - for player in players if tracker_data.get_slot_info(team, player).game == "A Link to the Past" + for player in players if tracker_data.get_slot_info(player).game == "A Link to the Past" } # Translate non-progression items to progression items for tracker simplicity. @@ -624,7 +624,7 @@ if "A Link to the Past" in network_data_package["games"]: for region_name in known_regions } for team, players in tracker_data.get_all_players().items() - for player in players if tracker_data.get_slot_info(team, player).game == "A Link to the Past" + for player in players if tracker_data.get_slot_info(player).game == "A Link to the Past" } # Get a totals count. @@ -698,7 +698,7 @@ if "A Link to the Past" in network_data_package["games"]: team=team, player=player, inventory=inventory, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), regions=regions, known_regions=known_regions, ) @@ -845,7 +845,7 @@ if "Ocarina of Time" in network_data_package["games"]: return full_name[len(area):] return full_name - locations = tracker_data.get_player_locations(team, player) + locations = tracker_data.get_player_locations(player) checked_locations = tracker_data.get_player_checked_locations(team, player).intersection(set(locations)) location_info = {} checks_done = {} @@ -907,7 +907,7 @@ if "Ocarina of Time" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(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, @@ -966,7 +966,7 @@ if "Timespinner" in network_data_package["games"]: 1337246, 1337247, 1337248, 1337249] } - slot_data = tracker_data.get_slot_data(team, player) + slot_data = tracker_data.get_slot_data(player) if (slot_data["DownloadableItems"]): timespinner_location_ids["Present"] += [1337156, 1337157] + list(range(1337159, 1337170)) if (slot_data["Cantoran"]): @@ -1015,7 +1015,7 @@ if "Timespinner" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1124,7 +1124,7 @@ if "Super Metroid" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1174,7 +1174,7 @@ if "ChecksFinder" in network_data_package["games"]: display_data = {} inventory = tracker_data.get_player_inventory_counts(team, player) - locations = tracker_data.get_player_locations(team, player) + locations = tracker_data.get_player_locations(player) # Multi-items multi_items = { @@ -1216,7 +1216,7 @@ if "ChecksFinder" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1244,7 +1244,7 @@ if "Starcraft 2" in network_data_package["games"]: UPGRADE_RESEARCH_SPEED_ITEM_ID = 1807 UPGRADE_RESEARCH_COST_ITEM_ID = 1808 REDUCED_MAX_SUPPLY_ITEM_ID = 1850 - slot_data = tracker_data.get_slot_data(team, player) + slot_data = tracker_data.get_slot_data(player) inventory: collections.Counter[int] = tracker_data.get_player_inventory_counts(team, player) item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"] location_id_to_name = tracker_data.location_id_to_name["Starcraft 2"] @@ -1260,10 +1260,10 @@ if "Starcraft 2" in network_data_package["games"]: display_data["shield_regen_count"] = inventory.get(SHIELD_REGENERATION_ITEM_ID, 0) display_data["upgrade_speed_count"] = inventory.get(UPGRADE_RESEARCH_SPEED_ITEM_ID, 0) display_data["research_cost_count"] = inventory.get(UPGRADE_RESEARCH_COST_ITEM_ID, 0) - + # Locations have_nco_locations = False - locations = tracker_data.get_player_locations(team, player) + locations = tracker_data.get_player_locations(player) checked_locations = tracker_data.get_player_checked_locations(team, player) missions: dict[str, list[tuple[str, bool]]] = {} for location_id in locations: @@ -1418,7 +1418,7 @@ if "Starcraft 2" in network_data_package["games"]: # the maximum bundle contribution, not the sum inventory[upgrade_id] = bundle_amount - + # Victory condition game_state = tracker_data.get_player_client_status(team, player) display_data["game_finished"] = game_state == ClientStatus.CLIENT_GOAL @@ -1436,7 +1436,7 @@ if "Starcraft 2" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), missions=missions, locations=locations, checked_locations=checked_locations, From fb9011da637985f511f15bf0f77824089144b5f3 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 22 Sep 2025 00:25:12 +0200 Subject: [PATCH 088/204] WebHost: revamp /api/*tracker/ (#5388) --- WebHostLib/api/tracker.py | 258 +++++++++++++++++------------------ WebHostLib/tracker.py | 1 - docs/webhost api.md | 250 ++++++++++++++++----------------- test/webhost/test_tracker.py | 10 ++ 4 files changed, 255 insertions(+), 264 deletions(-) diff --git a/WebHostLib/api/tracker.py b/WebHostLib/api/tracker.py index 4ea3a233..4956e644 100644 --- a/WebHostLib/api/tracker.py +++ b/WebHostLib/api/tracker.py @@ -11,6 +11,47 @@ from WebHostLib.models import Room from WebHostLib.tracker import TrackerData +class PlayerAlias(TypedDict): + team: int + player: int + alias: str | None + + +class PlayerItemsReceived(TypedDict): + team: int + player: int + items: list[NetworkItem] + + +class PlayerChecksDone(TypedDict): + team: int + player: int + locations: list[int] + + +class TeamTotalChecks(TypedDict): + team: int + checks_done: int + + +class PlayerHints(TypedDict): + team: int + player: int + hints: list[Hint] + + +class PlayerTimer(TypedDict): + team: int + player: int + time: datetime | None + + +class PlayerStatus(TypedDict): + team: int + player: int + status: ClientStatus + + @api_endpoints.route("/tracker/") @cache.memoize(timeout=60) def tracker_data(tracker: UUID) -> dict[str, Any]: @@ -29,122 +70,77 @@ def tracker_data(tracker: UUID) -> dict[str, Any]: all_players: dict[int, list[int]] = tracker_data.get_all_players() - class PlayerAlias(TypedDict): - player: int - name: str | None - - player_aliases: list[dict[str, int | list[PlayerAlias]]] = [] + player_aliases: list[PlayerAlias] = [] """Slot aliases of all players.""" for team, players in all_players.items(): - team_player_aliases: list[PlayerAlias] = [] - team_aliases = {"team": team, "players": team_player_aliases} - player_aliases.append(team_aliases) for player in players: - team_player_aliases.append({"player": player, "alias": tracker_data.get_player_alias(team, player)}) + player_aliases.append({"team": team, "player": player, "alias": tracker_data.get_player_alias(team, player)}) - class PlayerItemsReceived(TypedDict): - player: int - items: list[NetworkItem] - - player_items_received: list[dict[str, int | list[PlayerItemsReceived]]] = [] + player_items_received: list[PlayerItemsReceived] = [] """Items received by each player.""" for team, players in all_players.items(): - player_received_items: list[PlayerItemsReceived] = [] - team_items_received = {"team": team, "players": player_received_items} - player_items_received.append(team_items_received) for player in players: - player_received_items.append( - {"player": player, "items": tracker_data.get_player_received_items(team, player)}) + player_items_received.append( + {"team": team, "player": player, "items": tracker_data.get_player_received_items(team, player)}) - class PlayerChecksDone(TypedDict): - player: int - locations: list[int] - - player_checks_done: list[dict[str, int | list[PlayerChecksDone]]] = [] + player_checks_done: list[PlayerChecksDone] = [] """ID of all locations checked by each player.""" for team, players in all_players.items(): - per_player_checks: list[PlayerChecksDone] = [] - team_checks_done = {"team": team, "players": per_player_checks} - player_checks_done.append(team_checks_done) for player in players: - per_player_checks.append( - {"player": player, "locations": sorted(tracker_data.get_player_checked_locations(team, player))}) + player_checks_done.append( + {"team": team, "player": player, "locations": sorted(tracker_data.get_player_checked_locations(team, player))}) - total_checks_done: list[dict[str, int]] = [ + total_checks_done: list[TeamTotalChecks] = [ {"team": team, "checks_done": checks_done} for team, checks_done in tracker_data.get_team_locations_checked_count().items() ] """Total number of locations checked for the entire multiworld per team.""" - class PlayerHints(TypedDict): - player: int - hints: list[Hint] - - hints: list[dict[str, int | list[PlayerHints]]] = [] + hints: list[PlayerHints] = [] """Hints that all players have used or received.""" for team, players in tracker_data.get_all_slots().items(): - per_player_hints: list[PlayerHints] = [] - team_hints = {"team": team, "players": per_player_hints} - hints.append(team_hints) for player in players: player_hints = sorted(tracker_data.get_player_hints(team, player)) - per_player_hints.append({"player": player, "hints": player_hints}) - slot_info = tracker_data.get_slot_info(team, player) + hints.append({"team": team, "player": player, "hints": player_hints}) + slot_info = tracker_data.get_slot_info(player) # this assumes groups are always after players if slot_info.type != SlotType.group: continue for member in slot_info.group_members: - team_hints[member]["hints"] += player_hints + hints[member - 1]["hints"] += player_hints - class PlayerTimer(TypedDict): - player: int - time: datetime | None - - activity_timers: list[dict[str, int | list[PlayerTimer]]] = [] + activity_timers: list[PlayerTimer] = [] """Time of last activity per player. Returned as RFC 1123 format and null if no connection has been made.""" for team, players in all_players.items(): - player_timers: list[PlayerTimer] = [] - team_timers = {"team": team, "players": player_timers} - activity_timers.append(team_timers) for player in players: - player_timers.append({"player": player, "time": None}) + activity_timers.append({"team": team, "player": player, "time": None}) - client_activity_timers: tuple[tuple[int, int], float] = tracker_data._multisave.get("client_activity_timers", ()) - for (team, player), timestamp in client_activity_timers: - # use index since we can rely on order - # FIX: key is "players" (not "player_timers") - activity_timers[team]["players"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + for (team, player), timestamp in tracker_data._multisave.get("client_activity_timers", []): + for entry in activity_timers: + if entry["team"] == team and entry["player"] == player: + entry["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + break - - connection_timers: list[dict[str, int | list[PlayerTimer]]] = [] + connection_timers: list[PlayerTimer] = [] """Time of last connection per player. Returned as RFC 1123 format and null if no connection has been made.""" for team, players in all_players.items(): - player_timers: list[PlayerTimer] = [] - team_connection_timers = {"team": team, "players": player_timers} - connection_timers.append(team_connection_timers) for player in players: - player_timers.append({"player": player, "time": None}) + connection_timers.append({"team": team, "player": player, "time": None}) - client_connection_timers: tuple[tuple[int, int], float] = tracker_data._multisave.get( - "client_connection_timers", ()) - for (team, player), timestamp in client_connection_timers: - connection_timers[team]["players"][player - 1]["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + for (team, player), timestamp in tracker_data._multisave.get("client_connection_timers", []): + # find the matching entry + for entry in connection_timers: + if entry["team"] == team and entry["player"] == player: + entry["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + break - class PlayerStatus(TypedDict): - player: int - status: ClientStatus - - player_status: list[dict[str, int | list[PlayerStatus]]] = [] + player_status: list[PlayerStatus] = [] """The current client status for each player.""" for team, players in all_players.items(): - player_statuses: list[PlayerStatus] = [] - team_status = {"team": team, "players": player_statuses} - player_status.append(team_status) for player in players: - player_statuses.append({"player": player, "status": tracker_data.get_player_client_status(team, player)}) + player_status.append({"team": team, "player": player, "status": tracker_data.get_player_client_status(team, player)}) return { - **get_static_tracker_data(room), "aliases": player_aliases, "player_items_received": player_items_received, "player_checks_done": player_checks_done, @@ -153,80 +149,80 @@ def tracker_data(tracker: UUID) -> dict[str, Any]: "activity_timers": activity_timers, "connection_timers": connection_timers, "player_status": player_status, - "datapackage": tracker_data._multidata["datapackage"], } -@cache.memoize() -def get_static_tracker_data(room: Room) -> dict[str, Any]: - """ - Builds and caches the static data for this active session tracker, so that it doesn't need to be recalculated. - """ +class PlayerGroups(TypedDict): + slot: int + name: str + members: list[int] + + +class PlayerSlotData(TypedDict): + player: int + slot_data: dict[str, Any] + + +@api_endpoints.route("/static_tracker/") +@cache.memoize(timeout=300) +def static_tracker_data(tracker: UUID) -> dict[str, Any]: + """ + Outputs json data to /api/static_tracker/. + + :param tracker: UUID of current session tracker. + + :return: Static tracking data for all players in the room. Typing and docstrings describe the format of each value. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) tracker_data = TrackerData(room) all_players: dict[int, list[int]] = tracker_data.get_all_players() - class PlayerGroups(TypedDict): - slot: int - name: str - members: list[int] - - groups: list[dict[str, int | list[PlayerGroups]]] = [] + groups: list[PlayerGroups] = [] """The Slot ID of groups and the IDs of the group's members.""" for team, players in tracker_data.get_all_slots().items(): - groups_in_team: list[PlayerGroups] = [] - team_groups = {"team": team, "groups": groups_in_team} - groups.append(team_groups) for player in players: - slot_info = tracker_data.get_slot_info(team, player) + slot_info = tracker_data.get_slot_info(player) if slot_info.type != SlotType.group or not slot_info.group_members: continue - groups_in_team.append( + groups.append( { "slot": player, "name": slot_info.name, "members": list(slot_info.group_members), }) - class PlayerName(TypedDict): - player: int - name: str - - player_names: list[dict[str, str | list[PlayerName]]] = [] - """Slot names of all players.""" - for team, players in all_players.items(): - per_team_player_names: list[PlayerName] = [] - team_names = {"team": team, "players": per_team_player_names} - player_names.append(team_names) - for player in players: - per_team_player_names.append({"player": player, "name": tracker_data.get_player_name(team, player)}) - - class PlayerGame(TypedDict): - player: int - game: str - - games: list[dict[str, int | list[PlayerGame]]] = [] - """The game each player is playing.""" - for team, players in all_players.items(): - player_games: list[PlayerGame] = [] - team_games = {"team": team, "players": player_games} - games.append(team_games) - for player in players: - player_games.append({"player": player, "game": tracker_data.get_player_game(team, player)}) - - class PlayerSlotData(TypedDict): - player: int - slot_data: dict[str, Any] - - slot_data: list[dict[str, int | list[PlayerSlotData]]] = [] - """Slot data for each player.""" - for team, players in all_players.items(): - player_slot_data: list[PlayerSlotData] = [] - team_slot_data = {"team": team, "players": player_slot_data} - slot_data.append(team_slot_data) - for player in players: - player_slot_data.append({"player": player, "slot_data": tracker_data.get_slot_data(team, player)}) + break return { "groups": groups, - "slot_data": slot_data, + "datapackage": tracker_data._multidata["datapackage"], } + +# It should be exceedingly rare that slot data is needed, so it's separated out. +@api_endpoints.route("/slot_data_tracker/") +@cache.memoize(timeout=300) +def tracker_slot_data(tracker: UUID) -> list[PlayerSlotData]: + """ + Outputs json data to /api/slot_data_tracker/. + + :param tracker: UUID of current session tracker. + + :return: Slot data for all players in the room. Typing completely arbitrary per game. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + slot_data: list[PlayerSlotData] = [] + """Slot data for each player.""" + for team, players in all_players.items(): + for player in players: + slot_data.append({"player": player, "slot_data": tracker_data.get_slot_data(player)}) + break + + return slot_data diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 759bc7b6..ead679fd 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -17,7 +17,6 @@ from .models import GameDataPackage, Room # 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] = {} diff --git a/docs/webhost api.md b/docs/webhost api.md index ca4b1ce7..e34eb47f 100644 --- a/docs/webhost api.md +++ b/docs/webhost api.md @@ -18,6 +18,8 @@ Current endpoints: - [`/room_status/`](#roomstatus) - Tracker API - [`/tracker/`](#tracker) + - [`/static_tracker/`](#statictracker) + - [`/slot_data_tracker/`](#slotdatatracker) - User API - [`/get_rooms`](#getrooms) - [`/get_seeds`](#getseeds) @@ -254,8 +256,6 @@ can either be viewed while on a room tracker page, or from the [room's endpoint] Will provide a dict of tracker data with the following keys: -- item_link groups and their players (`groups`) -- Each player's slot_data (`slot_data`) - Each player's current alias (`aliases`) - Will return the name if there is none - A list of items each player has received as a NetworkItem (`player_items_received`) @@ -265,111 +265,55 @@ Will provide a dict of tracker data with the following keys: - The time of last activity of each player in RFC 1123 format (`activity_timers`) - The time of last active connection of each player in RFC 1123 format (`connection_timers`) - The current client status of each player (`player_status`) -- The datapackage hash for each player (`datapackage`) - - This hash can then be sent to the datapackage API to receive the appropriate datapackage as necessary - Example: ```json { - "groups": [ - { - "team": 0, - "groups": [ - { - "slot": 5, - "name": "testGroup", - "members": [ - 1, - 2 - ] - }, - { - "slot": 6, - "name": "myCoolLink", - "members": [ - 3, - 4 - ] - } - ] - } - ], - "slot_data": [ - { - "team": 0, - "players": [ - { - "player": 1, - "slot_data": { - "example_option": 1, - "other_option": 3 - } - }, - { - "player": 2, - "slot_data": { - "example_option": 1, - "other_option": 2 - } - } - ] - } - ], "aliases": [ { "team": 0, - "players": [ - { - "player": 1, - "alias": "Incompetence" - }, - { - "player": 2, - "alias": "Slot_Name_2" - } - ] + "player": 1, + "alias": "Incompetence" + }, + { + "team": 0, + "player": 2, + "alias": "Slot_Name_2" } ], "player_items_received": [ { "team": 0, - "players": [ - { - "player": 1, - "items": [ - [1, 1, 1, 0], - [2, 2, 2, 1] - ] - }, - { - "player": 2, - "items": [ - [1, 1, 1, 2], - [2, 2, 2, 0] - ] - } + "player": 1, + "items": [ + [1, 1, 1, 0], + [2, 2, 2, 1] + ] + }, + { + "team": 0, + "player": 2, + "items": [ + [1, 1, 1, 2], + [2, 2, 2, 0] ] } ], "player_checks_done": [ { "team": 0, - "players": [ - { - "player": 1, - "locations": [ - 1, - 2 - ] - }, - { - "player": 2, - "locations": [ - 1, - 2 - ] - } + "player": 1, + "locations": [ + 1, + 2 + ] + }, + { + "team": 0, + "player": 2, + "locations": [ + 1, + 2 ] } ], @@ -382,78 +326,120 @@ Example: "hints": [ { "team": 0, - "players": [ - { - "player": 1, - "hints": [ - [1, 2, 4, 6, 0, "", 4, 0] - ] - }, - { - "player": 2, - "hints": [] - } + "player": 1, + "hints": [ + [1, 2, 4, 6, 0, "", 4, 0] ] + }, + { + "team": 0, + "player": 2, + "hints": [] } ], "activity_timers": [ { "team": 0, - "players": [ - { - "player": 1, - "time": "Fri, 18 Apr 2025 20:35:45 GMT" - }, - { - "player": 2, - "time": "Fri, 18 Apr 2025 20:42:46 GMT" - } - ] + "player": 1, + "time": "Fri, 18 Apr 2025 20:35:45 GMT" + }, + { + "team": 0, + "player": 2, + "time": "Fri, 18 Apr 2025 20:42:46 GMT" } ], "connection_timers": [ { "team": 0, - "players": [ - { - "player": 1, - "time": "Fri, 18 Apr 2025 20:38:25 GMT" - }, - { - "player": 2, - "time": "Fri, 18 Apr 2025 21:03:00 GMT" - } - ] + "player": 1, + "time": "Fri, 18 Apr 2025 20:38:25 GMT" + }, + { + "team": 0, + "player": 2, + "time": "Fri, 18 Apr 2025 21:03:00 GMT" } ], "player_status": [ { "team": 0, - "players": [ - { - "player": 1, - "status": 0 - }, - { - "player": 2, - "status": 0 - } + "player": 1, + "status": 0 + }, + { + "team": 0, + "player": 2, + "status": 0 + } + ] +} +``` + +### `/static_tracker/` + +Will provide a dict of static tracker data with the following keys: + +- item_link groups and their players (`groups`) +- The datapackage hash for each game (`datapackage`) + - This hash can then be sent to the datapackage API to receive the appropriate datapackage as necessary + +Example: +```json +{ + "groups": [ + { + "slot": 5, + "name": "testGroup", + "members": [ + 1, + 2 + ] + }, + { + "slot": 6, + "name": "myCoolLink", + "members": [ + 3, + 4 ] } ], "datapackage": { "Archipelago": { "checksum": "ac9141e9ad0318df2fa27da5f20c50a842afeecb", - "version": 0 }, "The Messenger": { "checksum": "6991cbcda7316b65bcb072667f3ee4c4cae71c0b", - "version": 0 } } } ``` +### `/slot_data_tracker/` + +Will provide a list of each player's slot_data. + +Example: +```json +[ + { + "player": 1, + "slot_data": { + "example_option": 1, + "other_option": 3 + } + }, + { + "player": 2, + "slot_data": { + "example_option": 1, + "other_option": 2 + } + } +] +``` + ## User Endpoints User endpoints can get room and seed details from the current session tokens (cookies) @@ -554,4 +540,4 @@ Example: "seed_id": "a528e34c-3b4f-42a9-9f8f-00a4fd40bacb" } ] -``` +``` \ No newline at end of file diff --git a/test/webhost/test_tracker.py b/test/webhost/test_tracker.py index 58145d77..0796cdb2 100644 --- a/test/webhost/test_tracker.py +++ b/test/webhost/test_tracker.py @@ -93,3 +93,13 @@ class TestTracker(TestBase): headers={"If-Modified-Since": "Wed, 21 Oct 2015 07:28:00"}, # missing timezone ) self.assertEqual(response.status_code, 400) + + def test_tracker_api(self) -> None: + """Verify that tracker api gives a reply for the room.""" + with self.app.test_request_context(): + with self.client.open(url_for("api.tracker_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) + with self.client.open(url_for("api.static_tracker_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) + with self.client.open(url_for("api.tracker_slot_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) From e256abfdfb7935827c1a77132481ea1273f6b822 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Sun, 21 Sep 2025 18:07:33 -0700 Subject: [PATCH 089/204] Factorio: Allow to reconnect a timed out RCON client connection. (#5421) --- worlds/factorio/Client.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/worlds/factorio/Client.py b/worlds/factorio/Client.py index d7992c32..51eb487f 100644 --- a/worlds/factorio/Client.py +++ b/worlds/factorio/Client.py @@ -59,6 +59,19 @@ class FactorioCommandProcessor(ClientCommandProcessor): def _cmd_toggle_chat(self): """Toggle sending of chat messages from players on the Factorio server to Archipelago.""" self.ctx.toggle_bridge_chat_out() + + def _cmd_rcon_reconnect(self) -> bool: + """Reconnect the RCON client if its disconnected.""" + try: + result = self.ctx.rcon_client.send_command("/help") + if result: + self.output("RCON Client already connected.") + return True + except factorio_rcon.RCONNetworkError: + self.ctx.rcon_client = factorio_rcon.RCONClient("localhost", self.ctx.rcon_port, self.ctx.rcon_password, timeout=5) + self.output("RCON Client successfully reconnected.") + return True + return False class FactorioContext(CommonContext): @@ -242,7 +255,13 @@ async def game_watcher(ctx: FactorioContext): if ctx.rcon_client and time.perf_counter() > next_bridge: next_bridge = time.perf_counter() + 1 ctx.awaiting_bridge = False - data = json.loads(ctx.rcon_client.send_command("/ap-sync")) + try: + data = json.loads(ctx.rcon_client.send_command("/ap-sync")) + except factorio_rcon.RCONNotConnected: + continue + except factorio_rcon.RCONNetworkError: + bridge_logger.warning("RCON Client has unexpectedly lost connection. Please issue /rcon_reconnect.") + continue if not ctx.auth: pass # auth failed, wait for new attempt elif data["slot_name"] != ctx.auth: @@ -294,9 +313,13 @@ async def game_watcher(ctx: FactorioContext): "cmd": "Set", "key": ctx.energylink_key, "operations": [{"operation": "add", "value": value}] }])) - ctx.rcon_client.send_command( - f"/ap-energylink -{value}") - logger.debug(f"EnergyLink: Sent {format_SI_prefix(value)}J") + try: + ctx.rcon_client.send_command( + f"/ap-energylink -{value}") + except factorio_rcon.RCONNetworkError: + bridge_logger.warning("RCON Client has unexpectedly lost connection. Please issue /rcon_reconnect.") + else: + logger.debug(f"EnergyLink: Sent {format_SI_prefix(value)}J") await asyncio.sleep(0.1) From a99da85a22ac925cefdf7ef7e5de3ece6d28e671 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 24 Sep 2025 02:39:19 +0200 Subject: [PATCH 090/204] Core: APWorld manifest (#4516) Adds support for a manifest file (archipelago.json) inside an .apworld file. It tells AP the game, minimum core version (optional field), maximum core version (optional field), its own version (used to determine which file to prefer to load only currently) The file itself is marked as required starting with core 0.7.0, prior, just a warning is printed, with error trace. Co-authored-by: Doug Hoskisson Co-authored-by: qwint Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- Utils.py | 1 + docs/apworld specification.md | 16 ++++++++- setup.py | 19 ++++++++-- worlds/Files.py | 32 ++++++++++++++++- worlds/__init__.py | 68 +++++++++++++++++++++++++++++++++-- 5 files changed, 129 insertions(+), 7 deletions(-) diff --git a/Utils.py b/Utils.py index e73edd71..d8dab4fc 100644 --- a/Utils.py +++ b/Utils.py @@ -49,6 +49,7 @@ class Version(typing.NamedTuple): __version__ = "0.6.4" version_tuple = tuplize_version(__version__) +version = Version(*version_tuple) is_linux = sys.platform.startswith("linux") is_macos = sys.platform == "darwin" diff --git a/docs/apworld specification.md b/docs/apworld specification.md index ed2e8b1c..39282e15 100644 --- a/docs/apworld specification.md +++ b/docs/apworld specification.md @@ -19,7 +19,21 @@ the world's folder in `worlds/`. I.e. `worlds/ror2.apworld` containing `ror2/__i ## Metadata -No metadata is specified yet. +Metadata about the apworld is defined in an `archipelago.json` file inside the zip archive. +The current format version has at minimum: +```json +{ + "version": 6, + "compatible_version": 5, + "game": "Game Name" +} +``` + +with the following optional version fields using the format `"1.0.0"` to represent major.minor.build: +* `minimum_ap_version` and `maximum_ap_version` - which if present will each be compared against the current + Archipelago version respectively to filter those files from being loaded +* `world_version` - an arbitrary version for that world in order to only load the newest valid world. + An apworld without a world_version is always treated as older than one with a version ## Extra Data diff --git a/setup.py b/setup.py index 3f25ade7..81eee017 100644 --- a/setup.py +++ b/setup.py @@ -371,6 +371,8 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): os.makedirs(self.buildfolder / "Players" / "Templates", exist_ok=True) from Options import generate_yaml_templates from worlds.AutoWorld import AutoWorldRegister + from worlds.Files import APWorldContainer + from Utils import version assert not non_apworlds - set(AutoWorldRegister.world_types), \ f"Unknown world {non_apworlds - set(AutoWorldRegister.world_types)} designated for .apworld" folders_to_remove: list[str] = [] @@ -379,13 +381,26 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): if worldname not in non_apworlds: file_name = os.path.split(os.path.dirname(worldtype.__file__))[1] world_directory = self.libfolder / "worlds" / file_name + if os.path.isfile(world_directory / "archipelago.json"): + manifest = json.load(open(world_directory / "archipelago.json")) + else: + manifest = {} # this method creates an apworld that cannot be moved to a different OS or minor python version, # which should be ok - with zipfile.ZipFile(self.libfolder / "worlds" / (file_name + ".apworld"), "x", zipfile.ZIP_DEFLATED, + zip_path = self.libfolder / "worlds" / (file_name + ".apworld") + apworld = APWorldContainer(str(zip_path)) + apworld.minimum_ap_version = version + apworld.maximum_ap_version = version + apworld.game = worldtype.game + manifest.update(apworld.get_manifest()) + apworld.manifest_path = f"{file_name}/archipelago.json" + with zipfile.ZipFile(zip_path, "x", zipfile.ZIP_DEFLATED, compresslevel=9) as zf: for path in world_directory.rglob("*.*"): relative_path = os.path.join(*path.parts[path.parts.index("worlds")+1:]) - zf.write(path, relative_path) + if not relative_path.endswith("archipelago.json"): + zf.write(path, relative_path) + zf.writestr(apworld.manifest_path, json.dumps(manifest)) folders_to_remove.append(file_name) shutil.rmtree(world_directory) shutil.copyfile("meta.yaml", self.buildfolder / "Players" / "Templates" / "meta.yaml") diff --git a/worlds/Files.py b/worlds/Files.py index ece60c69..709671ce 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -8,7 +8,8 @@ import os import threading from io import BytesIO -from typing import ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO, overload, Sequence +from typing import (ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO, overload, Sequence, + TYPE_CHECKING) import bsdiff4 @@ -16,6 +17,9 @@ semaphore = threading.Semaphore(os.cpu_count() or 4) del threading +if TYPE_CHECKING: + from Utils import Version + class AutoPatchRegister(abc.ABCMeta): patch_types: ClassVar[Dict[str, AutoPatchRegister]] = {} @@ -163,6 +167,32 @@ class APContainer: } +class APWorldContainer(APContainer): + """A zipfile containing a world implementation.""" + game: str | None = None + world_version: "Version | None" = None + minimum_ap_version: "Version | None" = None + maximum_ap_version: "Version | None" = None + + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + from Utils import tuplize_version, Version + manifest = super().read_contents(opened_zipfile) + self.game = manifest["game"] + for version_key in ("world_version", "minimum_ap_version", "maximum_ap_version"): + if version_key in manifest: + setattr(self, version_key, Version(*tuplize_version(manifest[version_key]))) + return manifest + + def get_manifest(self) -> Dict[str, Any]: + manifest = super().get_manifest() + manifest["game"] = self.game + for version_key in ("world_version", "minimum_ap_version", "maximum_ap_version"): + version = getattr(self, version_key) + if version: + manifest[version_key] = version.as_simple_string() + return manifest + + class APPlayerContainer(APContainer): """A zipfile containing at least archipelago.json meant for a player""" game: ClassVar[Optional[str]] = None diff --git a/worlds/__init__.py b/worlds/__init__.py index 89f7bcd0..c363d7f2 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -10,7 +10,7 @@ import dataclasses from typing import List from NetUtils import DataPackage -from Utils import local_path, user_path +from Utils import local_path, user_path, Version, version_tuple local_folder = os.path.dirname(__file__) user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds") @@ -38,6 +38,7 @@ class WorldSource: is_zip: bool = False relative: bool = True # relative to regular world import folder time_taken: float = -1.0 + version: Version = Version(0, 0, 0) def __repr__(self) -> str: return f"{self.__class__.__name__}({self.path}, is_zip={self.is_zip}, relative={self.relative})" @@ -102,12 +103,73 @@ for folder in (folder for folder in (user_folder, local_folder) if folder): # import all submodules to trigger AutoWorldRegister world_sources.sort() +apworlds: list[WorldSource] = [] for world_source in world_sources: - world_source.load() + # load all loose files first: + if world_source.is_zip: + apworlds.append(world_source) + else: + world_source.load() -# Build the data package for each game. from .AutoWorld import AutoWorldRegister +if apworlds: + # encapsulation for namespace / gc purposes + def load_apworlds() -> None: + global apworlds + from .Files import APWorldContainer, InvalidDataError + core_compatible: list[tuple[WorldSource, APWorldContainer]] = [] + + def fail_world(game_name: str, reason: str, add_as_failed_to_load: bool = True) -> None: + if add_as_failed_to_load: + failed_world_loads.append(game_name) + logging.warning(reason) + + for apworld_source in apworlds: + apworld: APWorldContainer = APWorldContainer(apworld_source.resolved_path) + # populate metadata + try: + apworld.read() + except InvalidDataError as e: + if version_tuple < (0, 7, 0): + logging.error( + f"Invalid or missing manifest file for {apworld_source.resolved_path}. " + "This apworld will stop working with Archipelago 0.7.0." + ) + logging.error(e) + else: + raise e + + if apworld.minimum_ap_version and apworld.minimum_ap_version > version_tuple: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its minimum core version {apworld.minimum_ap_version} " + f"is higher than current core version {version_tuple}.") + elif apworld.maximum_ap_version and apworld.maximum_ap_version < version_tuple: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its maximum core version {apworld.maximum_ap_version} " + f"is lower than current core version {version_tuple}.") + else: + core_compatible.append((apworld_source, apworld)) + # load highest version first + core_compatible.sort( + key=lambda element: element[1].world_version if element[1].world_version else Version(0, 0, 0), + reverse=True) + for apworld_source, apworld in core_compatible: + if apworld.game and apworld.game in AutoWorldRegister.world_types: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its game {apworld.game} is already loaded.", + add_as_failed_to_load=False) + else: + apworld_source.load() + load_apworlds() + del load_apworlds + +del apworlds + +# Build the data package for each game. network_data_package: DataPackage = { "games": {world_name: world.get_data_package_data() for world_name, world in AutoWorldRegister.world_types.items()}, } From dc270303a941eab3e5b60ed1ec025b4545a6f826 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 24 Sep 2025 17:33:44 +0200 Subject: [PATCH 091/204] Core: improve formatting on /help command (#5381) --- MultiServer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MultiServer.py b/MultiServer.py index 06223a3e..23aab7b5 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -1321,7 +1321,8 @@ class CommandProcessor(metaclass=CommandMeta): argname += "=" + parameter.default argtext += argname argtext += " " - s += f"{self.marker}{command} {argtext}\n {method.__doc__}\n" + doctext = '\n '.join(inspect.getdoc(method).split('\n')) + s += f"{self.marker}{command} {argtext}\n {doctext}\n" return s def _cmd_help(self): From 4525bae8796f5374c31c9c7265c92494a4e57abe Mon Sep 17 00:00:00 2001 From: Etsuna <47378314+Etsuna@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:08:14 +0200 Subject: [PATCH 092/204] Webhost: add total player location counts to tracker API (#5441) --- WebHostLib/api/tracker.py | 13 +++++++++++++ docs/webhost api.md | 16 +++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/WebHostLib/api/tracker.py b/WebHostLib/api/tracker.py index 4956e644..36692af4 100644 --- a/WebHostLib/api/tracker.py +++ b/WebHostLib/api/tracker.py @@ -52,6 +52,12 @@ class PlayerStatus(TypedDict): status: ClientStatus +class PlayerLocationsTotal(TypedDict): + team: int + player: int + total_locations: int + + @api_endpoints.route("/tracker/") @cache.memoize(timeout=60) def tracker_data(tracker: UUID) -> dict[str, Any]: @@ -195,9 +201,16 @@ def static_tracker_data(tracker: UUID) -> dict[str, Any]: }) break + player_locations_total: list[PlayerLocationsTotal] = [] + for team, players in all_players.items(): + for player in players: + player_locations_total.append( + {"team": team, "player": player, "total_locations": len(tracker_data.get_player_locations(player))}) + return { "groups": groups, "datapackage": tracker_data._multidata["datapackage"], + "player_locations_total": player_locations_total, } # It should be exceedingly rare that slot data is needed, so it's separated out. diff --git a/docs/webhost api.md b/docs/webhost api.md index e34eb47f..04821134 100644 --- a/docs/webhost api.md +++ b/docs/webhost api.md @@ -383,6 +383,8 @@ Will provide a dict of static tracker data with the following keys: - item_link groups and their players (`groups`) - The datapackage hash for each game (`datapackage`) - This hash can then be sent to the datapackage API to receive the appropriate datapackage as necessary +- The number of checks found vs. total checks available per player (`player_locations_total`) + - Same logic as the multitracker template: found = len(player_checks_done.locations) / total = player_locations_total.total_locations (all available checks). Example: ```json @@ -412,7 +414,19 @@ Example: "The Messenger": { "checksum": "6991cbcda7316b65bcb072667f3ee4c4cae71c0b", } - } + }, + "player_locations_total": [ + { + "player": 1, + "team" : 0, + "total_locations": 10 + }, + { + "player": 2, + "team" : 0, + "total_locations": 20 + } + ], } ``` From 4ae87edf371869d43e18b04999d8915852456d5e Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 24 Sep 2025 23:25:46 +0200 Subject: [PATCH 093/204] Core: apworld manifest launcher component (#5340) adds a launcher component that builds all apworlds on top of #4516 --------- Co-authored-by: Doug Hoskisson Co-authored-by: qwint Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/LauncherComponents.py | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 7bd47d0b..b2187298 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -5,7 +5,7 @@ import weakref from enum import Enum, auto from typing import Optional, Callable, List, Iterable, Tuple -from Utils import local_path, open_filename +from Utils import local_path, open_filename, is_frozen class Type(Enum): @@ -243,3 +243,39 @@ icon_paths = { 'icon': local_path('data', 'icon.png'), 'discord': local_path('data', 'discord-mark-blue.png'), } + +if not is_frozen(): + def _build_apworlds(): + import json + import os + import zipfile + + from worlds import AutoWorldRegister + from worlds.Files import APWorldContainer + + apworlds_folder = os.path.join("build", "apworlds") + os.makedirs(apworlds_folder, exist_ok=True) + for worldname, worldtype in AutoWorldRegister.world_types.items(): + file_name = os.path.split(os.path.dirname(worldtype.__file__))[1] + world_directory = os.path.join("worlds", file_name) + if os.path.isfile(os.path.join(world_directory, "archipelago.json")): + manifest = json.load(open(os.path.join(world_directory, "archipelago.json"))) + else: + manifest = {} + + zip_path = os.path.join(apworlds_folder, file_name + ".apworld") + apworld = APWorldContainer(str(zip_path)) + apworld.game = worldtype.game + manifest.update(apworld.get_manifest()) + apworld.manifest_path = f"{file_name}/archipelago.json" + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED, + compresslevel=9) as zf: + for path in pathlib.Path(world_directory).rglob("*.*"): + relative_path = os.path.join(*path.parts[path.parts.index("worlds") + 1:]) + if "__MACOSX" in relative_path or ".DS_STORE" in relative_path or "__pycache__" in relative_path: + continue + if not relative_path.endswith("archipelago.json"): + zf.write(path, relative_path) + zf.writestr(apworld.manifest_path, json.dumps(manifest)) + + components.append(Component('Build apworlds', func=_build_apworlds, cli=True,)) From 24394561bd37c82b24d47d3f92924d089e32358d Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 25 Sep 2025 05:10:23 +0200 Subject: [PATCH 094/204] Core: Bump Container Version to 7, and make APWorldContainer use 7 as the compatible_version #5479 --- worlds/Files.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/Files.py b/worlds/Files.py index 709671ce..cc81a022 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -69,7 +69,7 @@ class AutoPatchExtensionRegister(abc.ABCMeta): return handler -container_version: int = 6 +container_version: int = 7 def is_ap_player_container(game: str, data: bytes, player: int): @@ -186,6 +186,7 @@ class APWorldContainer(APContainer): def get_manifest(self) -> Dict[str, Any]: manifest = super().get_manifest() manifest["game"] = self.game + manifest["compatible_version"] = 7 for version_key in ("world_version", "minimum_ap_version", "maximum_ap_version"): version = getattr(self, version_key) if version: From 12998bf6f4049ccb5f720bac4f24de3030e7dd0a Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sat, 27 Sep 2025 07:54:03 -0700 Subject: [PATCH 095/204] Pokemon Emerald: Fix missing fanfare address (#5490) --- worlds/pokemon_emerald/data/extracted_data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/pokemon_emerald/data/extracted_data.json b/worlds/pokemon_emerald/data/extracted_data.json index d066e31b..def6338b 100644 --- a/worlds/pokemon_emerald/data/extracted_data.json +++ b/worlds/pokemon_emerald/data/extracted_data.json @@ -1 +1 @@ -{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"FindObjectEventPaletteIndexByTag":586344,"LoadObjectEventPalette":586116,"PatchObjectPalette":586244,"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gMonBackPicTable":3174912,"gMonFootprintTable":5726932,"gMonFrontPicTable":3205844,"gMonIconPaletteIndices":5784268,"gMonIconTable":5782508,"gMonPaletteTable":3178432,"gMonShinyPaletteTable":3181952,"gObjectEventBaseOam_16x16":5311020,"gObjectEventBaseOam_16x32":5311044,"gObjectEventBaseOam_32x32":5311052,"gObjectEventGraphicsInfoPointers":5294928,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainerBackAnimsPtrTable":3188308,"gTrainerBackPicPaletteTable":3188436,"gTrainerBackPicTable":3188372,"gTrainerFrontPicPaletteTable":3187332,"gTrainerFrontPicTable":3186588,"gTrainers":3230072,"gTutorMoves":6428060,"sBackAnims_Brendan":3188244,"sBackAnims_Red":3188260,"sEggHatchTiles":3344020,"sEggPalette":3343988,"sEmpty6":14929745,"sNewGamePCItems":6210444,"sOamTables_16x16":5311100,"sOamTables_16x32":5311184,"sOamTables_32x32":5311268,"sObjectEventSpritePalettes":5320952,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTrainerBackSpriteTemplates":3337568,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} +{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"FindObjectEventPaletteIndexByTag":586344,"LoadObjectEventPalette":586116,"PatchObjectPalette":586244,"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gMonBackPicTable":3174912,"gMonFootprintTable":5726932,"gMonFrontPicTable":3205844,"gMonIconPaletteIndices":5784268,"gMonIconTable":5782508,"gMonPaletteTable":3178432,"gMonShinyPaletteTable":3181952,"gObjectEventBaseOam_16x16":5311020,"gObjectEventBaseOam_16x32":5311044,"gObjectEventBaseOam_32x32":5311052,"gObjectEventGraphicsInfoPointers":5294928,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainerBackAnimsPtrTable":3188308,"gTrainerBackPicPaletteTable":3188436,"gTrainerBackPicTable":3188372,"gTrainerFrontPicPaletteTable":3187332,"gTrainerFrontPicTable":3186588,"gTrainers":3230072,"gTutorMoves":6428060,"sBackAnims_Brendan":3188244,"sBackAnims_Red":3188260,"sEggHatchTiles":3344020,"sEggPalette":3343988,"sEmpty6":14929745,"sFanfares":5422580,"sNewGamePCItems":6210444,"sOamTables_16x16":5311100,"sOamTables_16x32":5311184,"sOamTables_32x32":5311268,"sObjectEventSpritePalettes":5320952,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTrainerBackSpriteTemplates":3337568,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} From d1624679eedb62789e7e7bf86d8803fd53f83f8f Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sun, 28 Sep 2025 12:39:18 -0700 Subject: [PATCH 096/204] Pokemon Emerald: Set all abilities to Cacophony if all are blacklisted (#5488) --- worlds/pokemon_emerald/pokemon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/pokemon_emerald/pokemon.py b/worlds/pokemon_emerald/pokemon.py index 6f267650..b39f8c2a 100644 --- a/worlds/pokemon_emerald/pokemon.py +++ b/worlds/pokemon_emerald/pokemon.py @@ -397,6 +397,10 @@ def randomize_abilities(world: "PokemonEmeraldWorld") -> None: ability_blacklist = {ability_label_to_value[label] for label in ability_blacklist_labels} ability_whitelist = [a.ability_id for a in data.abilities if a.ability_id not in ability_blacklist] + # If every ability is blacklisted, set all abilities to Cacophony, effectively disabling abilities + if len(ability_whitelist) == 0: + ability_whitelist = [data.constants["ABILITY_CACOPHONY"]] + if world.options.abilities == RandomizeAbilities.option_follow_evolutions: already_modified: Set[int] = set() From 1d861d1d063b19a3e5ce64c8176a4420f69667a3 Mon Sep 17 00:00:00 2001 From: palex00 <32203971+palex00@users.noreply.github.com> Date: Sun, 28 Sep 2025 23:18:06 +0200 Subject: [PATCH 097/204] =?UTF-8?q?Pok=C3=A9mon=20RB:=20Update=20Slot=20Da?= =?UTF-8?q?ta=20(#5494)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worlds/pokemon_rb/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index a455e38f..3f5a24cc 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -713,7 +713,8 @@ class PokemonRedBlueWorld(World): "require_pokedex": self.options.require_pokedex.value, "area_1_to_1_mapping": self.options.area_1_to_1_mapping.value, "blind_trainers": self.options.blind_trainers.value, - "v5_update": True, + "game_version": self.options.game_version.value, + "exp_all": self.options.exp_all.value, } if self.options.type_chart_seed == "random" or self.options.type_chart_seed.value.isdigit(): From 6099869c59224d8c3660cc4020e61658e8177957 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 30 Sep 2025 01:52:12 +0200 Subject: [PATCH 098/204] Core: new cx_freeze (#5316) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 81eee017..98b9dd60 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ SNI_VERSION = "v0.0.100" # change back to "latest" once tray icon issues are fi # This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it -requirement = 'cx-Freeze==8.0.0' +requirement = 'cx-Freeze==8.4.0' try: import pkg_resources try: From 47b2242c3c05dea6534ea80bddc31d66a59d7417 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 29 Sep 2025 21:53:10 -0400 Subject: [PATCH 099/204] TUNIC: Add archipelago.json (#5482) * add archipelago.json * newline * Add authors * Make it a list --- worlds/tunic/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/tunic/archipelago.json diff --git a/worlds/tunic/archipelago.json b/worlds/tunic/archipelago.json new file mode 100644 index 00000000..4c4d8dd9 --- /dev/null +++ b/worlds/tunic/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "TUNIC", + "authors": ["SilentSR", "ScipioWright"], + "minimum_ap_version": "0.6.4", + "world_version": "4.1.0" +} From 25baa578500c91f4c50b0beb280d057760886070 Mon Sep 17 00:00:00 2001 From: Felix R <50271878+FelicitusNeko@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:53:31 -0300 Subject: [PATCH 100/204] meritous: Create manifest (#5497) --- worlds/meritous/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/meritous/archipelago.json diff --git a/worlds/meritous/archipelago.json b/worlds/meritous/archipelago.json new file mode 100644 index 00000000..7b2c5457 --- /dev/null +++ b/worlds/meritous/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Meritous", + "authors": ["KewlioMZX"], + "world_version": "1.0.0", + "minimum_ap_version": "0.6.4" +} From f9083d930774848c8dc44fe92f663249a2b161fe Mon Sep 17 00:00:00 2001 From: Felix R <50271878+FelicitusNeko@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:53:47 -0300 Subject: [PATCH 101/204] bumpstik: Create manifest (#5496) --- worlds/bumpstik/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/bumpstik/archipelago.json diff --git a/worlds/bumpstik/archipelago.json b/worlds/bumpstik/archipelago.json new file mode 100644 index 00000000..64dc1b9c --- /dev/null +++ b/worlds/bumpstik/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Bumper Stickers", + "authors": ["KewlioMZX"], + "world_version": "1.0.0", + "minimum_ap_version": "0.6.4" +} From 2f23dc72f9f7e585822c1934164c73daa5670390 Mon Sep 17 00:00:00 2001 From: Justus Lind Date: Tue, 30 Sep 2025 11:54:14 +1000 Subject: [PATCH 102/204] Muse Dash: Update song list to Legendary Voyage, Mystic Treasure. Add manifest. (#5498) * Legendary Voyage, Mystic Treasure Update * Add manifest * Correct Manifest version. * Fix file encoding --- worlds/musedash/MuseDashData.py | 6 ++++++ worlds/musedash/archipelago.json | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 worlds/musedash/archipelago.json diff --git a/worlds/musedash/MuseDashData.py b/worlds/musedash/MuseDashData.py index 6943b281..f3a6becb 100644 --- a/worlds/musedash/MuseDashData.py +++ b/worlds/musedash/MuseDashData.py @@ -665,4 +665,10 @@ SONG_DATA: Dict[str, SongData] = { "Midnight Blue": SongData(2900789, "88-1", "MUSE RADIO FM106", True, 2, 5, 7), "overwork feat.Woonoo": SongData(2900790, "88-2", "MUSE RADIO FM106", True, 2, 6, 8), "SUPER CITYLIGHTS": SongData(2900791, "88-3", "MUSE RADIO FM106", True, 5, 7, 10), + "Flametide": SongData(2900792, "89-0", "Legendary Voyage, Mystic Treasure", True, 5, 7, 9), + "Embrace feat. Kiyon": SongData(2900793, "89-1", "Legendary Voyage, Mystic Treasure", True, 2, 5, 8), + "Magazines feat. Nia Suzune": SongData(2900794, "89-2", "Legendary Voyage, Mystic Treasure", True, 3, 6, 8), + "Temptation": SongData(2900795, "89-3", "Legendary Voyage, Mystic Treasure", False, 5, 8, 10), + "PwP": SongData(2900796, "89-4", "Legendary Voyage, Mystic Treasure", True, 3, 6, 9), + "I Can Show You": SongData(2900797, "89-5", "Legendary Voyage, Mystic Treasure", False, 5, 7, 9), } diff --git a/worlds/musedash/archipelago.json b/worlds/musedash/archipelago.json new file mode 100644 index 00000000..d10e8369 --- /dev/null +++ b/worlds/musedash/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Muse Dash", + "authors": ["DeamonHunter"], + "world_version": "1.5.25", + "minimum_ap_version": "0.6.3" +} \ No newline at end of file From ab2097960d183fcebc9028bf24a515cab412ca21 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Mon, 29 Sep 2025 21:54:32 -0400 Subject: [PATCH 103/204] Jak and Daxter: Add manifest #5492 --- worlds/jakanddaxter/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/jakanddaxter/archipelago.json diff --git a/worlds/jakanddaxter/archipelago.json b/worlds/jakanddaxter/archipelago.json new file mode 100644 index 00000000..8b0adcd1 --- /dev/null +++ b/worlds/jakanddaxter/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Jak and Daxter: The Precursor Legacy", + "world_version": "1.0.0", + "minimum_ap_version": "0.6.2", + "authors": ["markustulliuscicero"] +} From 053f876e8478753a0bfe0dd4c83127ecdfdb330a Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Mon, 29 Sep 2025 19:10:45 -0700 Subject: [PATCH 104/204] Pokemon Emerald: Add manifest (#5487) --- worlds/pokemon_emerald/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/pokemon_emerald/archipelago.json diff --git a/worlds/pokemon_emerald/archipelago.json b/worlds/pokemon_emerald/archipelago.json new file mode 100644 index 00000000..ed11b8d8 --- /dev/null +++ b/worlds/pokemon_emerald/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Pokemon Emerald", + "world_version": "2.4.1", + "minimum_ap_version": "0.6.1", + "authors": ["Zunawe"] +} From c30a5b206e8c3ad34380ad44eee03bdd94be9c90 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 29 Sep 2025 22:12:19 -0400 Subject: [PATCH 105/204] Noita: Add archipelago.json (#5483) * Add archipelago.json * Add authors * make it a list --- worlds/noita/archipelago.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worlds/noita/archipelago.json diff --git a/worlds/noita/archipelago.json b/worlds/noita/archipelago.json new file mode 100644 index 00000000..3bda5245 --- /dev/null +++ b/worlds/noita/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Noita", + "authors": ["Heinermann", "ScipioWright"], + "minimum_ap_version": "0.6.4", + "world_version": "1.4.0" +} From 580370c3a04adfb017d75d364f0beb460584197b Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:43:59 -0400 Subject: [PATCH 106/204] Jak and Daxter: close Power Cell loophole in trades test #5493 --- worlds/jakanddaxter/test/test_trades.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/jakanddaxter/test/test_trades.py b/worlds/jakanddaxter/test/test_trades.py index 0277a923..92552f9d 100644 --- a/worlds/jakanddaxter/test/test_trades.py +++ b/worlds/jakanddaxter/test/test_trades.py @@ -6,7 +6,8 @@ class TradesCostNothingTest(JakAndDaxterTestBase): "enable_orbsanity": 2, "global_orbsanity_bundle_size": 10, "citizen_orb_trade_amount": 0, - "oracle_orb_trade_amount": 0 + "oracle_orb_trade_amount": 0, + "start_inventory": {"Power Cell": 100}, } def test_orb_items_are_filler(self): @@ -24,7 +25,8 @@ class TradesCostEverythingTest(JakAndDaxterTestBase): "enable_orbsanity": 2, "global_orbsanity_bundle_size": 10, "citizen_orb_trade_amount": 120, - "oracle_orb_trade_amount": 150 + "oracle_orb_trade_amount": 150, + "start_inventory": {"Power Cell": 100}, } def test_orb_items_are_progression(self): From 5345937966764c86e64fcff0bd5b5fd732ef9505 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 30 Sep 2025 04:45:59 +0200 Subject: [PATCH 107/204] The Witness: Remove two things from slot_data that nothing uses anymore #5502 --- worlds/witness/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index bce9bb51..6aaf2fdc 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -104,7 +104,6 @@ class WitnessWorld(World): "item_id_to_door_hexes": static_witness_items.get_item_to_door_mappings(), "door_items_in_the_pool": self.player_items.get_door_item_ids_in_pool(), "doors_that_shouldnt_be_locked": [int(h, 16) for h in self.player_logic.FORBIDDEN_DOORS], - "symbols_not_in_the_game": self.player_items.get_symbol_ids_not_in_pool(), "disabled_entities": [int(h, 16) for h in self.player_logic.COMPLETELY_DISABLED_ENTITIES], "hunt_entities": [int(h, 16) for h in self.player_logic.HUNT_ENTITIES], "log_ids_to_hints": self.log_ids_to_hints, @@ -112,7 +111,6 @@ class WitnessWorld(World): "progressive_item_lists": self.player_items.get_progressive_item_ids_in_pool(), "obelisk_side_id_to_EPs": static_witness_logic.OBELISK_SIDE_ID_TO_EP_HEXES, "precompleted_puzzles": [int(h, 16) for h in self.player_logic.EXCLUDED_ENTITIES], - "entity_to_name": static_witness_logic.ENTITY_ID_TO_NAME, "panel_hunt_required_absolute": self.panel_hunt_required_count } From d9955d624b03bbc2db958995eee9f69cba3847a3 Mon Sep 17 00:00:00 2001 From: gaithern <36639398+gaithern@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:10:29 -0500 Subject: [PATCH 108/204] KH1: Fix Slot 2 Level Checks description #5451 --- worlds/kh1/Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 1bdc478a..f64e927f 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -547,9 +547,9 @@ class RemoteItems(Choice): class Slot2LevelChecks(Range): """ - Determines how many levels have an additional item. Usually, this item is an ability. + Determines how many levels have an additional item. - If Remote Items is OFF, these checks will only contain abilities. + If Remote Items is OFF, these checks will only contain abilities or items for other players. """ display_name = "Slot 2 Level Checks" default = 0 From a30b43821f939ec860a1cb165796a3fa7447b429 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 30 Sep 2025 11:30:26 -0500 Subject: [PATCH 109/204] KDL3, MM2: set goal condition before generate basic (#5382) * move goal kdl3 * mm2 * missed the singular important line --- worlds/kdl3/__init__.py | 4 ---- worlds/kdl3/rules.py | 9 ++++++++- worlds/mm2/__init__.py | 8 +++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 1b5acbe9..7642ec23 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -303,9 +303,6 @@ class KDL3World(World): def generate_basic(self) -> None: self.stage_shuffle_enabled = self.options.stage_shuffle > 0 - goal = self.options.goal.value - goal_location = self.multiworld.get_location(location_name.goals[goal], self.player) - goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): self.multiworld.get_location(f"Level {level} Boss - Defeated", self.player) \ .place_locked_item( @@ -313,7 +310,6 @@ class KDL3World(World): self.multiworld.get_location(f"Level {level} Boss - Purified", self.player) \ .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) # this can technically be done at any point before generate_output if self.options.allow_bb: if self.options.allow_bb == self.options.allow_bb.option_enforced: diff --git a/worlds/kdl3/rules.py b/worlds/kdl3/rules.py index 82874085..0be47841 100644 --- a/worlds/kdl3/rules.py +++ b/worlds/kdl3/rules.py @@ -1,6 +1,8 @@ +from BaseClasses import ItemClassification from worlds.generic.Rules import set_rule, add_rule -from .names import location_name, enemy_abilities, animal_friend_spawns +from .items import KDL3Item from .locations import location_table +from .names import location_name, enemy_abilities, animal_friend_spawns from .options import GoalSpeed import typing @@ -111,6 +113,11 @@ def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: t def set_rules(world: "KDL3World") -> None: + goal = world.options.goal.value + goal_location = world.multiworld.get_location(location_name.goals[goal], world.player) + goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, world.player)) + world.multiworld.completion_condition[world.player] = lambda state: state.has("Love-Love Rod", world.player) + # Level 1 set_rule(world.multiworld.get_location(location_name.grass_land_muchi, world.player), lambda state: can_reach_chuchu(state, world.player)) diff --git a/worlds/mm2/__init__.py b/worlds/mm2/__init__.py index 4a43ee8d..529810d4 100644 --- a/worlds/mm2/__init__.py +++ b/worlds/mm2/__init__.py @@ -133,6 +133,9 @@ class MM2World(World): Consumables.option_all): stage.add_locations(energy_pickups[region], MM2Location) self.multiworld.regions.append(stage) + goal_location = self.get_location(dr_wily) + goal_location.place_locked_item(MM2Item("Victory", ItemClassification.progression, None, self.player)) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) def create_item(self, name: str) -> MM2Item: item = item_table[name] @@ -189,11 +192,6 @@ class MM2World(World): f"Incompatible starting Robot Master, changing to " f"{self.options.starting_robot_master.current_key.replace('_', ' ').title()}") - def generate_basic(self) -> None: - goal_location = self.get_location(dr_wily) - goal_location.place_locked_item(MM2Item("Victory", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) - def fill_hook(self, progitempool: List["Item"], usefulitempool: List["Item"], From 516ebc53ce32f38aaeb6c51dd4c5702e908c969f Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Tue, 30 Sep 2025 12:31:49 -0400 Subject: [PATCH 110/204] LADX: fix local lvl 2 sword on the beach turning into a lvl 0 shield #5334 https://github.com/daid/LADXR/commit/e3e49b16d6af03818d6820e14db8f2ba7f0a424d --- worlds/ladx/LADXR/locations/beachSword.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/worlds/ladx/LADXR/locations/beachSword.py b/worlds/ladx/LADXR/locations/beachSword.py index 51fc4388..0835672c 100644 --- a/worlds/ladx/LADXR/locations/beachSword.py +++ b/worlds/ladx/LADXR/locations/beachSword.py @@ -11,19 +11,18 @@ class BeachSword(DroppedKey): super().__init__(0x0F2) def patch(self, rom: ROM, option: str, *, multiworld: Optional[int] = None) -> None: - if option != SWORD or multiworld is not None: - # Set the heart piece data - super().patch(rom, option, multiworld=multiworld) + # Set the heart piece data + super().patch(rom, option, multiworld=multiworld) - # Patch the room to contain a heart piece instead of the sword on the beach - re = RoomEditor(rom, 0x0F2) - re.removeEntities(0x31) # remove sword - re.addEntity(5, 5, 0x35) # add heart piece - re.store(rom) + # Patch the room to contain a heart piece instead of the sword on the beach + re = RoomEditor(rom, 0x0F2) + re.removeEntities(0x31) # remove sword + re.addEntity(5, 5, 0x35) # add heart piece + re.store(rom) - # Prevent shield drops from the like-like from turning into swords. - rom.patch(0x03, 0x1B9C, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) - rom.patch(0x03, 0x244D, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) + # Prevent shield drops from the like-like from turning into swords. + rom.patch(0x03, 0x1B9C, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) + rom.patch(0x03, 0x244D, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) def read(self, rom: ROM) -> str: re = RoomEditor(rom, 0x0F2) From 1d2ad1f9c92b6ff3b1a1ddf8c9c16a8d3b28269b Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Tue, 30 Sep 2025 10:32:50 -0600 Subject: [PATCH 111/204] Docs: More type annotation changes (#5301) * Update docs annotations * Update settings recommendation * Remove Dict in comment --- docs/entrance randomization.md | 4 ++-- docs/network protocol.md | 13 +++++++------ docs/settings api.md | 2 +- docs/style.md | 6 ++++-- docs/world api.md | 10 +++++----- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/entrance randomization.md b/docs/entrance randomization.md index 0f9d7647..d9f278bf 100644 --- a/docs/entrance randomization.md +++ b/docs/entrance randomization.md @@ -352,14 +352,14 @@ direction_matching_group_lookup = { Terrain matching or dungeon shuffle: ```python -def randomize_within_same_group(group: int) -> List[int]: +def randomize_within_same_group(group: int) -> list[int]: return [group] identity_group_lookup = bake_target_group_lookup(world, randomize_within_same_group) ``` Directional + area shuffle: ```python -def get_target_groups(group: int) -> List[int]: +def get_target_groups(group: int) -> list[int]: # example group: LEFT | CAVE # example result: [RIGHT | CAVE, DOOR | CAVE] direction = group & Groups.DIRECTION_MASK diff --git a/docs/network protocol.md b/docs/network protocol.md index b40cf31b..c3fc578a 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -79,7 +79,7 @@ Sent to clients when they connect to an Archipelago server. | generator_version | [NetworkVersion](#NetworkVersion) | Object denoting the version of Archipelago which generated the multiworld. | | tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. Example: `WebHost` | | password | bool | Denoted whether a password is required to join this room. | -| permissions | dict\[str, [Permission](#Permission)\[int\]\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". | +| permissions | dict\[str, [Permission](#Permission)\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". | | hint_cost | int | The percentage of total locations that need to be checked to receive a hint from the server. | | location_check_points | int | The amount of hint points you receive per item/location check completed. | | games | list\[str\] | List of games present in this multiworld. | @@ -662,13 +662,14 @@ class SlotType(enum.IntFlag): An object representing static information about a slot. ```python -import typing +from collections.abc import Sequence +from typing import NamedTuple from NetUtils import SlotType -class NetworkSlot(typing.NamedTuple): +class NetworkSlot(NamedTuple): name: str game: str type: SlotType - group_members: typing.List[int] = [] # only populated if type == group + group_members: Sequence[int] = [] # only populated if type == group ``` ### Permission @@ -686,8 +687,8 @@ class Permission(enum.IntEnum): ### Hint An object representing a Hint. ```python -import typing -class Hint(typing.NamedTuple): +from typing import NamedTuple +class Hint(NamedTuple): receiving_player: int finding_player: int location: int diff --git a/docs/settings api.md b/docs/settings api.md index d701c017..36520fe6 100644 --- a/docs/settings api.md +++ b/docs/settings api.md @@ -28,7 +28,7 @@ if it does not exist. ## Global Settings All non-world-specific settings are defined directly in settings.py. -Each value needs to have a default. If the default should be `None`, define it as `typing.Optional` and assign `None`. +Each value needs to have a default. If the default should be `None`, annotate it using `T | None = None`. To access a "global" config value, with correct typing, use one of ```python diff --git a/docs/style.md b/docs/style.md index bb1526fa..e38be9d6 100644 --- a/docs/style.md +++ b/docs/style.md @@ -15,8 +15,10 @@ * Prefer [format string literals](https://peps.python.org/pep-0498/) over string concatenation, use single quotes inside them: `f"Like {dct['key']}"` * Use type annotations where possible for function signatures and class members. -* Use type annotations where appropriate for local variables (e.g. `var: List[int] = []`, or when the - type is hard or impossible to deduce.) Clear annotations help developers look up and validate API calls. +* Use type annotations where appropriate for local variables (e.g. `var: list[int] = []`, or when the + type is hard or impossible to deduce). Clear annotations help developers look up and validate API calls. +* Prefer new style type annotations for new code (e.g. `var: dict[str, str | int]` over + `var: Dict[str, Union[str, int]]`). * If a line ends with an open bracket/brace/parentheses, the matching closing bracket should be at the beginning of a line at the same indentation as the beginning of the line with the open bracket. ```python diff --git a/docs/world api.md b/docs/world api.md index 832ad05d..db6da50c 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -76,8 +76,8 @@ webhost: * `game_info_languages` (optional) list of strings for defining the existing game info pages your game supports. The documents must be prefixed with the same string as defined here. Default already has 'en'. -* `options_presets` (optional) `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 +* `options_presets` (optional) `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. @@ -753,7 +753,7 @@ from BaseClasses import CollectionState, MultiWorld from worlds.AutoWorld import LogicMixin class MyGameState(LogicMixin): - mygame_defeatable_enemies: Dict[int, Set[str]] # per player + mygame_defeatable_enemies: dict[int, set[str]] # per player def init_mixin(self, multiworld: MultiWorld) -> None: # Initialize per player with the corresponding "nothing" value, such as 0 or an empty set. @@ -882,11 +882,11 @@ item/location pairs is unnecessary since the AP server already retains and freel that request it. The most common usage of slot data is sending option results that the client needs to be aware of. ```python -def fill_slot_data(self) -> Dict[str, Any]: +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. - # The options dataclass has a method to return a `Dict[str, Any]` of each option name provided and the relevant + # The options dataclass has a method to return a `dict[str, Any]` of each option name provided and the relevant # option's value. return self.options.as_dict("difficulty", "final_boss_hp") ``` From 92ff0ddba8ae300fe9164ee13b37d6a0d531db7a Mon Sep 17 00:00:00 2001 From: Phaneros <31861583+MatthewMarinets@users.noreply.github.com> Date: Tue, 30 Sep 2025 09:34:26 -0700 Subject: [PATCH 112/204] SC2: Launcher bugfixes after content merge (#5409) * sc2: Fixing Launcher.py launch not properly handling command-line arguments * sc2: Fixing some old option names in webhost * sc2: Switching to common client url parameter handling --- worlds/sc2/client.py | 20 ++++++++------------ worlds/sc2/options.py | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/worlds/sc2/client.py b/worlds/sc2/client.py index d64d44ae..e9f46f93 100644 --- a/worlds/sc2/client.py +++ b/worlds/sc2/client.py @@ -21,10 +21,11 @@ import random import concurrent.futures import time import uuid +import argparse from pathlib import Path # CommonClient import first to trigger ModuleUpdater -from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser +from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser, handle_url_arg from Utils import init_logging, is_windows, async_start from .item import item_names, item_parents, race_to_item_type from .item.item_annotations import ITEM_NAME_ANNOTATIONS @@ -1298,20 +1299,15 @@ class CompatItemHolder(typing.NamedTuple): quantity: int = 1 -def parse_uri(uri: str) -> str: - if "://" in uri: - uri = uri.split("://", 1)[1] - return uri.split('?', 1)[0] - - -async def main(): +async def main(args: typing.Sequence[str] | None): multiprocessing.freeze_support() parser = get_base_parser() parser.add_argument('--name', default=None, help="Slot Name to connect as.") - args, uri = parser.parse_known_args() + args, uri = parser.parse_known_args(args) if uri and uri[0].startswith('archipelago://'): - args.connect = parse_uri(' '.join(uri)) + args.url = uri[0] + handle_url_arg(args, parser) ctx = SC2Context(args.connect, args.password) ctx.auth = args.name @@ -2346,7 +2342,7 @@ def force_settings_save_on_close() -> None: _has_forced_save = True -def launch(): +def launch(*args: str): colorama.just_fix_windows_console() - asyncio.run(main()) + asyncio.run(main(args)) colorama.deinit() diff --git a/worlds/sc2/options.py b/worlds/sc2/options.py index 08be7e18..00dd4ba7 100644 --- a/worlds/sc2/options.py +++ b/worlds/sc2/options.py @@ -170,7 +170,7 @@ class TwoStartPositions(Toggle): If turned on and 'grid', 'hopscotch', or 'golden_path' mission orders are selected, removes the first mission and allows both of the next two missions to be played from the start. """ - display_name = "Start with two unlocked missions on grid" + display_name = "Two start missions" default = Toggle.option_false @@ -1053,7 +1053,7 @@ class VictoryCache(Range): Controls how many additional checks are awarded for completing a mission. Goal missions are unaffected by this option. """ - display_name = "Victory Checks" + display_name = "Victory Cache" range_start = 0 range_end = 10 default = 0 From 897d5ab0893c685ef7773eb98eb5da638e090875 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Tue, 30 Sep 2025 18:35:26 +0200 Subject: [PATCH 113/204] SC2: Fix Conviction logic for Grant Story Tech (#5419) * Fix Conviction logic for Grant Story Tech - Kinetic Blast and Crushing Grip is available for the mission if story tech is granted * Review updates --- worlds/sc2/locations.py | 15 +++++------ worlds/sc2/rules.py | 42 +++++++++++++++++------------- worlds/sc2/test/test_generation.py | 1 + worlds/sc2/test/test_usecases.py | 40 +++++++++++++++++++++++++++- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py index 203d4d26..6b505d9c 100644 --- a/worlds/sc2/locations.py +++ b/worlds/sc2/locations.py @@ -2341,8 +2341,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 200, LocationType.VICTORY, lambda state: logic.basic_kerrigan(state) - or kerriganless - or logic.grant_story_tech == GrantStoryTech.option_grant, + or kerriganless, hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, ), make_location_data( @@ -2351,8 +2350,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 201, LocationType.EXTRA, lambda state: logic.basic_kerrigan(state) - or kerriganless - or logic.grant_story_tech == GrantStoryTech.option_grant, + or kerriganless, hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, ), make_location_data( @@ -2379,8 +2377,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 205, LocationType.EXTRA, lambda state: logic.basic_kerrigan(state) - or kerriganless - or logic.grant_story_tech == GrantStoryTech.option_grant, + or kerriganless, hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, ), make_location_data( @@ -2446,7 +2443,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: lambda state: ( logic.zerg_competent_comp(state) and logic.zerg_competent_anti_air(state) - and (logic.basic_kerrigan(state) or kerriganless) + and (logic.basic_kerrigan(state, False) or kerriganless) and logic.zerg_defense_rating(state, False, False) >= 3 and logic.zerg_power_rating(state) >= 5 ), @@ -3530,7 +3527,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: kerriganless or ( logic.two_kerrigan_actives(state) - and (logic.basic_kerrigan(state) or logic.grant_story_tech == GrantStoryTech.option_grant) + and logic.basic_kerrigan(state) and logic.kerrigan_levels(state, 25) ) ), @@ -3554,7 +3551,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: kerriganless or ( logic.two_kerrigan_actives(state) - and (logic.basic_kerrigan(state) or logic.grant_story_tech == GrantStoryTech.option_grant) + and logic.basic_kerrigan(state) and logic.kerrigan_levels(state, 25) ) ), diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index e6068ab2..2a03d65d 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -1127,8 +1127,10 @@ class SC2Logic: return levels >= target - def basic_kerrigan(self, state: CollectionState) -> bool: - # One active ability that can be used to defeat enemies directly on Standard + def basic_kerrigan(self, state: CollectionState, story_tech_available=True) -> bool: + if story_tech_available and self.grant_story_tech == GrantStoryTech.option_grant: + return True + # One active ability that can be used to defeat enemies directly if not state.has_any( ( item_names.KERRIGAN_LEAPING_STRIKE, @@ -1149,7 +1151,9 @@ class SC2Logic: return True return False - def two_kerrigan_actives(self, state: CollectionState) -> bool: + def two_kerrigan_actives(self, state: CollectionState, story_tech_available=True) -> bool: + if story_tech_available and self.grant_story_tech == GrantStoryTech.option_grant: + return True count = 0 for i in range(7): if state.has_any(kerrigan_logic_active_abilities, self.player): @@ -2396,7 +2400,7 @@ class SC2Logic: return ( self.zerg_competent_comp(state) and (self.zerg_competent_anti_air(state) or self.advanced_tactics and self.zerg_moderate_anti_air(state)) - and (self.basic_kerrigan(state) or self.zerg_power_rating(state) >= 4) + and (self.basic_kerrigan(state, False) or self.zerg_power_rating(state) >= 4) ) def protoss_hand_of_darkness_requirement(self, state: CollectionState) -> bool: @@ -2412,7 +2416,7 @@ class SC2Logic: return self.protoss_deathball(state) and self.protoss_power_rating(state) >= 8 def zerg_the_reckoning_requirement(self, state: CollectionState) -> bool: - if not (self.zerg_power_rating(state) >= 6 or self.basic_kerrigan(state)): + if not (self.zerg_power_rating(state) >= 6 or self.basic_kerrigan(state, False)): return False if self.take_over_ai_allies: return ( @@ -2460,20 +2464,22 @@ class SC2Logic: def the_infinite_cycle_requirement(self, state: CollectionState) -> bool: return ( - self.grant_story_tech == GrantStoryTech.option_grant - or not self.kerrigan_unit_available - or ( - state.has_any( - ( - item_names.KERRIGAN_KINETIC_BLAST, - item_names.KERRIGAN_SPAWN_BANELINGS, - item_names.KERRIGAN_LEAPING_STRIKE, - item_names.KERRIGAN_SPAWN_LEVIATHAN, - ), - self.player, + self.kerrigan_levels(state, 70) + and ( + self.grant_story_tech == GrantStoryTech.option_grant + or not self.kerrigan_unit_available + or ( + state.has_any( + ( + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + ), + self.player, + ) + and self.basic_kerrigan(state) ) - and self.basic_kerrigan(state) - and self.kerrigan_levels(state, 70) ) ) diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index 67e302fe..110fa937 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -2,6 +2,7 @@ Unit tests for world generation """ from typing import * + from .test_base import Sc2SetupTestBase from .. import mission_groups, mission_tables, options, locations, SC2Mission, SC2Campaign, SC2Race, unreleased_items, \ diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index a87d1766..b5175877 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -6,7 +6,9 @@ from .test_base import Sc2SetupTestBase from .. import get_all_missions, mission_tables, options from ..item import item_groups, item_tables, item_names from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag -from ..options import EnabledCampaigns, MasteryLocations +from ..options import EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns, \ + ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech, \ + GrantStoryLevels class TestSupportedUseCases(Sc2SetupTestBase): @@ -490,3 +492,39 @@ class TestSupportedUseCases(Sc2SetupTestBase): self.assertTupleEqual(terran_nonmerc_units, ()) self.assertTupleEqual(zerg_nonmerc_units, ()) + + def test_all_kerrigan_missions_are_nobuild_and_grant_story_tech_is_on(self) -> None: + # The actual situation the bug got caught + world_options = { + 'mission_order': MissionOrder.option_vanilla_shuffled, + 'selected_races': [ + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + SC2Race.PROTOSS.get_title(), + ], + 'enabled_campaigns': [ + SC2Campaign.WOL.campaign_name, + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.HOTS.campaign_name, + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name, + SC2Campaign.EPILOGUE.campaign_name, + SC2Campaign.NCO.campaign_name, + ], + 'enable_race_swap': EnableRaceSwapVariants.option_shuffle_all_non_vanilla, # Causes no build Kerrigan missions to be present, only nobuilds remain + 'shuffle_campaigns': ShuffleCampaigns.option_true, + 'shuffle_no_build': ShuffleNoBuild.option_true, + 'starter_unit': StarterUnit.option_balanced, + 'required_tactics': RequiredTactics.option_standard, + 'kerrigan_presence': KerriganPresence.option_vanilla, + 'kerrigan_levels_per_mission_completed': 0, + 'kerrigan_levels_per_mission_completed_cap': -1, + 'kerrigan_level_item_sum': 87, + 'kerrigan_level_item_distribution': KerriganLevelItemDistribution.option_size_7, + 'kerrigan_total_level_cap': -1, + 'start_primary_abilities': 0, + 'grant_story_tech': GrantStoryTech.option_grant, + 'grant_story_levels': GrantStoryLevels.option_additive, + } + self.generate_world(world_options) + # Just check that the world itself generates under those rules and no exception is thrown From 49f2d30587db2d09c2ad2f20283b917a60858733 Mon Sep 17 00:00:00 2001 From: Phaneros <31861583+MatthewMarinets@users.noreply.github.com> Date: Tue, 30 Sep 2025 09:36:41 -0700 Subject: [PATCH 114/204] Sc2: [performance] change default options (#5424) * sc2: Changing default campaign options to something more performative and desirable for new players * sc2: Fixing broken test that was missed in roundup * SC2: Update tests for new defaults * SC2: Fix incomplete test * sc2: Updating description for enabled campaigns to mention which are free to play * sc2: PR comments; Updating additional unit tests that were affected by a default change * sc2: Adding a comment to the Enabled Campaigns option to list all the valid campaign names * sc2: Adding quotes wrapping sample values in enabled_campaigns comment to aid copy-pasting --------- Co-authored-by: Salzkorn --- worlds/sc2/options.py | 24 ++++++-- worlds/sc2/test/test_base.py | 15 ++++- worlds/sc2/test/test_custom_mission_orders.py | 5 ++ worlds/sc2/test/test_generation.py | 59 +++++++++++++++---- worlds/sc2/test/test_item_filtering.py | 3 + worlds/sc2/test/test_rules.py | 1 + worlds/sc2/test/test_usecases.py | 9 ++- 7 files changed, 98 insertions(+), 18 deletions(-) diff --git a/worlds/sc2/options.py b/worlds/sc2/options.py index 00dd4ba7..74ea67c0 100644 --- a/worlds/sc2/options.py +++ b/worlds/sc2/options.py @@ -63,7 +63,7 @@ class Sc2MissionSet(OptionSet): return self.value.__len__() -class SelectRaces(OptionSet): +class SelectedRaces(OptionSet): """ Pick which factions' missions and items can be shuffled into the world. """ @@ -152,6 +152,7 @@ class MissionOrder(Choice): option_golden_path = 10 option_hopscotch = 11 option_custom = 99 + default = option_golden_path class MaximumCampaignSize(Range): @@ -251,10 +252,21 @@ class PlayerColorNova(ColorChoice): class EnabledCampaigns(OptionSet): - """Determines which campaign's missions will be used""" + """ + Determines which campaign's missions will be used. + Wings of Liberty, Prophecy, and Prologue are the only free-to-play campaigns. + Valid campaign names: + - 'Wings of Liberty' + - 'Prophecy' + - 'Heart of the Swarm' + - 'Whispers of Oblivion (Legacy of the Void: Prologue)' + - 'Legacy of the Void' + - 'Into the Void (Legacy of the Void: Epilogue)' + - 'Nova Covert Ops' + """ display_name = "Enabled Campaigns" valid_keys = {campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL} - default = valid_keys + default = set((SC2Campaign.WOL.campaign_name,)) class EnableRaceSwapVariants(Choice): @@ -1342,7 +1354,7 @@ class Starcraft2Options(PerGameCommonOptions): player_color_zerg: PlayerColorZerg player_color_zerg_primal: PlayerColorZergPrimal player_color_nova: PlayerColorNova - selected_races: SelectRaces + selected_races: SelectedRaces enabled_campaigns: EnabledCampaigns enable_race_swap: EnableRaceSwapVariants mission_race_balancing: EnableMissionRaceBalancing @@ -1436,7 +1448,7 @@ option_groups = [ ShuffleCampaigns, AllInMap, TwoStartPositions, - SelectRaces, + SelectedRaces, ExcludeVeryHardMissions, EnableMissionRaceBalancing, ]), @@ -1548,7 +1560,7 @@ def get_option_value(world: Union['SC2World', None], name: str) -> int: def get_enabled_races(world: Optional['SC2World']) -> Set[SC2Race]: - race_names = world.options.selected_races.value if world and len(world.options.selected_races.value) > 0 else SelectRaces.valid_keys + race_names = world.options.selected_races.value if world and len(world.options.selected_races.value) > 0 else SelectedRaces.valid_keys return {race for race in SC2Race if race.get_title() in race_names} diff --git a/worlds/sc2/test/test_base.py b/worlds/sc2/test/test_base.py index 6110814c..f0f778dc 100644 --- a/worlds/sc2/test/test_base.py +++ b/worlds/sc2/test/test_base.py @@ -8,8 +8,9 @@ from worlds import AutoWorld from test.general import gen_steps, call_all from test.bases import WorldTestBase -from .. import SC2World +from .. import SC2World, SC2Campaign from .. import client +from .. import options class Sc2TestBase(WorldTestBase): game = client.SC2Context.game @@ -24,6 +25,18 @@ class Sc2SetupTestBase(unittest.TestCase): This allows potentially generating multiple worlds in one test case, useful for tracking down a rare / sporadic crash. """ + ALL_CAMPAIGNS = { + 'enabled_campaigns': options.EnabledCampaigns.valid_keys, + } + TERRAN_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.WOL.campaign_name, SC2Campaign.NCO.campaign_name,} + } + ZERG_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.HOTS.campaign_name,} + } + PROTOSS_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.PROPHECY.campaign_name, SC2Campaign.PROLOGUE.campaign_name, SC2Campaign.LOTV.campaign_name,} + } seed: Optional[int] = None game = SC2World.game player = 1 diff --git a/worlds/sc2/test/test_custom_mission_orders.py b/worlds/sc2/test/test_custom_mission_orders.py index f431e909..524e6481 100644 --- a/worlds/sc2/test/test_custom_mission_orders.py +++ b/worlds/sc2/test/test_custom_mission_orders.py @@ -6,10 +6,12 @@ from .test_base import Sc2SetupTestBase from .. import MissionFlag from ..item import item_tables, item_names from BaseClasses import ItemClassification +from .. import options class TestCustomMissionOrders(Sc2SetupTestBase): def test_mini_wol_generates(self): world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': 'custom', 'custom_mission_order': { 'Mini Wings of Liberty': { @@ -137,6 +139,7 @@ class TestCustomMissionOrders(Sc2SetupTestBase): test_item = item_names.ZERGLING_METABOLIC_BOOST world_options = { 'mission_order': 'custom', + 'enabled_campaigns': set(options.EnabledCampaigns.valid_keys), 'start_inventory': { test_item: 1 }, 'custom_mission_order': { 'test': { @@ -164,6 +167,7 @@ class TestCustomMissionOrders(Sc2SetupTestBase): test_item = item_names.ZERGLING_METABOLIC_BOOST world_options = { 'mission_order': 'custom', + 'enabled_campaigns': set(options.EnabledCampaigns.valid_keys), 'start_inventory': { test_item: 1 }, 'locked_items': { test_item: 1 }, 'custom_mission_order': { @@ -192,6 +196,7 @@ class TestCustomMissionOrders(Sc2SetupTestBase): test_item = item_names.ZERGLING test_amount = 3 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': 'custom', 'locked_items': { test_item: 1 }, # Make sure it is generated as normal 'custom_mission_order': { diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index 110fa937..61de392c 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -16,6 +16,7 @@ from ..options import EnabledCampaigns, NovaGhostOfAChanceVariant, MissionOrder, class TestItemFiltering(Sc2SetupTestBase): def test_explicit_locks_excludes_interact_and_set_flags(self): world_options = { + **self.ALL_CAMPAIGNS, 'locked_items': { item_names.MARINE: 0, item_names.MARAUDER: 0, @@ -116,6 +117,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_mission_groups_excludes_all_missions_in_group(self): world_options = { + **self.ZERG_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'excluded_missions': [ mission_groups.MissionGroupNames.HOTS_ZERUS_MISSIONS, ], @@ -158,6 +161,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_terran_missions_excludes_all_terran_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'excluded_missions': [ @@ -173,6 +178,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_terran_build_missions_excludes_all_terran_units(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'excluded_missions': [ @@ -191,6 +198,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_zerg_and_kerrigan_missions_excludes_all_zerg_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'excluded_missions': [ @@ -206,6 +215,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_zerg_build_missions_excludes_zerg_units(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'excluded_missions': [ @@ -225,6 +236,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_protoss_missions_excludes_all_protoss_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'accessibility': 'locations', @@ -242,6 +255,8 @@ class TestItemFiltering(Sc2SetupTestBase): def test_excluding_all_protoss_build_missions_excludes_protoss_units(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'accessibility': 'locations', @@ -287,6 +302,7 @@ class TestItemFiltering(Sc2SetupTestBase): def test_vanilla_items_only_includes_only_nova_equipment_and_vanilla_and_filler_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, # Avoid options that lock non-vanilla items for logic @@ -516,6 +532,7 @@ class TestItemFiltering(Sc2SetupTestBase): def test_nco_and_wol_picks_correct_starting_mission(self): world_options = { + 'mission_order': MissionOrder.option_vanilla, 'enabled_campaigns': { SC2Campaign.WOL.campaign_name, SC2Campaign.NCO.campaign_name @@ -530,7 +547,7 @@ class TestItemFiltering(Sc2SetupTestBase): mission_tables.SC2Mission.ZERO_HOUR.mission_name.split(" (")[0] ], 'mission_order': options.MissionOrder.option_grid, - 'selected_races': options.SelectRaces.valid_keys, + 'selected_races': options.SelectedRaces.valid_keys, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'enabled_campaigns': { SC2Campaign.WOL.campaign_name, @@ -549,7 +566,7 @@ class TestItemFiltering(Sc2SetupTestBase): mission_tables.SC2Mission.ZERO_HOUR.mission_name ], 'mission_order': options.MissionOrder.option_grid, - 'selected_races': options.SelectRaces.valid_keys, + 'selected_races': options.SelectedRaces.valid_keys, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'enabled_campaigns': { SC2Campaign.WOL.campaign_name, @@ -757,7 +774,7 @@ class TestItemFiltering(Sc2SetupTestBase): def test_kerrigan_levels_per_mission_triggering_pre_fill(self): world_options = { - # Vanilla WoL with all missions + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_custom, 'custom_mission_order': { 'campaign': { @@ -798,7 +815,7 @@ class TestItemFiltering(Sc2SetupTestBase): def test_kerrigan_levels_per_mission_and_generic_upgrades_both_triggering_pre_fill(self): world_options = { - # Vanilla WoL with all missions + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_custom, 'custom_mission_order': { 'campaign': { @@ -843,10 +860,9 @@ class TestItemFiltering(Sc2SetupTestBase): self.assertNotIn(item_names.KERRIGAN_LEVELS_70, itempool) self.assertNotIn(item_names.KERRIGAN_LEVELS_70, starting_inventory) - - def test_locking_required_items(self): world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_custom, 'custom_mission_order': { 'campaign': { @@ -892,7 +908,7 @@ class TestItemFiltering(Sc2SetupTestBase): 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': campaign_size, 'enabled_campaigns': EnabledCampaigns.valid_keys, - 'selected_races': options.SelectRaces.valid_keys, + 'selected_races': options.SelectedRaces.valid_keys, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'mission_race_balancing': options.EnableMissionRaceBalancing.option_fully_balanced, } @@ -924,6 +940,7 @@ class TestItemFiltering(Sc2SetupTestBase): }, 'max_number_of_upgrades': 2, 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, 'selected_races': { SC2Race.TERRAN.get_title(), }, @@ -960,6 +977,7 @@ class TestItemFiltering(Sc2SetupTestBase): }, 'max_number_of_upgrades': 2, 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, 'selected_races': { SC2Race.TERRAN.get_title(), SC2Race.ZERG.get_title(), @@ -990,6 +1008,7 @@ class TestItemFiltering(Sc2SetupTestBase): }, 'max_upgrade_level': MAX_LEVEL, 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_weapon_and_armor } @@ -1016,12 +1035,13 @@ class TestItemFiltering(Sc2SetupTestBase): def test_ghost_of_a_chance_generates_without_nco(self) -> None: world_options = { + **self.TERRAN_CAMPAIGNS, 'mission_order': MissionOrder.option_custom, 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, 'custom_mission_order': { 'test': { 'type': 'column', - 'size': 1, # Give the generator some space to place the key + 'size': 1, 'mission_pool': [ SC2Mission.GHOST_OF_A_CHANCE.mission_name ] @@ -1037,12 +1057,13 @@ class TestItemFiltering(Sc2SetupTestBase): def test_ghost_of_a_chance_generates_using_nco_nova(self) -> None: world_options = { + **self.TERRAN_CAMPAIGNS, 'mission_order': MissionOrder.option_custom, 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_nco, 'custom_mission_order': { 'test': { 'type': 'column', - 'size': 2, # Give the generator some space to place the key + 'size': 2, 'mission_pool': [ SC2Mission.LIBERATION_DAY.mission_name, # Starter mission SC2Mission.GHOST_OF_A_CHANCE.mission_name, @@ -1058,12 +1079,13 @@ class TestItemFiltering(Sc2SetupTestBase): def test_ghost_of_a_chance_generates_with_nco(self) -> None: world_options = { + **self.TERRAN_CAMPAIGNS, 'mission_order': MissionOrder.option_custom, 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, 'custom_mission_order': { 'test': { 'type': 'column', - 'size': 3, # Give the generator some space to place the key + 'size': 3, 'mission_pool': [ SC2Mission.LIBERATION_DAY.mission_name, # Starter mission SC2Mission.GHOST_OF_A_CHANCE.mission_name, @@ -1080,7 +1102,9 @@ class TestItemFiltering(Sc2SetupTestBase): def test_exclude_overpowered_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'selected_races': [SC2Race.TERRAN.get_title()], @@ -1096,7 +1120,9 @@ class TestItemFiltering(Sc2SetupTestBase): def test_exclude_overpowered_items_not_excluded(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'selected_races': [SC2Race.TERRAN.get_title()], @@ -1112,7 +1138,9 @@ class TestItemFiltering(Sc2SetupTestBase): def test_exclude_overpowered_items_vanilla_only(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, 'vanilla_items_only': VanillaItemsOnly.option_true, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, @@ -1129,7 +1157,9 @@ class TestItemFiltering(Sc2SetupTestBase): def test_exclude_locked_overpowered_items(self) -> None: locked_item = item_names.BATTLECRUISER_ATX_LASER_BATTERY world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, 'locked_items': [locked_item], 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, @@ -1147,7 +1177,9 @@ class TestItemFiltering(Sc2SetupTestBase): Checks if all unreleased items are marked properly not to generate """ world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, } @@ -1165,7 +1197,9 @@ class TestItemFiltering(Sc2SetupTestBase): Locking overrides this behavior - if they're locked, they must appear """ world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, 'locked_items': {item_name: 0 for item_name in unreleased_items}, @@ -1180,10 +1214,12 @@ class TestItemFiltering(Sc2SetupTestBase): def test_merc_excluded_excludes_merc_upgrades(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, 'maximum_campaign_size': MaximumCampaignSize.range_end, 'excluded_items': [item_name for item_name in item_groups.terran_mercenaries], 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], } self.generate_world(world_options) @@ -1193,6 +1229,7 @@ class TestItemFiltering(Sc2SetupTestBase): def test_unexcluded_items_applies_over_op_items(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, @@ -1216,11 +1253,13 @@ class TestItemFiltering(Sc2SetupTestBase): def test_exclude_overpowered_items_and_not_allow_unit_nerfs(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': MissionOrder.option_grid, 'maximum_campaign_size': MaximumCampaignSize.range_end, 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, 'war_council_nerfs': options.WarCouncilNerfs.option_false, 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.PROTOSS.get_title()], } self.generate_world(world_options) diff --git a/worlds/sc2/test/test_item_filtering.py b/worlds/sc2/test/test_item_filtering.py index 898fb6da..7f8251c5 100644 --- a/worlds/sc2/test/test_item_filtering.py +++ b/worlds/sc2/test/test_item_filtering.py @@ -15,6 +15,7 @@ class ItemFilterTests(Sc2SetupTestBase): }, 'required_tactics': 'standard', 'min_number_of_upgrades': 1, + **self.TERRAN_CAMPAIGNS, 'selected_races': { SC2Race.TERRAN.get_title() }, @@ -54,6 +55,7 @@ class ItemFilterTests(Sc2SetupTestBase): }, 'min_number_of_upgrades': 2, 'required_tactics': 'standard', + **self.ALL_CAMPAIGNS, 'selected_races': { SC2Race.PROTOSS.get_title() }, @@ -75,6 +77,7 @@ class ItemFilterTests(Sc2SetupTestBase): }, 'min_number_of_upgrades': 2, 'required_tactics': 'standard', + **self.PROTOSS_CAMPAIGNS, 'selected_races': { SC2Race.PROTOSS.get_title() }, diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py index d43a4d4e..abd005c1 100644 --- a/worlds/sc2/test/test_rules.py +++ b/worlds/sc2/test/test_rules.py @@ -116,6 +116,7 @@ class TestRules(unittest.TestCase): test_world.options.take_over_ai_allies.value = take_over_ai_allies test_world.options.kerrigan_presence.value = kerrigan_presence test_world.options.spear_of_adun_passive_ability_presence.value = spear_of_adun_passive_presence + test_world.options.enabled_campaigns.value = set(options.EnabledCampaigns.valid_keys) test_world.logic = SC2Logic(test_world) # type: ignore return test_world diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index b5175877..7f3ac70f 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -272,7 +272,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_race_swap_pick_one_has_correct_length_and_includes_swaps(self) -> None: world_options = { - 'selected_races': options.SelectRaces.valid_keys, + 'selected_races': options.SelectedRaces.valid_keys, 'enable_race_swap': options.EnableRaceSwapVariants.option_pick_one, 'enabled_campaigns': { SC2Campaign.WOL.campaign_name, @@ -343,6 +343,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_kerrigan_max_active_abilities(self): target_number: int = 8 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -361,6 +362,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_kerrigan_max_passive_abilities(self): target_number: int = 3 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -379,6 +381,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_spear_of_adun_max_active_abilities(self): target_number: int = 8 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -398,6 +401,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_spear_of_adun_max_autocasts(self): target_number: int = 2 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -417,6 +421,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_nova_max_weapons(self): target_number: int = 3 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -436,6 +441,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_nova_max_gadgets(self): target_number: int = 3 world_options = { + **self.ALL_CAMPAIGNS, 'mission_order': options.MissionOrder.option_grid, 'maximum_campaign_size': options.MaximumCampaignSize.range_end, 'selected_races': { @@ -453,6 +459,7 @@ class TestSupportedUseCases(Sc2SetupTestBase): def test_mercs_only(self) -> None: world_options = { + **self.ALL_CAMPAIGNS, 'selected_races': [ SC2Race.TERRAN.get_title(), SC2Race.ZERG.get_title(), From 448f214cdbc08e46798506debf299020b401d94e Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Wed, 1 Oct 2025 02:39:04 +1000 Subject: [PATCH 115/204] core: Option to skip "unused" item links (#4608) * core: Option to skip "unused" item links * Update worlds/generic/docs/advanced_settings_en.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Update BaseClasses.py Co-authored-by: Scipio Wright --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: Scipio Wright --- BaseClasses.py | 3 +++ Options.py | 1 + worlds/generic/docs/advanced_settings_en.md | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index ca717b60..855efc60 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -261,6 +261,7 @@ class MultiWorld(): "local_items": set(item_link.get("local_items", [])), "non_local_items": set(item_link.get("non_local_items", [])), "link_replacement": replacement_prio.index(item_link["link_replacement"]), + "skip_if_solo": item_link.get("skip_if_solo", False), } for _name, item_link in item_links.items(): @@ -284,6 +285,8 @@ class MultiWorld(): for group_name, item_link in item_links.items(): game = item_link["game"] + if item_link["skip_if_solo"] and len(item_link["players"]) == 1: + continue group_id, group = self.add_group(group_name, game, set(item_link["players"])) group["item_pool"] = item_link["item_pool"] diff --git a/Options.py b/Options.py index 47d6c2d3..dc1e8c90 100644 --- a/Options.py +++ b/Options.py @@ -1446,6 +1446,7 @@ class ItemLinks(OptionList): Optional("local_items"): [And(str, len)], Optional("non_local_items"): [And(str, len)], Optional("link_replacement"): Or(None, bool), + Optional("skip_if_solo"): Or(None, bool), } ]) diff --git a/worlds/generic/docs/advanced_settings_en.md b/worlds/generic/docs/advanced_settings_en.md index db93981b..25943076 100644 --- a/worlds/generic/docs/advanced_settings_en.md +++ b/worlds/generic/docs/advanced_settings_en.md @@ -214,12 +214,13 @@ Timespinner: progression_balancing: 50 item_links: # Share part of your item pool with other players. - name: TSAll - item_pool: + item_pool: - Everything local_items: - Twin Pyramid Key - Timespinner Wheel replacement_item: null + skip_if_solo: true ``` #### This is a fully functional yaml file that will do all the following things: @@ -262,7 +263,7 @@ Timespinner: * For `Timespinner` all players in the `TSAll` item link group will share their entire item pool and the `Twin Pyramid Key` and `Timespinner Wheel` will be forced among the worlds of those in the group. The `null` replacement item will, instead of forcing a specific chosen item, allow the generator to randomly pick a filler item to replace the - player items. + player items. This item link will only be created if there are at least two players in the group. * `triggers` allows us to define a trigger such that if our `smallkey_shuffle` option happens to roll the `any_world` result it will also ensure that `bigkey_shuffle`, `map_shuffle`, and `compass_shuffle` are also forced to the `any_world` result. More information on triggers can be found in the From 5cec3f45f593e7a006fa18a6c6ffd756acdda776 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Tue, 30 Sep 2025 12:39:53 -0400 Subject: [PATCH 116/204] LADX: reorganize options page (#4851) * init * merge upstream/main * improve option tooltips, clean up file a bit * ladx feels like more of an ocean game * one more * more cleanup * some reorg * Apply suggestions from code review Co-authored-by: Scipio Wright * clean up accidental newlines * rewording * dont do the ohko alias --------- Co-authored-by: Scipio Wright --- worlds/ladx/Options.py | 420 ++++++++++++++++++++++------------------ worlds/ladx/__init__.py | 2 +- 2 files changed, 233 insertions(+), 189 deletions(-) diff --git a/worlds/ladx/Options.py b/worlds/ladx/Options.py index 8abfb0fb..2352e0fb 100644 --- a/worlds/ladx/Options.py +++ b/worlds/ladx/Options.py @@ -23,11 +23,24 @@ class LADXROption: class Logic(Choice, LADXROption): """ Affects where items are allowed to be placed. - [Normal] Playable without using any tricks or glitches. Can require knowledge from a vanilla playthrough, such as how to open Color Dungeon. - [Hard] More advanced techniques may be required, but glitches are not. Examples include tricky jumps, killing enemies with only pots. - [Glitched] Advanced glitches and techniques may be required, but extremely difficult or tedious tricks are not required. Examples include Bomb Triggers, Super Jumps and Jesus Jumps. - [Hell] Obscure knowledge and hard techniques may be required. Examples include featherless jumping with boots and/or hookshot, sequential pit buffers and unclipped superjumps. Things in here can be extremely hard to do or very time consuming.""" + + **Normal:** Playable without using any tricks or glitches. Can require + knowledge from a vanilla playthrough, such as how to open Color Dungeon. + + **Hard:** More advanced techniques may be required, but glitches are not. + Examples include tricky jumps, killing enemies with only pots. + + **Glitched:** Advanced glitches and techniques may be required, but + extremely difficult or tedious tricks are not required. Examples include + Bomb Triggers, Super Jumps and Jesus Jumps. + + **Hell:** Obscure knowledge and hard techniques may be required. Examples + include featherless jumping with boots and/or hookshot, sequential pit + buffers and unclipped superjumps. Things in here can be extremely hard to do + or very time consuming. + """ display_name = "Logic" + rich_text_doc = True ladxr_name = "logic" # option_casual = 0 option_normal = 1 @@ -40,8 +53,8 @@ class Logic(Choice, LADXROption): class TradeQuest(DefaultOffToggle, LADXROption): """ - [On] adds the trade items to the pool (the trade locations will always be local items) - [Off] (default) doesn't add them + Trade quest items are randomized. Each NPC takes its normal trade quest + item and gives a randomized item in return. """ display_name = "Trade Quest" ladxr_name = "tradequest" @@ -49,40 +62,32 @@ class TradeQuest(DefaultOffToggle, LADXROption): class TextShuffle(DefaultOffToggle): """ - [On] Shuffles all the text in the game - [Off] (default) doesn't shuffle them. + Shuffles all text in the game. """ display_name = "Text Shuffle" class Rooster(DefaultOnToggle, LADXROption): """ - [On] Adds the rooster to the item pool. - [Off] The rooster spot is still a check giving an item. But you will never find the rooster. In that case, any rooster spot is accessible without rooster by other means. + Adds the rooster to the item pool. If disabled, the overworld will be + modified so that any location requiring the rooster is accessible by other + means. """ display_name = "Rooster" ladxr_name = "rooster" -class Boomerang(Choice): - """ - [Normal] requires Magnifying Lens to get the boomerang. - [Gift] The boomerang salesman will give you a random item, and the boomerang is shuffled. - """ - display_name = "Boomerang" - - normal = 0 - gift = 1 - default = gift - - class EntranceShuffle(Choice, LADXROption): """ - [WARNING] Experimental, may fail to fill - Randomizes where overworld entrances lead to. - [Simple] Single-entrance caves/houses that have items are shuffled amongst each other. - If random start location and/or dungeon shuffle is enabled, then these will be shuffled with all the non-connector entrance pool. - Note, some entrances can lead into water, use the warp-to-home from the save&quit menu to escape this.""" + Randomizes where overworld entrances lead. + + **Simple:** Single-entrance caves/houses that have items are shuffled + amongst each other. + + If *Dungeon Shuffle* is enabled, then dungeons will be shuffled with all the + non-connector entrances in the pool. Note, some entrances can lead into water, use + the warp-to-home from the save&quit menu to escape this. + """ # [Advanced] Simple, but two-way connector caves are shuffled in their own pool as well. # [Expert] Advanced, but caves/houses without items are also shuffled into the Simple entrance pool. @@ -94,22 +99,22 @@ class EntranceShuffle(Choice, LADXROption): # option_expert = 3 # option_insanity = 4 default = option_none - display_name = "Experimental Entrance Shuffle" + display_name = "Entrance Shuffle" ladxr_name = "entranceshuffle" + rich_text_doc = True class DungeonShuffle(DefaultOffToggle, LADXROption): """ - [WARNING] Experimental, may fail to fill - Randomizes dungeon entrances within eachother + Randomizes dungeon entrances with each other. """ - display_name = "Experimental Dungeon Shuffle" + display_name = "Dungeon Shuffle" ladxr_name = "dungeonshuffle" class APTitleScreen(DefaultOnToggle): """ - Enables AP specific title screen and disables the intro cutscene + Enables AP specific title screen and disables the intro cutscene. """ display_name = "AP Title Screen" @@ -124,6 +129,7 @@ class BossShuffle(Choice): class DungeonItemShuffle(Choice): display_name = "Dungeon Item Shuffle" + rich_text_doc = True option_original_dungeon = 0 option_own_dungeons = 1 option_own_world = 2 @@ -138,12 +144,15 @@ class DungeonItemShuffle(Choice): class ShuffleNightmareKeys(DungeonItemShuffle): """ - Shuffle Nightmare Keys - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Nightmare Keys" ladxr_item = "NIGHTMARE_KEY" @@ -151,12 +160,15 @@ class ShuffleNightmareKeys(DungeonItemShuffle): class ShuffleSmallKeys(DungeonItemShuffle): """ - Shuffle Small Keys - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Small Keys" ladxr_item = "KEY" @@ -164,12 +176,15 @@ class ShuffleSmallKeys(DungeonItemShuffle): class ShuffleMaps(DungeonItemShuffle): """ - Shuffle Dungeon Maps - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Maps" ladxr_item = "MAP" @@ -177,12 +192,15 @@ class ShuffleMaps(DungeonItemShuffle): class ShuffleCompasses(DungeonItemShuffle): """ - Shuffle Dungeon Compasses - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Compasses" ladxr_item = "COMPASS" @@ -190,12 +208,15 @@ class ShuffleCompasses(DungeonItemShuffle): class ShuffleStoneBeaks(DungeonItemShuffle): """ - Shuffle Owl Beaks - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Stone Beaks" ladxr_item = "STONE_BEAK" @@ -203,13 +224,17 @@ class ShuffleStoneBeaks(DungeonItemShuffle): class ShuffleInstruments(DungeonItemShuffle): """ - Shuffle Instruments - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world - [Vanilla] The item will be in its vanilla location in your world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. + + **Vanilla:** The item will be in its vanilla location in your world. """ display_name = "Shuffle Instruments" ladxr_item = "INSTRUMENT" @@ -220,12 +245,18 @@ class ShuffleInstruments(DungeonItemShuffle): class Goal(Choice, LADXROption): """ - The Goal of the game - [Instruments] The Wind Fish's Egg will only open if you have the required number of Instruments of the Sirens, and play the Ballad of the Wind Fish. - [Seashells] The Egg will open when you bring 20 seashells. The Ballad and Ocarina are not needed. - [Open] The Egg will start pre-opened. + The Goal of the game. + + **Instruments:** The Wind Fish's Egg will only open if you have the required + number of Instruments of the Sirens, and play the Ballad of the Wind Fish. + + **Seashells:** The Egg will open when you bring 20 seashells. The Ballad and + Ocarina are not needed. + + **Open:** The Egg will start pre-opened. """ display_name = "Goal" + rich_text_doc = True ladxr_name = "goal" option_instruments = 1 option_seashells = 2 @@ -242,7 +273,7 @@ class Goal(Choice, LADXROption): class InstrumentCount(Range, LADXROption): """ - Sets the number of instruments required to open the Egg + Sets the number of instruments required to open the Egg. """ display_name = "Instrument Count" ladxr_name = None @@ -253,7 +284,8 @@ class InstrumentCount(Range, LADXROption): class NagMessages(DefaultOffToggle, LADXROption): """ - Controls if nag messages are shown when rocks and crystals are touched. Useful for glitches, annoying for everyone else. + Controls if nag messages are shown when rocks and crystals are touched. + Useful for glitches, annoying for everything else. """ display_name = "Nag Messages" ladxr_name = "nagmessages" @@ -262,31 +294,30 @@ class NagMessages(DefaultOffToggle, LADXROption): class MusicChangeCondition(Choice): """ Controls how the music changes. - [Sword] When you pick up a sword, the music changes - [Always] You always have the post-sword music + + **Sword:** When you pick up a sword, the music changes. + + **Always:** You always have the post-sword music. """ display_name = "Music Change Condition" + rich_text_doc = True option_sword = 0 option_always = 1 default = option_always -# Setting('hpmode', 'Gameplay', 'm', 'Health mode', options=[('default', '', 'Normal'), ('inverted', 'i', 'Inverted'), ('1', '1', 'Start with 1 heart'), ('low', 'l', 'Low max')], default='default', -# description=""" -# [Normal} health works as you would expect. -# [Inverted] you start with 9 heart containers, but killing a boss will take a heartcontainer instead of giving one. -# [Start with 1] normal game, you just start with 1 heart instead of 3. -# [Low max] replace heart containers with heart pieces."""), - - class HardMode(Choice, LADXROption): """ - [Oracle] Less iframes and health from drops. Bombs damage yourself. Water damages you without flippers. No piece of power or acorn. - [Hero] Switch version hero mode, double damage, no heart/fairy drops. - [One hit KO] You die on a single hit, always. + **Oracle:** Less iframes and health from drops. Bombs damage yourself. Water + damages you without flippers. No pieces of power or acorns. + + **Hero:** Switch version hero mode, double damage, no heart/fairy drops. + + **OHKO:** You die on a single hit, always. """ display_name = "Hard Mode" ladxr_name = "hardmode" + rich_text_doc = True option_none = 0 option_oracle = 1 option_hero = 2 @@ -294,44 +325,26 @@ class HardMode(Choice, LADXROption): default = option_none -# Setting('steal', 'Gameplay', 't', 'Stealing from the shop', -# options=[('always', 'a', 'Always'), ('never', 'n', 'Never'), ('default', '', 'Normal')], default='default', -# description="""Effects when you can steal from the shop. Stealing is bad and never in logic. -# [Normal] requires the sword before you can steal. -# [Always] you can always steal from the shop -# [Never] you can never steal from the shop."""), -class Bowwow(Choice): - """Allows BowWow to be taken into any area. Certain enemies and bosses are given a new weakness to BowWow. - [Normal] BowWow is in the item pool, but can be logically expected as a damage source. - [Swordless] The progressive swords are removed from the item pool. - """ - display_name = "BowWow" - normal = 0 - swordless = 1 - default = normal - - class Overworld(Choice, LADXROption): """ - [Open Mabe] Replaces rock on the east side of Mabe Village with bushes, allowing access to Ukuku Prairie without Power Bracelet. + **Open Mabe:** Replaces rock on the east side of Mabe Village with bushes, + allowing access to Ukuku Prairie without Power Bracelet. """ display_name = "Overworld" ladxr_name = "overworld" + rich_text_doc = True option_normal = 0 option_open_mabe = 1 default = option_normal -# Setting('superweapons', 'Special', 'q', 'Enable super weapons', default=False, -# description='All items will be more powerful, faster, harder, bigger stronger. You name it.'), - - class Quickswap(Choice, LADXROption): """ - Adds that the SELECT button swaps with either A or B. The item is swapped with the top inventory slot. The map is not available when quickswap is enabled. + Instead of opening the map, the *SELECT* button swaps the top item of your inventory on to your *A* or *B* button. """ display_name = "Quickswap" ladxr_name = "quickswap" + rich_text_doc = True option_none = 0 option_a = 1 option_b = 2 @@ -340,10 +353,11 @@ class Quickswap(Choice, LADXROption): class TextMode(Choice, LADXROption): """ - [Fast] Makes text appear twice as fast + **Fast:** Makes text appear twice as fast. """ display_name = "Text Mode" ladxr_name = "textmode" + rich_text_doc = True option_normal = 0 option_fast = 1 default = option_fast @@ -363,7 +377,8 @@ class LowHpBeep(Choice, LADXROption): class NoFlash(DefaultOnToggle, LADXROption): """ - Remove the flashing light effects from Mamu, shopkeeper and MadBatter. Useful for capture cards and people that are sensitive to these things. + Remove the flashing light effects from Mamu, shopkeeper and MadBatter. + Useful for capture cards and people that are sensitive to these things. """ display_name = "No Flash" ladxr_name = "noflash" @@ -371,23 +386,34 @@ class NoFlash(DefaultOnToggle, LADXROption): class BootsControls(Choice): """ - Adds additional button to activate Pegasus Boots (does nothing if you haven't picked up your boots!) - [Vanilla] Nothing changes, you have to equip the boots to use them - [Bracelet] Holding down the button for the bracelet also activates boots (somewhat like Link to the Past) - [Press A] Holding down A activates boots - [Press B] Holding down B activates boots + Adds an additional button to activate Pegasus Boots (does nothing if you + haven't picked up your boots!) + + **Vanilla:** Nothing changes, you have to equip the boots to use them. + + **Bracelet:** Holding down the button for the bracelet also activates boots + (somewhat like Link to the Past). + + **Press A:** Holding down A activates boots. + + **Press B:** Holding down B activates boots. """ display_name = "Boots Controls" + rich_text_doc = True option_vanilla = 0 option_bracelet = 1 option_press_a = 2 + alias_a = 2 option_press_b = 3 + alias_b = 3 class LinkPalette(Choice, LADXROption): """ - Sets link's palette - A-D are color palettes usually used during the damage animation and can change based on where you are. + Sets Link's palette. + + A-D are color palettes usually used during the damage animation and can + change based on where you are. """ display_name = "Link's Palette" ladxr_name = "linkspalette" @@ -408,14 +434,21 @@ class LinkPalette(Choice, LADXROption): class TrendyGame(Choice): """ - [Easy] All of the items hold still for you - [Normal] The vanilla behavior - [Hard] The trade item also moves - [Harder] The items move faster - [Hardest] The items move diagonally - [Impossible] The items move impossibly fast, may scroll on and off the screen + **Easy:** All of the items hold still for you. + + **Normal:** The vanilla behavior. + + **Hard:** The trade item also moves. + + **Harder:** The items move faster. + + **Hardest:** The items move diagonally. + + **Impossible:** The items move impossibly fast, may scroll on and off the + screen. """ display_name = "Trendy Game" + rich_text_doc = True option_easy = 0 option_normal = 1 option_hard = 2 @@ -435,15 +468,24 @@ class GfxMod(DefaultOffToggle): class Palette(Choice): """ Sets the palette for the game. - Note: A few places aren't patched, such as the menu and a few color dungeon tiles. - [Normal] The vanilla palette - [1-Bit] One bit of color per channel - [2-Bit] Two bits of color per channel - [Greyscale] Shades of grey - [Pink] Aesthetic - [Inverted] Inverted + + Note: A few places aren't patched, such as the menu and a few color dungeon + tiles. + + **Normal:** The vanilla palette. + + **1-Bit:** One bit of color per channel. + + **2-Bit:** Two bits of color per channel. + + **Greyscale:** Shades of grey. + + **Pink:** Aesthetic. + + **Inverted:** Inverted. """ display_name = "Palette" + rich_text_doc = True option_normal = 0 option_1bit = 1 option_2bit = 2 @@ -454,12 +496,15 @@ class Palette(Choice): class Music(Choice, LADXROption): """ - [Vanilla] Regular Music - [Shuffled] Shuffled Music - [Off] No music + **Vanilla:** Regular Music + + **Shuffled:** Shuffled Music + + **Off:** No music """ display_name = "Music" ladxr_name = "music" + rich_text_doc = True option_vanilla = 0 option_shuffled = 1 option_off = 2 @@ -475,10 +520,14 @@ class Music(Choice, LADXROption): class Warps(Choice): """ - [Improved] Adds remake style warp screen to the game. Choose your warp destination on the map after jumping in a portal and press B to select. - [Improved Additional] Improved warps, and adds a warp point at Crazy Tracy's house (the Mambo teleport spot) and Eagle's Tower. + **Improved:** Adds remake style warp screen to the game. Choose your warp + destination on the map after jumping in a portal and press *B* to select. + + **Improved Additional:** Improved warps, and adds a warp point at Crazy + Tracy's house (the Mambo teleport spot) and Eagle's Tower. """ display_name = "Warps" + rich_text_doc = True option_vanilla = 0 option_improved = 1 option_improved_additional = 2 @@ -487,19 +536,24 @@ class Warps(Choice): class InGameHints(DefaultOnToggle): """ - When enabled, owl statues and library books may indicate the location of your items in the multiworld. + When enabled, owl statues and library books may indicate the location of + your items in the multiworld. """ display_name = "In-game Hints" class TarinsGift(Choice): """ - [Local Progression] Forces Tarin's gift to be an item that immediately opens up local checks. - Has little effect in single player games, and isn't always necessary with randomized entrances. - [Bush Breaker] Forces Tarin's gift to be an item that can destroy bushes. - [Any Item] Tarin's gift can be any item for any world + **Local Progression:** Forces Tarin's gift to be an item that immediately + opens up local checks. Has little effect in single player games, and isn't + always necessary with randomized entrances. + + **Bush Breaker:** Forces Tarin's gift to be an item that can destroy bushes. + + **Any Item:** Tarin's gift can be any item for any world """ display_name = "Tarin's Gift" + rich_text_doc = True option_local_progression = 0 option_bush_breaker = 1 option_any_item = 2 @@ -508,67 +562,69 @@ class TarinsGift(Choice): class StabilizeItemPool(DefaultOffToggle): """ - By default, rupees in the item pool may be randomly swapped with bombs, arrows, powders, or capacity upgrades. This option disables that swapping, which is useful for plando. + By default, some rupees in the item pool are randomly swapped with bombs, + arrows, powders, or capacity upgrades. This set of items is also used as + filler. This option disables that swapping and makes *Nothing* the filler + item. """ display_name = "Stabilize Item Pool" + rich_text_doc = True class ForeignItemIcons(Choice): """ Choose how to display foreign items. - [Guess By Name] Foreign items can look like any Link's Awakening item. - [Indicate Progression] Foreign items are either a Piece of Power (progression) or Guardian Acorn (non-progression). + + **Guess By Name:** Foreign items can look like any Link's Awakening item. + + **Indicate Progression:** Foreign items are either a Piece of Power + (progression) or Guardian Acorn (non-progression). """ display_name = "Foreign Item Icons" + rich_text_doc = True option_guess_by_name = 0 option_indicate_progression = 1 default = option_guess_by_name ladx_option_groups = [ - OptionGroup("Goal Options", [ - Goal, - InstrumentCount, + OptionGroup("Gameplay Adjustments", [ + InGameHints, + TarinsGift, + HardMode, + TrendyGame, ]), - OptionGroup("Shuffles", [ + OptionGroup("World Layout", [ + Overworld, + Warps, + DungeonShuffle, + EntranceShuffle, + ]), + OptionGroup("Item Pool", [ ShuffleInstruments, ShuffleNightmareKeys, ShuffleSmallKeys, ShuffleMaps, ShuffleCompasses, - ShuffleStoneBeaks - ]), - OptionGroup("Warp Points", [ - Warps, - ]), - OptionGroup("Miscellaneous", [ + ShuffleStoneBeaks, TradeQuest, Rooster, - TarinsGift, - Overworld, - TrendyGame, - InGameHints, - NagMessages, StabilizeItemPool, + ]), + OptionGroup("Quality of Life & Aesthetic", [ + NagMessages, Quickswap, - HardMode, - BootsControls - ]), - OptionGroup("Experimental", [ - DungeonShuffle, - EntranceShuffle - ]), - OptionGroup("Visuals & Sound", [ + BootsControls, + ForeignItemIcons, + GfxMod, LinkPalette, Palette, - TextShuffle, - ForeignItemIcons, APTitleScreen, - GfxMod, + TextShuffle, + TextMode, Music, MusicChangeCondition, LowHpBeep, - TextMode, NoFlash, ]) ] @@ -576,24 +632,12 @@ ladx_option_groups = [ @dataclass class LinksAwakeningOptions(PerGameCommonOptions): logic: Logic - # 'heartpiece': DefaultOnToggle, # description='Includes heart pieces in the item pool'), - # 'seashells': DefaultOnToggle, # description='Randomizes the secret sea shells hiding in the ground/trees. (chest are always randomized)'), - # 'heartcontainers': DefaultOnToggle, # description='Includes boss heart container drops in the item pool'), - # 'instruments': DefaultOffToggle, # description='Instruments are placed on random locations, dungeon goal will just contain a random item.'), - tradequest: TradeQuest # description='Trade quest items are randomized, each NPC takes its normal trade quest item, but gives a random item'), - # 'witch': DefaultOnToggle, # description='Adds both the toadstool and the reward for giving the toadstool to the witch to the item pool'), - rooster: Rooster # description='Adds the rooster to the item pool. Without this option, the rooster spot is still a check giving an item. But you will never find the rooster. Any rooster spot is accessible without rooster by other means.'), - # 'boomerang': Boomerang, - # 'randomstartlocation': DefaultOffToggle, # 'Randomize where your starting house is located'), - experimental_dungeon_shuffle: DungeonShuffle # 'Randomizes the dungeon that each dungeon entrance leads to'), + tradequest: TradeQuest + rooster: Rooster + experimental_dungeon_shuffle: DungeonShuffle experimental_entrance_shuffle: EntranceShuffle - # 'bossshuffle': BossShuffle, - # 'minibossshuffle': BossShuffle, goal: Goal instrument_count: InstrumentCount - # 'itempool': ItemPool, - # 'bowwow': Bowwow, - # 'overworld': Overworld, link_palette: LinkPalette warps: Warps trendy_game: TrendyGame diff --git a/worlds/ladx/__init__.py b/worlds/ladx/__init__.py index f17b602e..58d6c168 100644 --- a/worlds/ladx/__init__.py +++ b/worlds/ladx/__init__.py @@ -71,7 +71,7 @@ class LinksAwakeningWebWorld(WebWorld): "setup/en", ["zig"] )] - theme = "dirt" + theme = "ocean" option_groups = ladx_option_groups options_presets: typing.Dict[str, typing.Dict[str, typing.Any]] = { "Keysanity": { From 50c9d056c9ab1097d658714176d5f835634661c7 Mon Sep 17 00:00:00 2001 From: Goblin God <37878138+esutley@users.noreply.github.com> Date: Tue, 30 Sep 2025 11:40:20 -0500 Subject: [PATCH 117/204] KH1: Fix a small error in option descriptions #5445 --- worlds/kh1/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index f64e927f..879ea4c3 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -257,7 +257,7 @@ class KeybladeStats(Choice): """ Determines whether Keyblade stats should be randomized. - Randomize: Randomly generates STR and MP bonuses for each keyblade between the defined minimums and maximums. + Randomize: Randomly generates stats for each keyblade between the defined minimums and maximums. Shuffle: Shuffles the stats of the vanilla keyblades amongst each other. From f26fcc0edab7c63f684104e46322e9732084e134 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Tue, 30 Sep 2025 12:47:17 -0400 Subject: [PATCH 118/204] LADX: use generic slot name for slots 101+ (#5208) * init * we already had the generic name, just use it * cap hints at 101 * nevermind, the name is just baked in here --- LinksAwakeningClient.py | 6 +++--- worlds/ladx/LADXR/generator.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index 14aaa415..293e782f 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -412,10 +412,10 @@ class LinksAwakeningClient(): status = (await self.gameboy.async_read_memory_safe(LAClientConstants.wLinkStatusBits))[0] item_id -= LABaseID - # The player name table only goes up to 100, so don't go past that + # The player name table only goes up to 101, so don't go past that # Even if it didn't, the remote player _index_ byte is just a byte, so 255 max - if from_player > 100: - from_player = 100 + if from_player > 101: + from_player = 101 next_index += 1 self.gameboy.write_memory(LAClientConstants.wLinkGiveItem, [ diff --git a/worlds/ladx/LADXR/generator.py b/worlds/ladx/LADXR/generator.py index 4ae31d58..f4023469 100644 --- a/worlds/ladx/LADXR/generator.py +++ b/worlds/ladx/LADXR/generator.py @@ -271,9 +271,9 @@ def generateRom(base_rom: bytes, args, patch_data: Dict): mw = None if spot.item_owner != spot.location_owner: mw = spot.item_owner - if mw > 100: + if mw > 101: # There are only 101 player name slots (99 + "The Server" + "another world"), so don't use more than that - mw = 100 + mw = 101 spot.patch(rom, spot.item, multiworld=mw) patches.enemies.changeBosses(rom, patch_data["world_setup"]["boss_mapping"]) patches.enemies.changeMiniBosses(rom, patch_data["world_setup"]["miniboss_mapping"]) From 0882c0fa9724f418636478341112c4bb829a01cc Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 30 Sep 2025 19:27:43 +0200 Subject: [PATCH 119/204] Core: only store persistent changes if there are changes (#5311) --- Utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Utils.py b/Utils.py index d8dab4fc..a14e737c 100644 --- a/Utils.py +++ b/Utils.py @@ -323,11 +323,13 @@ def get_options() -> Settings: return get_settings() -def persistent_store(category: str, key: str, value: typing.Any): - path = user_path("_persistent_storage.yaml") +def persistent_store(category: str, key: str, value: typing.Any, force_store: bool = False): storage = persistent_load() + if not force_store and category in storage and key in storage[category] and storage[category][key] == value: + return # no changes necessary category_dict = storage.setdefault(category, {}) category_dict[key] = value + path = user_path("_persistent_storage.yaml") with open(path, "wt") as f: f.write(dump(storage, Dumper=Dumper)) From e6fb7d9c6a08a5cf481b34e61f9a0c216c7cae0d Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Tue, 30 Sep 2025 20:23:33 +0200 Subject: [PATCH 120/204] Core: Add an "options" arg to setup_multiworld so that non-default options can be set in it #5414 --- test/general/__init__.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/test/general/__init__.py b/test/general/__init__.py index 92ffc77e..53f77a51 100644 --- a/test/general/__init__.py +++ b/test/general/__init__.py @@ -1,5 +1,5 @@ from argparse import Namespace -from typing import List, Optional, Tuple, Type, Union +from typing import Any, List, Optional, Tuple, Type from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region from worlds import network_data_package @@ -31,8 +31,8 @@ def setup_solo_multiworld( return setup_multiworld(world_type, steps, seed) -def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple[str, ...] = gen_steps, - seed: Optional[int] = None) -> MultiWorld: +def setup_multiworld(worlds: list[type[World]] | type[World], steps: tuple[str, ...] = gen_steps, + seed: int | None = None, options: dict[str, Any] | list[dict[str, Any]] = None) -> MultiWorld: """ Creates a multiworld with a player for each provided world type, allowing duplicates, setting default options, and calling the provided gen steps. @@ -40,20 +40,27 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple :param worlds: Type/s of worlds to generate a multiworld for :param steps: Gen steps that should be called before returning. Default calls through pre_fill :param seed: The seed to be used when creating this multiworld + :param options: Options to set on each world. If just one dict of options is passed, it will be used for all worlds. :return: The generated multiworld """ if not isinstance(worlds, list): worlds = [worlds] + + if options is None: + options = [{}] * len(worlds) + elif not isinstance(options, list): + options = [options] * len(worlds) + players = len(worlds) multiworld = MultiWorld(players) multiworld.game = {player: world_type.game for player, world_type in enumerate(worlds, 1)} multiworld.player_name = {player: f"Tester{player}" for player in multiworld.player_ids} multiworld.set_seed(seed) args = Namespace() - for player, world_type in enumerate(worlds, 1): + for player, (world_type, option_overrides) in enumerate(zip(worlds, options), 1): for key, option in world_type.options_dataclass.type_hints.items(): updated_options = getattr(args, key, {}) - updated_options[player] = option.from_any(option.default) + updated_options[player] = option.from_any(option_overrides.get(key, option.default)) setattr(args, key, updated_options) multiworld.set_options(args) multiworld.state = CollectionState(multiworld) From 6a63de2f0f5e46335c3a03712e24fb77e193c270 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Tue, 30 Sep 2025 15:39:41 -0400 Subject: [PATCH 121/204] TUNIC: Fuse and Bell Shuffle (#5420) * Making the fix better (thanks medic) * Make it actually return false if it gets to the backup lists and fails them * Fix stuff after merge * Add outlet regions, create new regions as needed for them * Put together part of decoupled and direction pairs * make direction pairs work * Make decoupled work * Make fixed shop work again * Fix a few minor bugs * Fix a few minor bugs * Fix plando * god i love programming * Reorder portal list * Update portal sorter for variable shops * Add missing parameter * Some cleanup of prints and functions * Fix typo * it's aliiiiiive * Make seed groups not sync decoupled * Add test with full-shop plando * Fix bug with vanilla portals * Handle plando connections and direction pair errors * Update plando checking for decoupled * Fix typo * Fix exception text to be shorter * Add some more comments * Add todo note * Remove unused safety thing * Remove extra plando connections definition in options * Make seed groups in decoupled with overlapping but not fully overlapped plando connections interact nicely without messing with what the entrances look like in the spoiler log * Fix weird edge case that is technically user error * Add note to fixed shop * Fix parsing shop names in UT * Remove debug print * Actually make UT work * multiworld. to world. * Fix typo from merge * Make it so the shops show up in the entrance hints * Fix bug in ladder storage rules * Remove blank line * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py # worlds/tunic/rules.py # worlds/tunic/test/test_access.py * Fix issues after merge * Update plando connections stuff in docs * Make early bushes only contain grass * Fix library mistake * Backport changes to grass rando (#20) * Backport changes to grass rando * add_rule instead of set_rule for the special cases, add special cases for back of swamp laurels area cause I should've made a new region for the swamp upper entrance * Remove item name group for grass * Update grass rando option descriptions - Also ignore grass fill for single player games * Ignore grass fill option for solo rando * Update er_rules.py * Fix pre fill issue * Remove duplicate option * Add excluded grass locations back * Hide grass fill option from simple ui options page * Check for start with sword before setting grass rules * Update worlds/tunic/options.py Co-authored-by: Scipio Wright * has_stick -> has_melee * has_stick -> has_melee * Add a failsafe for direction pairing * Fix playthrough crash bug * Remove init from logicmixin * Updates per code review (thanks hesto) * has_stick to has_melee in newer update * has_stick to has_melee in newer update * Exclude grass from get_filler_item_name - non-grass rando games were accidentally seeing grass items get shuffled in as filler, which is funny but probably shouldn't happen * Update worlds/tunic/__init__.py Co-authored-by: Scipio Wright * Apply suggestions from code review Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: Scipio Wright * change the rest of grass_fill to local_fill * Filter out grass from filler_items * remove -> discard * Update worlds/tunic/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Starting out * Rules for breakable regions * # Conflicts: # worlds/tunic/__init__.py # worlds/tunic/combat_logic.py # worlds/tunic/er_data.py # worlds/tunic/er_rules.py # worlds/tunic/er_scripts.py * Cleanup more stuff after merge * Revert "Cleanup more stuff after merge" This reverts commit a6ee9a93da8f2fcc4413de6df6927b246017889d. * Revert "# Conflicts:" This reverts commit c74ccd74a45b6ad6b9abe6e339d115a0c98baf30. * Cleanup more stuff after merge * change has_stick to has_melee * Update grass list with combat logic regions * More fixes from combat logic merge * Fix some dumb stuff (#21) * Reorganize pre fill for grass * make the rest of it work, it's pr ready, boom * Make it work in not pot shuffle * Merge grass rando * multiworld -> world get_location, use has_any * Swap out region for West Garden Before Terry grass * Adjust west garden rules to add west combat region * Adjust grass regions for south checkpoint grass * Adjust grass regions for after terry grass * Adjust grass regions for west combat grass * Adjust grass regions for dagger house grass * Adjust grass regions for south checkpoint grass, adjust regions and rules for some related locations * Finish the remainder of the west garden grass, reformat ruined atoll a little * More hex quest updates - Implement page ability shuffle for hex quest - Fix keys behind bosses if hex goal is less than 3 - Added check to fix conflicting hex quest options - Add option to slot data * Change option comparison * Change option checking and fix some stuff - also keep prayer first on low hex counts * Update option defaulting * Update option checking * Fix option assignment again * Merge in hex hunt * Merge in changes * Clean up imports * Add ability type to UT stuff * merge it all * Make local fill work across pot and grass (to be adjusted later) * Make separate pools for the grass and non-grass fills * Fix id overlap * Update option description * Fix default * Reorder localfill option desc * Load the purgatory ones in * Adjustments after merge * Fully remove logicrules * Fix UT support with fixed shop option * Add breakable shuffle to the ut stuff * Make it load in a specific number of locations * Add Silent's spoiler log ability thing * Fix for groups * Fix for groups * Fix typo * Fix hex quest UT support * Use .get * UT fixes, classification fixes * Rename some locations * Adjust guard house names * Adjust guard house names * Rework create_item * Fix for plando connections * Rename, add new breakables * Rename more stuff * Time to rename them again * Fix issue with fixed shop + decoupled * Put in an exception to catch that error in the future * Update create_item to match main * Update spoiler log lines for hex abilities * Burn the signs down * Bring over the combat logic fix * Merge in combat logic fix * Silly static method thing * Move a few areas to before well instead of east forest * Add an all_random hidden option for dev stuff * Port over changes from main * Fix west courtyard pot regions * Remove debug prints * Fix fortress courtyard and beneath the fortress loc groups again * Add exception handling to deal with duplicate apworlds * Fix typo * More missing loc group conversions * Initial fuse shuffle stuff * Fix gun missing from combat_items, add new for combat logic cache, very slight refactor of check_combat_reqs to let it do the changeover in a less complicated fashion, fix area being a boss area rather than non-boss area for a check * Add fuse shuffle logic * reorder atoll statue rule * Update traversal reqs * Remove fuse shuffle from temple door * Combine rules and option checking * Add bell shuffle; fix fuse location groups * Fix portal rules not requiring prayer * Merge the grass laurels exit grass PR * Merge in fortress bridge PR * Do a little clean up * Fix a regression * Update after merge * Some more stuff * More Silent changes * Update more info section in game info page * Fix rules for atoll and swamp fuses * Precollect cathedral fuse in ER * actually just make the fuse useful instead of progression * Add it to the swamp and cath rules too * Fix cath fuse name * Minor fixes and edits * Some UT stuff * Fix a couple more groups * Move a bunch of UT stuff to its own file * Fix up a couple UT things * Couple minor ER fixes * Formatting change * UT poptracker stuff enabled since it's optional in one of the releases * Add author string to world class * Adjust local fill option name * Update ut_stuff to match the PR * Add exception handling for UT with old apworld * Fix missing tracker_world * Remove extra entrance from cath main -> elevator Entry <-> Elev exists, Entry <-> Main exists So no connection is needed between Main and Elev * Fix so that decoupled doesn't incorrectly use get_portal_info and get_paired_portal * Fix so that decoupled doesn't incorrectly use get_portal_info and get_paired_portal * Update for breakables poptracker * Backup and warnings instead * Update typing * Delete old regions and rules, move stuff to logic_helpers and constants * Delete now much less useful tests * Fix breakables map tracking * Add more comments to init * Add todo to grass.py * Fix up tests * Fully remove fixed_shop * Finish hard deprecating FixedShop * Fix zig skip showing up in decoupled fixed shop * Make local_fill show up on the website * Merge with main * Fixes after merge * More fixes after merge * oh right that's why it was there, circular imports * Swap {} to () * Add fuse and bell shuffle to seed groups since they're logically significant for entrance pairing --------- Co-authored-by: silent-destroyer Co-authored-by: Silent <110704408+silent-destroyer@users.noreply.github.com> Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/tunic/__init__.py | 56 ++++++++---- worlds/tunic/bells.py | 39 ++++++++ worlds/tunic/er_data.py | 2 +- worlds/tunic/er_rules.py | 65 +++++++------- worlds/tunic/er_scripts.py | 16 ++-- worlds/tunic/fuses.py | 149 +++++++++++++++++++++++++------ worlds/tunic/items.py | 25 ++++++ worlds/tunic/locations.py | 8 +- worlds/tunic/logic_helpers.py | 41 +++++++-- worlds/tunic/options.py | 22 ++++- worlds/tunic/test/test_access.py | 2 +- worlds/tunic/ut_stuff.py | 4 +- 12 files changed, 325 insertions(+), 104 deletions(-) create mode 100644 worlds/tunic/bells.py diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 9fca0a7d..1d59eeae 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -7,13 +7,13 @@ from Options import PlandoConnection, OptionError, PerGameCommonOptions, Range, from settings import Group, Bool, FilePath from worlds.AutoWorld import WebWorld, World -# from .bells import bell_location_groups, bell_location_name_to_id +from .bells import bell_location_groups, bell_location_name_to_id from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table from .combat_logic import area_data, CombatState from .er_data import portal_mapping, RegionInfo, tunic_er_regions from .er_rules import set_er_location_rules from .er_scripts import create_er_regions, verify_plando_directions -# from .fuses import fuse_location_name_to_id, fuse_location_groups +from .fuses import fuse_location_name_to_id, fuse_location_groups from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations from .items import (item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names, combat_items) @@ -75,6 +75,8 @@ class SeedGroup(TypedDict): entrance_layout: int # entrance layout value has_decoupled_enabled: bool # for checking that players don't have conflicting options plando: list[PlandoConnection] # consolidated plando connections for the seed group + bell_shuffle: bool # off controls + fuse_shuffle: bool # off controls class TunicWorld(World): @@ -98,17 +100,17 @@ class TunicWorld(World): location_name_groups.setdefault(group_name, set()).update(members) for group_name, members in breakable_location_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) - # for group_name, members in fuse_location_groups.items(): - # location_name_groups.setdefault(group_name, set()).update(members) - # for group_name, members in bell_location_groups.items(): - # location_name_groups.setdefault(group_name, set()).update(members) + for group_name, members in fuse_location_groups.items(): + location_name_groups.setdefault(group_name, set()).update(members) + for group_name, members in bell_location_groups.items(): + location_name_groups.setdefault(group_name, set()).update(members) item_name_to_id = item_name_to_id location_name_to_id = standard_location_name_to_id.copy() location_name_to_id.update(grass_location_name_to_id) location_name_to_id.update(breakable_location_name_to_id) - # location_name_to_id.update(fuse_location_name_to_id) - # location_name_to_id.update(bell_location_name_to_id) + location_name_to_id.update(fuse_location_name_to_id) + location_name_to_id.update(bell_location_name_to_id) player_location_table: dict[str, int] ability_unlocks: dict[str, int] @@ -227,11 +229,11 @@ class TunicWorld(World): self.player_location_table.update({name: num for name, num in breakable_location_name_to_id.items() if not name.startswith("Purgatory")}) - # if self.options.shuffle_fuses: - # self.player_location_table.update(fuse_location_name_to_id) - # - # if self.options.shuffle_bells: - # self.player_location_table.update(bell_location_name_to_id) + if self.options.shuffle_fuses: + self.player_location_table.update(fuse_location_name_to_id) + + if self.options.shuffle_bells: + self.player_location_table.update(bell_location_name_to_id) @classmethod def stage_generate_early(cls, multiworld: MultiWorld) -> None: @@ -259,7 +261,9 @@ class TunicWorld(World): laurels_at_10_fairies=tunic.options.laurels_location == LaurelsLocation.option_10_fairies, entrance_layout=tunic.options.entrance_layout.value, has_decoupled_enabled=bool(tunic.options.decoupled), - plando=tunic.options.plando_connections.value.copy()) + plando=tunic.options.plando_connections.value.copy(), + bell_shuffle=bool(tunic.options.shuffle_bells), + fuse_shuffle=bool(tunic.options.shuffle_fuses)) continue # I feel that syncing this one is worse than erroring out if bool(tunic.options.decoupled) != cls.seed_groups[group]["has_decoupled_enabled"]: @@ -277,6 +281,12 @@ class TunicWorld(World): # laurels at 10 fairies changes logic for secret gathering place placement if tunic.options.laurels_location == 3: cls.seed_groups[group]["laurels_at_10_fairies"] = True + # off is more restrictive + if not tunic.options.shuffle_bells: + cls.seed_groups[group]["bell_shuffle"] = False + # off is more restrictive + if not tunic.options.shuffle_fuses: + cls.seed_groups[group]["fuse_shuffle"] = False # fixed shop and direction pairs override standard, but conflict with each other if tunic.options.entrance_layout: if cls.seed_groups[group]["entrance_layout"] == EntranceLayout.option_standard: @@ -428,6 +438,19 @@ class TunicWorld(World): ladder_count += 1 remove_filler(ladder_count) + if self.options.shuffle_fuses: + for item_name, item_data in item_table.items(): + if item_data.item_group == "Fuses": + if item_name == "Cathedral Elevator Fuse" and self.options.entrance_rando: + tunic_items.append(self.create_item(item_name, ItemClassification.useful)) + continue + items_to_create[item_name] = 1 + + if self.options.shuffle_bells: + for item_name, item_data in item_table.items(): + if item_data.item_group == "Bells": + items_to_create[item_name] = 1 + if self.options.hexagon_quest: # Replace pages and normal hexagons with filler for replaced_item in list(filter(lambda item: "Pages" in item or item in hexagon_locations, items_to_create)): @@ -480,7 +503,6 @@ class TunicWorld(World): # pull out the filler so that we can place it manually during pre_fill self.fill_items = [] if self.options.local_fill > 0 and self.multiworld.players > 1: - # skip items marked local or non-local, let fill deal with them in its own way all_filler: list[TunicItem] = [] non_filler: list[TunicItem] = [] for tunic_item in tunic_items: @@ -709,8 +731,8 @@ class TunicWorld(World): "entrance_rando": int(bool(self.options.entrance_rando.value)), "decoupled": self.options.decoupled.value if self.options.entrance_rando else 0, "shuffle_ladders": self.options.shuffle_ladders.value, - # "shuffle_fuses": self.options.shuffle_fuses.value, - # "shuffle_bells": self.options.shuffle_bells.value, + "shuffle_fuses": self.options.shuffle_fuses.value, + "shuffle_bells": self.options.shuffle_bells.value, "grass_randomizer": self.options.grass_randomizer.value, "combat_logic": self.options.combat_logic.value, "Hexagon Quest Prayer": self.ability_unlocks["Pages 24-25 (Prayer)"], diff --git a/worlds/tunic/bells.py b/worlds/tunic/bells.py new file mode 100644 index 00000000..2687d9bf --- /dev/null +++ b/worlds/tunic/bells.py @@ -0,0 +1,39 @@ +from typing import NamedTuple, TYPE_CHECKING + +from worlds.generic.Rules import set_rule + +from .constants import base_id +from .logic_helpers import has_melee + + +if TYPE_CHECKING: + from . import TunicWorld + + +class TunicLocationData(NamedTuple): + region: str + er_region: str + + +bell_location_table: dict[str, TunicLocationData] = { + "Forest Belltower - Ring the East Bell": TunicLocationData("Forest Belltower", "Forest Belltower Upper"), + "Overworld - [West] Ring the West Bell": TunicLocationData("Overworld", "Overworld Belltower at Bell"), +} + +bell_location_base_id = base_id + 11000 +bell_location_name_to_id: dict[str, int] = {name: bell_location_base_id + index + for index, name in enumerate(bell_location_table)} + +bell_location_groups: dict[str, set[str]] = {} +for location_name, location_data in bell_location_table.items(): + bell_location_groups.setdefault(location_data.region, set()).add(location_name) + bell_location_groups.setdefault("Bells", set()).add(location_name) + + +def set_bell_location_rules(world: "TunicWorld") -> None: + player = world.player + + set_rule(world.get_location("Forest Belltower - Ring the East Bell"), + lambda state: has_melee(state, player) or state.has("Magic Wand", player)) + set_rule(world.get_location("Overworld - [West] Ring the West Bell"), + lambda state: has_melee(state, player) or state.has("Magic Wand", player)) diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index cfa215a3..3641658a 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -735,7 +735,7 @@ tunic_er_regions: dict[str, RegionInfo] = { "Rooted Ziggurat Lower Entry": RegionInfo("ziggurat2020_3"), # the vanilla entry point side "Rooted Ziggurat Lower Front": RegionInfo("ziggurat2020_3"), # the front for combat logic "Rooted Ziggurat Lower Mid Checkpoint": RegionInfo("ziggurat2020_3"), # the mid-checkpoint before double admin - "Rooted Ziggurat Lower Miniboss Platform": RegionInfo("ziggurat2020_3"), # the double admin platform + "Rooted Ziggurat Lower Miniboss Platform": RegionInfo("ziggurat2020_3"), # the double admin platform "Rooted Ziggurat Lower Back": RegionInfo("ziggurat2020_3"), # the boss side "Zig Skip Exit": RegionInfo("ziggurat2020_3", dead_end=DeadEnd.special, outlet_region="Rooted Ziggurat Lower Entry", is_fake_region=True), # for use with fixed shop on "Rooted Ziggurat Portal Room Entrance": RegionInfo("ziggurat2020_3", outlet_region="Rooted Ziggurat Lower Back"), # the door itself on the zig 3 side diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 6d238693..ad26e10c 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -3,11 +3,11 @@ from typing import FrozenSet, TYPE_CHECKING from BaseClasses import Region from worlds.generic.Rules import set_rule, add_rule, forbid_item -# from .bells import set_bell_location_rules +from .bells import set_bell_location_rules from .combat_logic import has_combat_reqs from .constants import * from .er_data import Portal, get_portal_outlet_region -# from .fuses import set_fuse_location_rules, has_fuses +from .fuses import set_fuse_location_rules from .grass import set_grass_location_rules from .ladder_storage_data import ow_ladder_groups, region_ladders, easy_ls, medium_ls, hard_ls from .logic_helpers import (has_ability, has_ladder, has_melee, has_sword, has_lantern, has_mask, has_fuses, @@ -17,9 +17,6 @@ from .options import IceGrappling, LadderStorage, CombatLogic if TYPE_CHECKING: from . import TunicWorld -fuses_option = False # replace with options.shuffle_fuses when fuse shuffle is in -bells_option = False # replace with options.shuffle_bells when bell shuffle is in - def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_pairs: dict[Portal, Portal]) -> None: player = world.player @@ -334,8 +331,8 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ # nmg: ice grapple through temple door regions["Overworld"].connect( connecting_region=regions["Overworld Temple Door"], - rule=lambda state: (state.has_all(("Ring Eastern Bell", "Ring Western Bell"), player) and not bells_option) - or (state.has_all(("East Bell", "West Bell"), player) and bells_option) + rule=lambda state: (state.has_all(("Ring Eastern Bell", "Ring Western Bell"), player) and not options.shuffle_bells) + or (state.has_all(("East Bell", "West Bell"), player) and options.shuffle_bells) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) regions["Overworld Temple Door"].connect( @@ -671,9 +668,9 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ and (has_sword(state, player) or state.has_any((gun, fire_wand), player))) # shoot fuse and have the shot hit you mid-LS or (can_ladder_storage(state, world) and state.has(fire_wand, player) - and options.ladder_storage >= LadderStorage.option_hard))) and not fuses_option) + and options.ladder_storage >= LadderStorage.option_hard))) and not options.shuffle_fuses) or (state.has_all((atoll_northwest_fuse, atoll_northeast_fuse, atoll_southwest_fuse, atoll_southeast_fuse), player) - and fuses_option)) + and options.shuffle_fuses)) ) regions["Ruined Atoll Statue"].connect( @@ -804,12 +801,12 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ connecting_region=regions["Fortress Exterior from Overworld"], rule=lambda state: state.has(laurels, player) or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) - and fuses_option)) + and options.shuffle_fuses)) regions["Fortress Exterior from Overworld"].connect( connecting_region=regions["Fortress Exterior near cave"], rule=lambda state: state.has(laurels, player) or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) - if fuses_option else has_ability(prayer, state, world))) + if options.shuffle_fuses else has_ability(prayer, state, world))) # shoot far fire pot, enemy gets aggro'd regions["Fortress Exterior near cave"].connect( @@ -880,7 +877,7 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) or (has_fuses("Activate Eastern Vault West Fuses", state, world) and has_fuses("Activate Eastern Vault East Fuse", state, world) - and fuses_option)) + and options.shuffle_fuses)) fort_grave_entry_to_combat = regions["Fortress Grave Path Entry"].connect( connecting_region=regions["Fortress Grave Path Combat"]) @@ -1027,18 +1024,18 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"]) zig_low_miniboss_to_mid = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( connecting_region=regions["Rooted Ziggurat Lower Mid Checkpoint"], - rule=lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + rule=lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses else (has_sword(state, player) and has_ability(prayer, state, world))) # can ice grapple to the voidlings to get to the double admin fight, still need to pray at the fuse zig_low_miniboss_to_back = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( connecting_region=regions["Rooted Ziggurat Lower Back"], - rule=lambda state: state.has(laurels, player) or (state.has(ziggurat_miniboss_fuse, player) and fuses_option) - or (has_sword(state, player) and has_ability(prayer, state, world) and not fuses_option)) + rule=lambda state: state.has(laurels, player) or (state.has(ziggurat_miniboss_fuse, player) and options.shuffle_fuses) + or (has_sword(state, player) and has_ability(prayer, state, world) and not options.shuffle_fuses)) regions["Rooted Ziggurat Lower Back"].connect( connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"], rule=lambda state: state.has(laurels, player) or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) - or (state.has(ziggurat_miniboss_fuse, player) and fuses_option)) + or (state.has(ziggurat_miniboss_fuse, player) and options.shuffle_fuses)) regions["Rooted Ziggurat Lower Back"].connect( connecting_region=regions["Rooted Ziggurat Portal Room Entrance"], @@ -1086,8 +1083,8 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ and state.can_reach_region("Overworld Beach", player))))) and (not options.combat_logic or has_combat_reqs("Swamp", state, player)) - and not fuses_option) - or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and fuses_option) + and not options.shuffle_fuses) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and options.shuffle_fuses) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) if options.ladder_storage >= LadderStorage.option_hard and options.shuffle_ladders: @@ -1096,7 +1093,7 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ regions["Swamp to Cathedral Main Entrance Region"].connect( connecting_region=regions["Swamp Mid"], rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) - or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and fuses_option)) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and options.shuffle_fuses)) # grapple push the enemy by the door down, then grapple to it. Really jank regions["Swamp Mid"].connect( @@ -1142,7 +1139,7 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ cath_entry_to_elev = regions["Cathedral Entry"].connect( connecting_region=regions["Cathedral to Gauntlet"], - rule=lambda state: ((state.has(cathedral_elevator_fuse, player) if fuses_option else has_ability(prayer, state, world)) + rule=lambda state: ((state.has(cathedral_elevator_fuse, player) if options.shuffle_fuses else has_ability(prayer, state, world)) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) or options.entrance_rando) # elevator is always there in ER regions["Cathedral to Gauntlet"].connect( @@ -1444,17 +1441,17 @@ def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_ lambda state: has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(zig_low_miniboss_to_back, lambda state: state.has(laurels, player) - or (state.has(ziggurat_miniboss_fuse, player) if fuses_option + or (state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)))) set_rule(zig_low_miniboss_to_mid, - lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) # only activating the fuse requires combat logic set_rule(cath_entry_to_elev, lambda state: options.entrance_rando or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or (state.has(cathedral_elevator_fuse, player) if fuses_option + or (state.has(cathedral_elevator_fuse, player) if options.shuffle_fuses else (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player)))) set_rule(cath_entry_to_main, @@ -1535,11 +1532,11 @@ def set_er_location_rules(world: "TunicWorld") -> None: if options.grass_randomizer: set_grass_location_rules(world) - # if options.shuffle_fuses: - # set_fuse_location_rules(world) - # - # if options.shuffle_bells: - # set_bell_location_rules(world) + if options.shuffle_fuses: + set_fuse_location_rules(world) + + if options.shuffle_bells: + set_bell_location_rules(world) forbid_item(world.get_location("Secret Gathering Place - 20 Fairy Reward"), fairies, player) @@ -1702,7 +1699,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: and (state.has(laurels, player) or options.entrance_rando))) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses else has_sword(state, player) and has_ability(prayer, state, world)) # Bosses @@ -1745,12 +1742,12 @@ def set_er_location_rules(world: "TunicWorld") -> None: lambda state: state.has(laurels, player)) # Events - if not bells_option: + if not options.shuffle_bells: set_rule(world.get_location("Eastern Bell"), lambda state: (has_melee(state, player) or state.has(fire_wand, player))) set_rule(world.get_location("Western Bell"), lambda state: (has_melee(state, player) or state.has(fire_wand, player))) - if not fuses_option: + if not options.shuffle_fuses: set_rule(world.get_location("Furnace Fuse"), lambda state: has_ability(prayer, state, world)) set_rule(world.get_location("South and West Fortress Exterior Fuses"), @@ -1877,7 +1874,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: # could just do the last two, but this outputs better in the spoiler log # dagger is maybe viable here, but it's sketchy -- activate ladder switch, save to reset enemies, climb up - if not fuses_option: + if not options.shuffle_fuses: combat_logic_to_loc("Upper and Central Fortress Exterior Fuses", "Eastern Vault Fortress") combat_logic_to_loc("Beneath the Vault Fuse", "Beneath the Vault") combat_logic_to_loc("Eastern Vault West Fuses", "Eastern Vault Fortress") @@ -1896,10 +1893,10 @@ def set_er_location_rules(world: "TunicWorld") -> None: and (state.has(laurels, player) or world.options.entrance_rando)) or has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: state.has(ziggurat_miniboss_fuse, player) if fuses_option + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) - if fuses_option: + if options.shuffle_fuses: set_rule(world.get_location("Rooted Ziggurat Lower - [Miniboss] Activate Fuse"), lambda state: has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)) combat_logic_to_loc("Beneath the Fortress - Activate Fuse", "Beneath the Vault") diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index 81fb90d8..a1b8b2fe 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -113,13 +113,13 @@ def place_event_items(world: "TunicWorld", regions: dict[str, Region]) -> None: location.place_locked_item( TunicERItem("Unseal the Heir", ItemClassification.progression, None, world.player)) elif event_name.endswith("Bell"): - # if world.options.shuffle_bells: - # continue + if world.options.shuffle_bells: + continue location.place_locked_item( TunicERItem("Ring " + event_name, ItemClassification.progression, None, world.player)) elif event_name.endswith("Fuse") or event_name.endswith("Fuses"): - # if world.options.shuffle_fuses: - # continue + if world.options.shuffle_fuses: + continue location.place_locked_item( TunicERItem("Activate " + event_name, ItemClassification.progression, None, world.player)) region.locations.append(location) @@ -200,10 +200,8 @@ def pair_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal entrance_layout = world.options.entrance_layout laurels_location = world.options.laurels_location decoupled = world.options.decoupled - # shuffle_fuses = bool(world.options.shuffle_fuses.value) - # shuffle_bells = bool(world.options.shuffle_bells.value) - shuffle_fuses = False - shuffle_bells = False + shuffle_fuses = bool(world.options.shuffle_fuses.value) + shuffle_bells = bool(world.options.shuffle_bells.value) traversal_reqs = deepcopy(traversal_requirements) has_laurels = True waterfall_plando = False @@ -216,6 +214,8 @@ def pair_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal ladder_storage = seed_group["ladder_storage"] entrance_layout = seed_group["entrance_layout"] laurels_location = "10_fairies" if seed_group["laurels_at_10_fairies"] is True else False + shuffle_bells = seed_group["bell_shuffle"] + shuffle_fuses = seed_group["fuse_shuffle"] logic_tricks: tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) diff --git a/worlds/tunic/fuses.py b/worlds/tunic/fuses.py index 4f223582..566dffcb 100644 --- a/worlds/tunic/fuses.py +++ b/worlds/tunic/fuses.py @@ -1,30 +1,123 @@ -from .constants import * +from typing import NamedTuple, TYPE_CHECKING -# for fuse locations and reusing event names to simplify er_rules -fuse_activation_reqs: dict[str, list[str]] = { - swamp_fuse_2: [swamp_fuse_1], - swamp_fuse_3: [swamp_fuse_1, swamp_fuse_2], - fortress_exterior_fuse_2: [fortress_exterior_fuse_1], - beneath_the_vault_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2], - fortress_candles_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], - fortress_door_left_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, - fortress_candles_fuse], - fortress_courtyard_upper_fuse: [fortress_exterior_fuse_1], - fortress_courtyard_lower_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse], - fortress_door_right_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, fortress_courtyard_lower_fuse], - quarry_fuse_2: [quarry_fuse_1], - "Activate Furnace Fuse": [west_furnace_fuse], - "Activate South and West Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2], - "Activate Upper and Central Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, - fortress_courtyard_lower_fuse], - "Activate Beneath the Vault Fuse": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], - "Activate Eastern Vault West Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, - fortress_candles_fuse, fortress_door_left_fuse], - "Activate Eastern Vault East Fuse": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, - fortress_courtyard_lower_fuse, fortress_door_right_fuse], - "Activate Quarry Connector Fuse": [quarry_fuse_1], - "Activate Quarry Fuse": [quarry_fuse_1, quarry_fuse_2], - "Activate Ziggurat Fuse": [ziggurat_teleporter_fuse], - "Activate West Garden Fuse": [west_garden_fuse], - "Activate Library Fuse": [library_lab_fuse], +from BaseClasses import CollectionState +from worlds.generic.Rules import set_rule + +from .constants import * +from .logic_helpers import has_ability, has_sword, fuse_activation_reqs + +if TYPE_CHECKING: + from . import TunicWorld + + +class TunicLocationData(NamedTuple): + loc_group: str + er_region: str + + +fuse_location_table: dict[str, TunicLocationData] = { + "Overworld - [Southeast] Activate Fuse": TunicLocationData("Overworld", "Overworld"), + "Swamp - [Central] Activate Fuse": TunicLocationData("Swamp", "Swamp Mid"), + "Swamp - [Outside Cathedral] Activate Fuse": TunicLocationData("Swamp", "Swamp Mid"), + "Cathedral - Activate Fuse": TunicLocationData("Cathedral", "Cathedral Main"), + "West Furnace - Activate Fuse": TunicLocationData("West Furnace", "Furnace Fuse"), + "West Garden - [South Highlands] Activate Fuse": TunicLocationData("West Garden", "West Garden South Checkpoint"), + "Ruined Atoll - [Northwest] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Ruined Atoll - [Northeast] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Ruined Atoll - [Southeast] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll Ladder Tops"), + "Ruined Atoll - [Southwest] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Library Lab - Activate Fuse": TunicLocationData("Library Lab", "Library Lab"), + "Fortress Courtyard - [From Overworld] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Exterior from Overworld"), + "Fortress Courtyard - [Near Cave] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Exterior from Overworld"), + "Fortress Courtyard - [Upper] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Courtyard Upper"), + "Fortress Courtyard - [Central] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Courtyard"), + "Beneath the Fortress - Activate Fuse": TunicLocationData("Beneath the Fortress", "Beneath the Vault Back"), + "Eastern Vault Fortress - [Candle Room] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Eastern Vault Fortress - [Left of Door] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Eastern Vault Fortress - [Right of Door] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Quarry Entryway - Activate Fuse": TunicLocationData("Quarry Connector", "Quarry Connector"), + "Quarry - Activate Fuse": TunicLocationData("Quarry", "Quarry Entry"), + "Rooted Ziggurat Lower - [Miniboss] Activate Fuse": TunicLocationData("Rooted Ziggurat Lower", "Rooted Ziggurat Lower Miniboss Platform"), + "Rooted Ziggurat Lower - [Before Boss] Activate Fuse": TunicLocationData("Rooted Ziggurat Lower", "Rooted Ziggurat Lower Back"), } + +fuse_location_base_id = base_id + 10000 +fuse_location_name_to_id: dict[str, int] = {name: fuse_location_base_id + index + for index, name in enumerate(fuse_location_table)} + +fuse_location_groups: dict[str, set[str]] = {} +for location_name, location_data in fuse_location_table.items(): + fuse_location_groups.setdefault(location_data.loc_group, set()).add(location_name) + fuse_location_groups.setdefault("Fuses", set()).add(location_name) + + +# to be deduplicated in the big refactor +def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: + return not world.options.shuffle_ladders or state.has(ladder, world.player) + + +def set_fuse_location_rules(world: "TunicWorld") -> None: + player = world.player + + set_rule(world.get_location("Overworld - [Southeast] Activate Fuse"), + lambda state: state.has(laurels, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Swamp - [Central] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[swamp_fuse_2], player) + and has_ability(prayer, state, world) + and has_sword(state, player)) + set_rule(world.get_location("Swamp - [Outside Cathedral] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[swamp_fuse_3], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Cathedral - Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Furnace - Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Garden - [South Highlands] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Northwest] Activate Fuse"), + lambda state: state.has_any([grapple, laurels], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Northeast] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Southeast] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Southwest] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Library Lab - Activate Fuse"), + lambda state: has_ability(prayer, state, world) + and has_ladder("Ladders in Library", state, world)) + set_rule(world.get_location("Fortress Courtyard - [From Overworld] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Near Cave] Activate Fuse"), + lambda state: state.has(fortress_exterior_fuse_1, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Upper] Activate Fuse"), + lambda state: state.has(fortress_exterior_fuse_1, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Central] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_courtyard_lower_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Beneath the Fortress - Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[beneath_the_vault_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Candle Room] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_candles_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Left of Door] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_door_left_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Right of Door] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_door_right_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Quarry Entryway - Activate Fuse"), + lambda state: state.has(grapple, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Quarry - Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[quarry_fuse_2], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Rooted Ziggurat Lower - [Miniboss] Activate Fuse"), + lambda state: has_sword(state, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Rooted Ziggurat Lower - [Before Boss] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index fe1e33e9..e8f201b9 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -173,6 +173,31 @@ item_table: dict[str, TunicItemData] = { "Ladders in Lower Quarry": TunicItemData(IC.progression, 0, 149, "Ladders"), "Ladders in Swamp": TunicItemData(IC.progression, 0, 150, "Ladders"), "Grass": TunicItemData(IC.filler, 0, 151), + "Swamp Fuse 1": TunicItemData(IC.progression, 0, 157, "Fuses"), + "Swamp Fuse 2": TunicItemData(IC.progression, 0, 158, "Fuses"), + "Swamp Fuse 3": TunicItemData(IC.progression, 0, 159, "Fuses"), + "Cathedral Elevator Fuse": TunicItemData(IC.progression, 0, 160, "Fuses"), + "Quarry Fuse 1": TunicItemData(IC.progression, 0, 161, "Fuses"), + "Quarry Fuse 2": TunicItemData(IC.progression, 0, 162, "Fuses"), + "Ziggurat Miniboss Fuse": TunicItemData(IC.progression, 0, 163, "Fuses"), + "Ziggurat Teleporter Fuse": TunicItemData(IC.progression, 0, 164, "Fuses"), + "Fortress Exterior Fuse 1": TunicItemData(IC.progression, 0, 165, "Fuses"), + "Fortress Exterior Fuse 2": TunicItemData(IC.progression, 0, 166, "Fuses"), + "Fortress Courtyard Upper Fuse": TunicItemData(IC.progression, 0, 167, "Fuses"), + "Fortress Courtyard Fuse": TunicItemData(IC.progression, 0, 168, "Fuses"), + "Beneath the Vault Fuse": TunicItemData(IC.progression, 0, 169, "Fuses"), + "Fortress Candles Fuse": TunicItemData(IC.progression, 0, 170, "Fuses"), + "Fortress Door Left Fuse": TunicItemData(IC.progression, 0, 171, "Fuses"), + "Fortress Door Right Fuse": TunicItemData(IC.progression, 0, 172, "Fuses"), + "West Furnace Fuse": TunicItemData(IC.progression, 0, 173, "Fuses"), + "West Garden Fuse": TunicItemData(IC.progression, 0, 174, "Fuses"), + "Atoll Northeast Fuse": TunicItemData(IC.progression, 0, 175, "Fuses"), + "Atoll Northwest Fuse": TunicItemData(IC.progression, 0, 176, "Fuses"), + "Atoll Southeast Fuse": TunicItemData(IC.progression, 0, 177, "Fuses"), + "Atoll Southwest Fuse": TunicItemData(IC.progression, 0, 178, "Fuses"), + "Library Lab Fuse": TunicItemData(IC.progression, 0, 179, "Fuses"), + "East Bell": TunicItemData(IC.progression, 0, 180, "Bells"), + "West Bell": TunicItemData(IC.progression, 0, 181, "Bells") } # items to be replaced by fool traps diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index 93c6164b..dea2e603 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -1,9 +1,9 @@ from typing import NamedTuple -# from .bells import bell_location_table +from .bells import bell_location_table from .breakables import breakable_location_table from .constants import base_id -# from .fuses import fuse_location_table +from .fuses import fuse_location_table from .grass import grass_location_table @@ -329,8 +329,8 @@ standard_location_name_to_id: dict[str, int] = {name: base_id + index for index, all_locations = location_table.copy() all_locations.update(grass_location_table) all_locations.update(breakable_location_table) -# all_locations.update(fuse_location_table) -# all_locations.update(bell_location_table) +all_locations.update(fuse_location_table) +all_locations.update(bell_location_table) location_name_groups: dict[str, set[str]] = {} for loc_name, loc_data in location_table.items(): diff --git a/worlds/tunic/logic_helpers.py b/worlds/tunic/logic_helpers.py index 1752bf8e..7370c9ac 100644 --- a/worlds/tunic/logic_helpers.py +++ b/worlds/tunic/logic_helpers.py @@ -3,7 +3,6 @@ from typing import TYPE_CHECKING from BaseClasses import CollectionState from .constants import * -from .fuses import fuse_activation_reqs from .options import HexagonQuestAbilityUnlockType, IceGrappling if TYPE_CHECKING: @@ -89,10 +88,38 @@ def can_get_past_bushes(state: CollectionState, world: "TunicWorld") -> bool: return has_sword(state, world.player) or state.has_any((fire_wand, laurels, gun), world.player) -def has_fuses(fuse_event: str, state: CollectionState, world: "TunicWorld") -> bool: - player = world.player - fuses_option = False # replace fuses_option with world.options.shuffle_fuses when fuse shuffle is in - if fuses_option: - return state.has_all(fuse_activation_reqs[fuse_event], player) +# for fuse locations and reusing event names to simplify er_rules +fuse_activation_reqs: dict[str, list[str]] = { + swamp_fuse_2: [swamp_fuse_1], + swamp_fuse_3: [swamp_fuse_1, swamp_fuse_2], + fortress_exterior_fuse_2: [fortress_exterior_fuse_1], + beneath_the_vault_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + fortress_candles_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + fortress_door_left_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse], + fortress_courtyard_upper_fuse: [fortress_exterior_fuse_1], + fortress_courtyard_lower_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse], + fortress_door_right_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, fortress_courtyard_lower_fuse], + quarry_fuse_2: [quarry_fuse_1], + "Activate Furnace Fuse": [west_furnace_fuse], + "Activate South and West Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + "Activate Upper and Central Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse], + "Activate Beneath the Vault Fuse": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + "Activate Eastern Vault West Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse, fortress_door_left_fuse], + "Activate Eastern Vault East Fuse": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse, fortress_door_right_fuse], + "Activate Quarry Connector Fuse": [quarry_fuse_1], + "Activate Quarry Fuse": [quarry_fuse_1, quarry_fuse_2], + "Activate Ziggurat Fuse": [ziggurat_teleporter_fuse], + "Activate West Garden Fuse": [west_garden_fuse], + "Activate Library Fuse": [library_lab_fuse], +} - return state.has(fuse_event, player) + +def has_fuses(fuse_event: str, state: CollectionState, world: "TunicWorld") -> bool: + if world.options.shuffle_fuses: + return state.has_all(fuse_activation_reqs[fuse_event], world.player) + + return state.has(fuse_event, world.player) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index ef0130d0..f705979a 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -198,6 +198,24 @@ class ShuffleLadders(Toggle): display_name = "Shuffle Ladders" +class ShuffleFuses(Toggle): + """ + Praying at a fuse will reward a check instead of turning on the power. The power from each fuse gets turned into an + item that must be found in order to restore power for that part of the path. + """ + internal_name = "shuffle_fuses" + display_name = "Shuffle Fuses" + + +class ShuffleBells(Toggle): + """ + The East and West bells are shuffled into the item pool and must be found in order to unlock the Sealed Temple. + Ringing the bells will instead now reward a check. + """ + internal_name = "shuffle_bells" + display_name = "Shuffle Bells" + + class GrassRandomizer(Toggle): """ Turns over 6,000 blades of grass and bushes in the game into checks. @@ -357,8 +375,8 @@ class TunicOptions(PerGameCommonOptions): hexagon_quest_ability_type: HexagonQuestAbilityUnlockType shuffle_ladders: ShuffleLadders - # shuffle_fuses: ShuffleFuses - # shuffle_bells: ShuffleBells + shuffle_fuses: ShuffleFuses + shuffle_bells: ShuffleBells grass_randomizer: GrassRandomizer breakable_shuffle: BreakableShuffle local_fill: LocalFill diff --git a/worlds/tunic/test/test_access.py b/worlds/tunic/test/test_access.py index f5d429ac..6cafae17 100644 --- a/worlds/tunic/test/test_access.py +++ b/worlds/tunic/test/test_access.py @@ -2,7 +2,7 @@ from .. import options from .bases import TunicTestBase -class TestAccess(TunicTestBase): +class TestWells(TunicTestBase): options = {options.CombatLogic.internal_name: options.CombatLogic.option_off} # test that the wells function properly. Since fairies is written the same way, that should succeed too diff --git a/worlds/tunic/ut_stuff.py b/worlds/tunic/ut_stuff.py index 1192b30d..9096f037 100644 --- a/worlds/tunic/ut_stuff.py +++ b/worlds/tunic/ut_stuff.py @@ -25,8 +25,8 @@ def setup_options_from_slot_data(world: "TunicWorld") -> None: world.options.hexagon_quest_ability_type.value = world.passthrough.get("hexagon_quest_ability_type", 0) world.options.entrance_rando.value = world.passthrough["entrance_rando"] world.options.shuffle_ladders.value = world.passthrough["shuffle_ladders"] - # world.options.shuffle_fuses.value = world.passthrough.get("shuffle_fuses", 0) - # world.options.shuffle_bells.value = world.passthrough.get("shuffle_bells", 0) + world.options.shuffle_fuses.value = world.passthrough.get("shuffle_fuses", 0) + world.options.shuffle_bells.value = world.passthrough.get("shuffle_bells", 0) world.options.grass_randomizer.value = world.passthrough.get("grass_randomizer", 0) world.options.breakable_shuffle.value = world.passthrough.get("breakable_shuffle", 0) world.options.entrance_layout.value = EntranceLayout.option_standard From 76b0197462a6335a22f28ef61d3bc34693cf9a5c Mon Sep 17 00:00:00 2001 From: Phaneros <31861583+MatthewMarinets@users.noreply.github.com> Date: Tue, 30 Sep 2025 13:18:42 -0700 Subject: [PATCH 122/204] SC2: any_unit and item parent bugfixes (#5480) * sc2: Fixing a Reaver item being classified as a scout item * sc2: any_units now requires any AA in the first 5 units * Fixing Shoot the Messenger not requiring AA in a hard rule * Fixing any_unit zerg still allowing unupgraded mercs * sc2: Fixed an issue where terran was requiring zerg anti-air in any_units --- worlds/sc2/item/item_tables.py | 2 +- worlds/sc2/locations.py | 24 ++++-- worlds/sc2/rules.py | 135 ++++++++++++++++++--------------- 3 files changed, 93 insertions(+), 68 deletions(-) diff --git a/worlds/sc2/item/item_tables.py b/worlds/sc2/item/item_tables.py index 7fb198ea..d63b0048 100644 --- a/worlds/sc2/item/item_tables.py +++ b/worlds/sc2/item/item_tables.py @@ -1860,7 +1860,7 @@ item_table = { item_names.DARK_TEMPLAR_ARCHON_MERGE: ItemData(417 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), item_names.ASCENDANT_ARCHON_MERGE: ItemData(418 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 28, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.ASCENDANT), item_names.SCOUT_SUPPLY_EFFICIENCY: ItemData(419 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 29, SC2Race.PROTOSS, parent=item_names.SCOUT), - item_names.REAVER_BARGAIN_BIN_PRICES: ItemData(420 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_5, 0, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.REAVER_BARGAIN_BIN_PRICES: ItemData(420 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_5, 0, SC2Race.PROTOSS, parent=item_names.REAVER), # War Council diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py index 6b505d9c..34245d86 100644 --- a/worlds/sc2/locations.py +++ b/worlds/sc2/locations.py @@ -2535,6 +2535,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: lambda state: ( logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) ), + hard_rule=logic.zerg_any_anti_air, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER.mission_name, @@ -2569,6 +2570,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: lambda state: ( logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) ), + hard_rule=logic.zerg_any_anti_air, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER.mission_name, @@ -2610,6 +2612,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 510, LocationType.CHALLENGE, logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -2618,6 +2621,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 511, LocationType.CHALLENGE, logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -2626,6 +2630,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2HOTS_LOC_ID_OFFSET + 512, LocationType.CHALLENGE, logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10042,6 +10047,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: logic.terran_common_unit(state) and logic.terran_competent_anti_air(state) ), + hard_rule=logic.terran_any_anti_air, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, @@ -10079,6 +10085,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: logic.terran_common_unit(state) and logic.terran_competent_anti_air(state) ), + hard_rule=logic.terran_any_anti_air, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, @@ -10122,7 +10129,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6710, LocationType.CHALLENGE, lambda state: logic.terran_beats_protoss_deathball(state) - and logic.terran_common_unit(state), + and logic.terran_common_unit(state), flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10131,8 +10138,9 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6711, LocationType.CHALLENGE, lambda state: logic.terran_beats_protoss_deathball(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_common_unit(state), + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + hard_rule=logic.terran_any_anti_air, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10141,8 +10149,9 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6712, LocationType.CHALLENGE, lambda state: logic.terran_beats_protoss_deathball(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_common_unit(state), + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + hard_rule=logic.terran_any_anti_air, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10154,6 +10163,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: logic.protoss_common_unit(state) and logic.protoss_anti_armor_anti_air(state) ), + hard_rule=logic.protoss_any_anti_air_unit, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, @@ -10191,6 +10201,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: logic.protoss_common_unit(state) and logic.protoss_anti_armor_anti_air(state) ), + hard_rule=logic.protoss_any_anti_air_unit, ), make_location_data( SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, @@ -10238,6 +10249,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6810, LocationType.CHALLENGE, logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10246,6 +10258,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6811, LocationType.CHALLENGE, logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, flags=LocationFlag.BASEBUST, ), make_location_data( @@ -10254,6 +10267,7 @@ def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: SC2_RACESWAP_LOC_ID_OFFSET + 6812, LocationType.CHALLENGE, logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, flags=LocationFlag.BASEBUST, ), make_location_data( diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index 2a03d65d..2298c2ce 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -3367,65 +3367,74 @@ class SC2Logic: def has_terran_units(self, target: int) -> Callable[["CollectionState"], bool]: def _has_terran_units(state: CollectionState) -> bool: - return (state.count_from_list_unique(item_groups.terran_units + item_groups.terran_buildings, self.player) >= target) and ( - # Anything that can hit buildings - state.has_any(( - # Infantry - item_names.MARINE, - item_names.FIREBAT, - item_names.MARAUDER, - item_names.REAPER, - item_names.HERC, - item_names.DOMINION_TROOPER, - item_names.GHOST, - item_names.SPECTRE, - # Vehicles - item_names.HELLION, - item_names.VULTURE, - item_names.SIEGE_TANK, - item_names.WARHOUND, - item_names.GOLIATH, - item_names.DIAMONDBACK, - item_names.THOR, - item_names.PREDATOR, - item_names.CYCLONE, - # Ships - item_names.WRAITH, - item_names.VIKING, - item_names.BANSHEE, - item_names.RAVEN, - item_names.BATTLECRUISER, - # RG - item_names.SON_OF_KORHAL, - item_names.AEGIS_GUARD, - item_names.EMPERORS_SHADOW, - item_names.BULWARK_COMPANY, - item_names.SHOCK_DIVISION, - item_names.BLACKHAMMER, - item_names.SKY_FURY, - item_names.NIGHT_WOLF, - item_names.NIGHT_HAWK, - item_names.PRIDE_OF_AUGUSTRGRAD, - ), self.player) - or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) - or state.has_all((item_names.EMPERORS_GUARDIAN, item_names.LIBERATOR_RAID_ARTILLERY), self.player) - or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) - or state.has_all((item_names.WIDOW_MINE, item_names.WIDOW_MINE_DEMOLITION_PAYLOAD), self.player) - or ( + return ( + state.count_from_list_unique( + item_groups.terran_units + item_groups.terran_buildings, self.player + ) >= target + and ( + target < 5 + or self.terran_any_anti_air(state) + ) + and ( + # Anything that can hit buildings state.has_any(( - # Mercs with shortest initial cooldown (300s) - item_names.WAR_PIGS, - item_names.DEATH_HEADS, - item_names.HELS_ANGELS, - item_names.WINGED_NIGHTMARES, + # Infantry + item_names.MARINE, + item_names.FIREBAT, + item_names.MARAUDER, + item_names.REAPER, + item_names.HERC, + item_names.DOMINION_TROOPER, + item_names.GHOST, + item_names.SPECTRE, + # Vehicles + item_names.HELLION, + item_names.VULTURE, + item_names.SIEGE_TANK, + item_names.WARHOUND, + item_names.GOLIATH, + item_names.DIAMONDBACK, + item_names.THOR, + item_names.PREDATOR, + item_names.CYCLONE, + # Ships + item_names.WRAITH, + item_names.VIKING, + item_names.BANSHEE, + item_names.RAVEN, + item_names.BATTLECRUISER, + # RG + item_names.SON_OF_KORHAL, + item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, + item_names.BULWARK_COMPANY, + item_names.SHOCK_DIVISION, + item_names.BLACKHAMMER, + item_names.SKY_FURY, + item_names.NIGHT_WOLF, + item_names.NIGHT_HAWK, + item_names.PRIDE_OF_AUGUSTRGRAD, ), self.player) - # + 2 upgrades that allow getting faster/earlier mercs - and state.count_from_list(( - item_names.RAPID_REINFORCEMENT, - item_names.PROGRESSIVE_FAST_DELIVERY, - item_names.ROGUE_FORCES, - # item_names.SIGNAL_BEACON, # Probably doesn't help too much on the first unit - ), self.player) >= 2 + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.EMPERORS_GUARDIAN, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or state.has_all((item_names.WIDOW_MINE, item_names.WIDOW_MINE_DEMOLITION_PAYLOAD), self.player) + or ( + state.has_any(( + # Mercs with shortest initial cooldown (300s) + item_names.WAR_PIGS, + item_names.DEATH_HEADS, + item_names.HELS_ANGELS, + item_names.WINGED_NIGHTMARES, + ), self.player) + # + 2 upgrades that allow getting faster/earlier mercs + and state.count_from_list(( + item_names.RAPID_REINFORCEMENT, + item_names.PROGRESSIVE_FAST_DELIVERY, + item_names.ROGUE_FORCES, + # item_names.SIGNAL_BEACON, # Probably doesn't help too much on the first unit + ), self.player) >= 2 + ) ) ) @@ -3451,6 +3460,10 @@ class SC2Logic: ) return ( num_units >= target + and ( + target < 5 + or self.zerg_any_anti_air(state) + ) and ( # Anything that can hit buildings state.has_any(( @@ -3468,11 +3481,6 @@ class SC2Logic: item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, item_names.INFESTED_BANSHEE, - # Mercs with <= 300s first drop time - item_names.DEVOURING_ONES, - item_names.HUNTER_KILLERS, - item_names.CAUSTIC_HORRORS, - item_names.HUNTERLING, ), self.player) or state.has_all((item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN), self.player) or self.morph_baneling(state) @@ -3512,6 +3520,9 @@ class SC2Logic: return ( state.count_from_list_unique(item_groups.protoss_units + item_groups.protoss_buildings + [item_names.NEXUS_OVERCHARGE], self.player) >= target + ) and ( + target < 5 + or self.protoss_any_anti_air_unit(state) ) and ( # Anything that can hit buildings state.has_any(( From 4893ac3e512a0ea28741e6619eb49d28525ab36f Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Wed, 1 Oct 2025 02:40:30 +0200 Subject: [PATCH 123/204] SC2: Fix Terran global upgrades present even if no Terran build missions are rolled (#5452) * Fix Terran global upgrades present even if no Terran build missions are rolled * Code cleanup --- worlds/sc2/__init__.py | 9 ++-- worlds/sc2/test/test_usecases.py | 74 ++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 984c716e..9bf2f791 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -468,7 +468,8 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte for item in item_list: # Catch-all for all of a faction's items - if not terran_missions and item.data.race == SC2Race.TERRAN: + # Unit upgrades required for no-builds will get the FilterExcluded lifted when flagging AllowedOrphan + if not terran_build_missions and item.data.race == SC2Race.TERRAN: if item.name not in item_groups.nova_equipment: item.flags |= ItemFilterFlags.FilterExcluded continue @@ -483,10 +484,6 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte continue # Faction units - if (not terran_build_missions - and item.data.type in (item_tables.TerranItemType.Unit, item_tables.TerranItemType.Building, item_tables.TerranItemType.Mercenary) - ): - item.flags |= ItemFilterFlags.FilterExcluded if (not zerg_build_missions and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit) ): @@ -661,6 +658,7 @@ def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> N item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM, ): item.flags |= ItemFilterFlags.AllowedOrphan + item.flags &= ~ItemFilterFlags.FilterExcluded # These rules only trigger on Standard tactics if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard: for item in item_list: @@ -670,6 +668,7 @@ def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> N item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING, item_names.FIREBAT_PROGRESSIVE_STIMPACK ): item.flags |= ItemFilterFlags.AllowedOrphan + item.flags &= ~ItemFilterFlags.FilterExcluded if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard: for item in item_list: if item.name in (item_names.STALKER_PHASE_REACTOR, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION): diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index 7f3ac70f..bf79dbea 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -6,9 +6,14 @@ from .test_base import Sc2SetupTestBase from .. import get_all_missions, mission_tables, options from ..item import item_groups, item_tables, item_names from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag -from ..options import EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns, \ - ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech, \ - GrantStoryLevels +from ..options import ( + EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns, + ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech, + GrantStoryLevels, BasebustLocations, ChallengeLocations, DifficultyCurve, EnableMorphling, ExcludeOverpoweredItems, + ExcludeVeryHardMissions, ExtraLocations, GenericUpgradeItems, GenericUpgradeResearch, GenericUpgradeResearchSpeedup, + KerriganPrimalStatus, KeyMode, MissionOrderScouting, EnableMissionRaceBalancing, + NovaGhostOfAChanceVariant, PreventativeLocations, SpeedrunLocations, TakeOverAIAllies, VanillaItemsOnly +) class TestSupportedUseCases(Sc2SetupTestBase): @@ -500,6 +505,69 @@ class TestSupportedUseCases(Sc2SetupTestBase): self.assertTupleEqual(terran_nonmerc_units, ()) self.assertTupleEqual(zerg_nonmerc_units, ()) + def test_zerg_hots_no_terran_items(self) -> None: + # The actual situation the bug got caught + world_options = { + 'basebust_locations': BasebustLocations.option_enabled, + 'challenge_locations': ChallengeLocations.option_enabled, + 'difficulty_curve': DifficultyCurve.option_standard, + 'enable_morphling': EnableMorphling.option_false, + 'enable_race_swap': EnableRaceSwapVariants.option_disabled, + 'enabled_campaigns': [SC2Campaign.HOTS.campaign_name], + 'ensure_generic_items': 25, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'exclude_very_hard_missions': ExcludeVeryHardMissions.option_default, + 'excluded_missions': [ + SC2Mission.SUPREME.mission_name + ], + 'extra_locations': ExtraLocations.option_enabled, + 'generic_upgrade_items': GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 0, + 'generic_upgrade_research': GenericUpgradeResearch.option_auto_in_no_build, + 'generic_upgrade_research_speedup': GenericUpgradeResearchSpeedup.option_false, + 'grant_story_levels': GrantStoryLevels.option_disabled, + 'grant_story_tech': GrantStoryTech.option_no_grant, + 'kerrigan_level_item_distribution': KerriganLevelItemDistribution.option_size_14, + 'kerrigan_level_item_sum': 86, + 'kerrigan_levels_per_mission_completed': 0, + 'kerrigan_levels_per_mission_completed_cap': -1, + 'kerrigan_max_active_abilities': 12, + 'kerrigan_max_passive_abilities': 5, + 'kerrigan_presence': KerriganPresence.option_vanilla, + 'kerrigan_primal_status': KerriganPrimalStatus.option_vanilla, + 'kerrigan_total_level_cap': -1, + 'key_mode': KeyMode.option_progressive_questlines, + 'mastery_locations': MasteryLocations.option_disabled, + 'max_number_of_upgrades': -1, + 'max_upgrade_level': 4, + 'maximum_campaign_size': 40, + 'min_number_of_upgrades': 2, + 'mission_order': MissionOrder.option_mini_campaign, + 'mission_order_scouting': MissionOrderScouting.option_none, + 'mission_race_balancing': EnableMissionRaceBalancing.option_semi_balanced, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_wol, + 'preventative_locations': PreventativeLocations.option_enabled, + 'required_tactics': RequiredTactics.option_standard, + 'shuffle_campaigns': ShuffleCampaigns.option_true, + 'shuffle_no_build': ShuffleNoBuild.option_true, + 'speedrun_locations': SpeedrunLocations.option_disabled, + 'start_primary_abilities': 0, + 'starter_unit': StarterUnit.option_balanced, + 'starting_supply_per_item': 2, + 'take_over_ai_allies': TakeOverAIAllies.option_false, + 'vanilla_items_only': VanillaItemsOnly.option_false, + 'victory_cache': 0, + } + self.generate_world(world_options) + + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.COMMAND_CENTER_SCANNER_SWEEP, world_item_names) + self.assertNotIn(item_names.COMMAND_CENTER_EXTRA_SUPPLIES, world_item_names) + self.assertNotIn(item_names.ULTRA_CAPACITORS, world_item_names) + self.assertNotIn(item_names.ORBITAL_DEPOTS, world_item_names) + self.assertNotIn(item_names.DOMINION_TROOPER, world_item_names) + def test_all_kerrigan_missions_are_nobuild_and_grant_story_tech_is_on(self) -> None: # The actual situation the bug got caught world_options = { From 33b485c0c3021175de6958042e821ab72ee92cb8 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 30 Sep 2025 19:47:08 -0500 Subject: [PATCH 124/204] Core: expose world version to world classes and yaml (#5484) * support version on new manifest * apply world version from manifest * Update Generate.py * docs * reduce mm2 version again * wrong version * validate game in world_types * Update Generate.py * let unknown game fall through to later exception * hide real world version behind property * named tuple is immutable * write minimum world version to template yaml, fix gen edge cases * punctuation * check for world version in autoworldregister * missed one --------- Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- Generate.py | 17 ++++++++++++++- Main.py | 4 +++- Options.py | 7 ++++-- data/options.yaml | 4 ++++ worlds/AutoWorld.py | 8 ++++++- worlds/__init__.py | 24 ++++++++++++++++++++- worlds/generic/docs/advanced_settings_en.md | 9 +++++--- worlds/mm2/__init__.py | 1 - worlds/mm2/archipelago.json | 5 +++++ 9 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 worlds/mm2/archipelago.json diff --git a/Generate.py b/Generate.py index 5d65a688..8e813203 100644 --- a/Generate.py +++ b/Generate.py @@ -486,7 +486,22 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b if required_plando_options: raise Exception(f"Settings reports required plando module {str(required_plando_options)}, " f"which is not enabled.") - + games = requirements.get("game", {}) + for game, version in games.items(): + if game not in AutoWorldRegister.world_types: + continue + if not version: + raise Exception(f"Invalid version for game {game}: {version}.") + if isinstance(version, str): + version = {"min": version} + if "min" in version and tuplize_version(version["min"]) > AutoWorldRegister.world_types[game].world_version: + raise Exception(f"Settings reports required version of world \"{game}\" is at least {version['min']}, " + f"however world is of version " + f"{AutoWorldRegister.world_types[game].world_version.as_simple_string()}.") + if "max" in version and tuplize_version(version["max"]) < AutoWorldRegister.world_types[game].world_version: + raise Exception(f"Settings reports required version of world \"{game}\" is no later than {version['max']}, " + f"however world is of version " + f"{AutoWorldRegister.world_types[game].world_version.as_simple_string()}.") ret = argparse.Namespace() for option_key in Options.PerGameCommonOptions.type_hints: if option_key in weights and option_key not in Options.CommonOptions.type_hints: diff --git a/Main.py b/Main.py index 6d81ff23..d872a3c1 100644 --- a/Main.py +++ b/Main.py @@ -59,7 +59,9 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None) for name, cls in AutoWorld.AutoWorldRegister.world_types.items(): if not cls.hidden and len(cls.item_names) > 0: - logger.info(f" {name:{longest_name}}: Items: {len(cls.item_names):{item_count}} | " + logger.info(f" {name:{longest_name}}: " + f"v{cls.world_version.as_simple_string()} |" + f"Items: {len(cls.item_names):{item_count}} | " f"Locations: {len(cls.location_names):{location_count}}") del item_count, location_count diff --git a/Options.py b/Options.py index dc1e8c90..282f7576 100644 --- a/Options.py +++ b/Options.py @@ -1710,7 +1710,7 @@ def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], ge from jinja2 import Template from worlds import AutoWorldRegister - from Utils import local_path, __version__ + from Utils import local_path, __version__, tuplize_version full_path: str @@ -1753,7 +1753,10 @@ def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], ge res = template.render( option_groups=option_groups, - __version__=__version__, game=game_name, yaml_dump=yaml_dump_scalar, + __version__=__version__, + game=game_name, + world_version=world.world_version.as_simple_string(), + yaml_dump=yaml_dump_scalar, dictify_range=dictify_range, cleandoc=cleandoc, ) diff --git a/data/options.yaml b/data/options.yaml index f2621124..3278a3c5 100644 --- a/data/options.yaml +++ b/data/options.yaml @@ -33,6 +33,10 @@ description: {{ yaml_dump("Default %s Template" % game) }} game: {{ yaml_dump(game) }} requires: version: {{ __version__ }} # Version of Archipelago required for this yaml to work as expected. + {%- if world_version != "0.0.0" %} + game: + {{ yaml_dump(game) }}: {{ world_version }} # Version of the world required for this yaml to work as expected. + {%- endif %} {%- macro range_option(option) %} # You can define additional values between the minimum and maximum values. diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 676171b7..1805b11a 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -12,7 +12,7 @@ from typing import (Any, Callable, ClassVar, Dict, FrozenSet, Iterable, List, Ma from Options import item_and_loc_options, ItemsAccessibility, OptionGroup, PerGameCommonOptions from BaseClasses import CollectionState -from Utils import deprecate +from Utils import Version if TYPE_CHECKING: from BaseClasses import MultiWorld, Item, Location, Tutorial, Region, Entrance @@ -75,6 +75,10 @@ class AutoWorldRegister(type): if "required_client_version" in base.__dict__: dct["required_client_version"] = max(dct["required_client_version"], base.__dict__["required_client_version"]) + if "world_version" in dct: + if dct["world_version"] != Version(0, 0, 0): + raise RuntimeError(f"{name} is attempting to set 'world_version' from within the class. world_version " + f"can only be set from manifest.") # construct class new_class = super().__new__(mcs, name, bases, dct) @@ -337,6 +341,8 @@ class World(metaclass=AutoWorldRegister): """If loaded from a .apworld, this is the Path to it.""" __file__: ClassVar[str] """path it was loaded from""" + world_version: ClassVar[Version] = Version(0, 0, 0) + """Optional world version loaded from archipelago.json""" def __init__(self, multiworld: "MultiWorld", player: int): assert multiworld is not None diff --git a/worlds/__init__.py b/worlds/__init__.py index c363d7f2..b9ef225f 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -7,10 +7,11 @@ import warnings import zipimport import time import dataclasses +import json from typing import List from NetUtils import DataPackage -from Utils import local_path, user_path, Version, version_tuple +from Utils import local_path, user_path, Version, version_tuple, tuplize_version local_folder = os.path.dirname(__file__) user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds") @@ -111,8 +112,25 @@ for world_source in world_sources: else: world_source.load() + from .AutoWorld import AutoWorldRegister +for world_source in world_sources: + if not world_source.is_zip: + # look for manifest + manifest = {} + for dirpath, dirnames, filenames in os.walk(world_source.resolved_path): + for file in filenames: + if file.endswith("archipelago.json"): + manifest = json.load(open(os.path.join(dirpath, file), "r")) + break + if manifest: + break + game = manifest.get("game") + if game in AutoWorldRegister.world_types: + AutoWorldRegister.world_types[game].world_version = Version(*tuplize_version(manifest.get("world_version", + "0.0.0"))) + if apworlds: # encapsulation for namespace / gc purposes def load_apworlds() -> None: @@ -164,6 +182,10 @@ if apworlds: add_as_failed_to_load=False) else: apworld_source.load() + if apworld.game in AutoWorldRegister.world_types: + # world could fail to load at this point + if apworld.world_version: + AutoWorldRegister.world_types[apworld.game].world_version = apworld.world_version load_apworlds() del load_apworlds diff --git a/worlds/generic/docs/advanced_settings_en.md b/worlds/generic/docs/advanced_settings_en.md index 25943076..bc8754b9 100644 --- a/worlds/generic/docs/advanced_settings_en.md +++ b/worlds/generic/docs/advanced_settings_en.md @@ -81,7 +81,8 @@ are `description`, `name`, `game`, `requires`, and the name of the games you wan * `requires` details different requirements from the generator for the YAML to work as you expect it to. Generally this is good for detailing the version of Archipelago this YAML was prepared for. If it is rolled on an older version, options may be missing and as such it will not work as expected. If any plando is used in the file then requiring it - here to ensure it will be used is good practice. + here to ensure it will be used is good practice. Specific versions of custom worlds can also be required, ensuring + that the generator is using a compatible version. ## Game Options @@ -165,7 +166,9 @@ game: A Link to the Past: 10 Timespinner: 10 requires: - version: 0.4.1 + version: 0.6.4 + game: + A Link to the Past: 0.6.4 A Link to the Past: accessibility: minimal progression_balancing: 50 @@ -229,7 +232,7 @@ Timespinner: * `name` is `Example Player` and this will be used in the server console when sending and receiving items. * `game` has an equal chance of being either `A Link to the Past` or `Timespinner` with a 10/20 chance for each. This is because each game has a weight of 10 and the total of all weights is 20. -* `requires` is set to required release version 0.3.2 or higher. +* `requires` is set to require Archipelago release version 0.6.4 or higher, as well as A Link to the Past version 0.6.4. * `accessibility` for both games is set to `minimal` which will set this seed to beatable only, so some locations and items may be completely inaccessible but the seed will still be completable. * `progression_balancing` for both games is set to 50, the default value, meaning we will likely receive important items diff --git a/worlds/mm2/__init__.py b/worlds/mm2/__init__.py index 529810d4..5389fc8a 100644 --- a/worlds/mm2/__init__.py +++ b/worlds/mm2/__init__.py @@ -96,7 +96,6 @@ class MM2World(World): location_name_groups = location_groups web = MM2WebWorld() rom_name: bytearray - world_version: Tuple[int, int, int] = (0, 3, 2) wily_5_weapons: Dict[int, List[int]] def __init__(self, multiworld: MultiWorld, player: int): diff --git a/worlds/mm2/archipelago.json b/worlds/mm2/archipelago.json new file mode 100644 index 00000000..75c098fd --- /dev/null +++ b/worlds/mm2/archipelago.json @@ -0,0 +1,5 @@ +{ + "game": "Mega Man 2", + "world_version": "0.3.2", + "minimum_ap_version": "0.6.4" +} From b162095f89139d71e703a0d535645b2fb2a32cd7 Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 1 Oct 2025 14:54:41 -0500 Subject: [PATCH 125/204] Launcher: Rework apworld install popup #5508 --- worlds/LauncherComponents.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index b2187298..58c724ac 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -5,7 +5,7 @@ import weakref from enum import Enum, auto from typing import Optional, Callable, List, Iterable, Tuple -from Utils import local_path, open_filename, is_frozen +from Utils import local_path, open_filename, is_frozen, is_kivy_running class Type(Enum): @@ -177,10 +177,9 @@ def _install_apworld(apworld_src: str = "") -> Optional[Tuple[pathlib.Path, path if module_name == loaded_name: found_already_loaded = True break - if found_already_loaded: - raise Exception(f"Installed APWorld successfully, but '{module_name}' is already loaded,\n" - "so a Launcher restart is required to use the new installation.\n" - "If the Launcher is not open, no action needs to be taken.") + if found_already_loaded and is_kivy_running(): + raise Exception(f"Installed APWorld successfully, but '{module_name}' is already loaded, " + "so a Launcher restart is required to use the new installation.") world_source = worlds.WorldSource(str(target), is_zip=True) bisect.insort(worlds.world_sources, world_source) world_source.load() @@ -197,7 +196,7 @@ def install_apworld(apworld_path: str = "") -> None: source, target = res except Exception as e: import Utils - Utils.messagebox(e.__class__.__name__, str(e), error=True) + Utils.messagebox("Notice", str(e), error=True) logging.exception(e) else: import Utils From 50f6cf04f691d4dd70737bac47221a093387ba50 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 2 Oct 2025 02:36:33 -0500 Subject: [PATCH 126/204] Core: "Build APWorlds" cleanup (#5507) * allow filtered build, subprocess * component description * correct name * move back to running directly --- worlds/LauncherComponents.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 58c724ac..5d50cdef 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -244,17 +244,32 @@ icon_paths = { } if not is_frozen(): - def _build_apworlds(): + def _build_apworlds(*launch_args: str): import json import os import zipfile from worlds import AutoWorldRegister from worlds.Files import APWorldContainer + from Launcher import open_folder + + import argparse + parser = argparse.ArgumentParser("Build script for APWorlds") + parser.add_argument("worlds", type=str, default=(), nargs="*", help="Names of APWorlds to build.") + args = parser.parse_args(launch_args) + + if args.worlds: + games = [(game, AutoWorldRegister.world_types.get(game, None)) for game in args.worlds] + else: + games = [(worldname, worldtype) for worldname, worldtype in AutoWorldRegister.world_types.items() + if not worldtype.zip_path] apworlds_folder = os.path.join("build", "apworlds") os.makedirs(apworlds_folder, exist_ok=True) - for worldname, worldtype in AutoWorldRegister.world_types.items(): + for worldname, worldtype in games: + if not worldtype: + logging.error(f"Requested APWorld \"{worldname}\" does not exist.") + continue file_name = os.path.split(os.path.dirname(worldtype.__file__))[1] world_directory = os.path.join("worlds", file_name) if os.path.isfile(os.path.join(world_directory, "archipelago.json")): @@ -269,12 +284,15 @@ if not is_frozen(): apworld.manifest_path = f"{file_name}/archipelago.json" with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED, compresslevel=9) as zf: - for path in pathlib.Path(world_directory).rglob("*.*"): + for path in pathlib.Path(world_directory).rglob("*"): relative_path = os.path.join(*path.parts[path.parts.index("worlds") + 1:]) if "__MACOSX" in relative_path or ".DS_STORE" in relative_path or "__pycache__" in relative_path: continue if not relative_path.endswith("archipelago.json"): zf.write(path, relative_path) zf.writestr(apworld.manifest_path, json.dumps(manifest)) + open_folder(apworlds_folder) - components.append(Component('Build apworlds', func=_build_apworlds, cli=True,)) + + components.append(Component('Build APWorlds', func=_build_apworlds, cli=True, + description="Build APWorlds from loose-file world folders.")) From 6d7abb3780e48677c28b648fdc1e84dd9676d878 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 2 Oct 2025 18:56:11 -0500 Subject: [PATCH 127/204] Webhost: Ignore Invalid Worlds in Webhost (#5433) * filter world types at top of webhost so worlds that aren't loadable in webhost are "uninstalled" * mark invalid worlds, show error if any, then filter to exclude them --- WebHost.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/WebHost.py b/WebHost.py index fd8daeb3..db465be6 100644 --- a/WebHost.py +++ b/WebHost.py @@ -109,6 +109,13 @@ if __name__ == "__main__": logging.exception(e) logging.warning("Could not update LttP sprites.") app = get_app() + from worlds import AutoWorldRegister + # Update to only valid WebHost worlds + invalid_worlds = {name for name, world in AutoWorldRegister.world_types.items() + if not hasattr(world.web, "tutorials")} + if invalid_worlds: + logging.error(f"Following worlds not loaded as they are invalid for WebHost: {invalid_worlds}") + AutoWorldRegister.world_types = {k: v for k, v in AutoWorldRegister.world_types.items() if k not in invalid_worlds} create_options_files() copy_tutorials_files_to_static() if app.config["SELFLAUNCH"]: From 83cfb803a79cc9538c518459541dbb0294c31baa Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Thu, 2 Oct 2025 17:05:29 -0700 Subject: [PATCH 128/204] SMZ3: Fix forced fill behaviors (GT junk fill, initial Super/PB front fill) (#5361) * SMZ3: Make GT fill behave like upstream SMZ3 multiworld GT fill This means: All items local, 50% guaranteed filler, followed by possible useful items, never progression. * Fix item links * SMZ3: Ensure in all cases, we remove the right item from the pool Previously front fill would cause erratic errors on frozen, with the cause immediately revealed by, on source, tripping the assert that was added in #5109 * SMZ3: Truly, *properly* fix GT junk fill After hours of diving deep into the upstream SMZ3 randomizer, it finally behaves identically to how it does there --- worlds/smz3/TotalSMZ3/Item.py | 2 - .../TotalSMZ3/Regions/Zelda/GanonsTower.py | 6 +- worlds/smz3/__init__.py | 61 +++++++++---------- 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/worlds/smz3/TotalSMZ3/Item.py b/worlds/smz3/TotalSMZ3/Item.py index 28e9658c..7e6a1186 100644 --- a/worlds/smz3/TotalSMZ3/Item.py +++ b/worlds/smz3/TotalSMZ3/Item.py @@ -424,7 +424,6 @@ class Item: ] for item in itemPool: - item.Progression = True item.World = world return itemPool @@ -439,7 +438,6 @@ class Item: ] for item in itemPool: - item.Progression = True item.World = world return itemPool diff --git a/worlds/smz3/TotalSMZ3/Regions/Zelda/GanonsTower.py b/worlds/smz3/TotalSMZ3/Regions/Zelda/GanonsTower.py index e17d7072..7cd17887 100644 --- a/worlds/smz3/TotalSMZ3/Regions/Zelda/GanonsTower.py +++ b/worlds/smz3/TotalSMZ3/Regions/Zelda/GanonsTower.py @@ -145,8 +145,12 @@ class GanonsTower(Z3Region): def CanFill(self, item: Item): if (self.Config.Multiworld): + # changed for AP becuase upstream only uses CanFill for filling progression-related items + # note that item.Progression does not include all items with progression classification # item.World will be None for item created by create_item for item links - if (item.World is not None and (item.World != self.world or item.Progression)): + if (item.World is not None and item.World != self.world and (item.Progression or item.IsDungeonItem() or item.IsKeycard() or item.IsSmMap())): + return False + if (item.World is not None and item.World == self.world and item.Progression): return False if (self.Config.Keysanity and not ((item.Type == ItemType.BigKeyGT or item.Type == ItemType.KeyGT) and item.World == self.world) and (item.IsKey() or item.IsBigKey() or item.IsKeycard())): return False diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py index 4d0b63f3..c4a1f313 100644 --- a/worlds/smz3/__init__.py +++ b/worlds/smz3/__init__.py @@ -260,13 +260,19 @@ class SMZ3World(World): l.always_allow = lambda state, item, loc=loc: \ item.game == "SMZ3" and \ loc.alwaysAllow(item.item, state.smz3state[self.player]) - old_rule = l.item_rule - l.item_rule = lambda item, loc=loc, region=region: (\ + l.item_rule = lambda item, loc=loc, region=region, old_rule=l.item_rule: (\ item.game != "SMZ3" or \ loc.allow(item.item, None) and \ region.CanFill(item.item)) and old_rule(item) set_rule(l, lambda state, loc=loc: loc.Available(state.smz3state[self.player])) + # In multiworlds, GT is disallowed from having progression items. + # This item rule replicates this behavior for non-SMZ3 games + for loc in self.smz3World.GetRegion("Ganon's Tower").Locations: + l = self.locations[loc.Name] + l.item_rule = lambda item, old_rule=l.item_rule: \ + (item.game == "SMZ3" or not item.advancement) and old_rule(item) + def create_regions(self): self.create_locations(self.player) startRegion = self.create_region(self.multiworld, self.player, 'Menu') @@ -589,29 +595,18 @@ class SMZ3World(World): ])) def JunkFillGT(self, factor): - poolLength = len(self.multiworld.itempool) - junkPoolIdx = [i for i in range(0, poolLength) - if self.multiworld.itempool[i].classification in (ItemClassification.filler, ItemClassification.trap)] + junkPoolIdx = [idx for idx, i in enumerate(self.multiworld.itempool) if i.excludable] + self.random.shuffle(junkPoolIdx) + junkLocations = [loc for loc in self.locations.values() if loc.name in self.locationNamesGT and loc.item is None] + self.random.shuffle(junkLocations) toRemove = [] - for loc in self.locations.values(): - # commenting this for now since doing a partial GT pre fill would allow for non SMZ3 progression in GT - # which isnt desirable (SMZ3 logic only filters for SMZ3 items). Having progression in GT can only happen in Single Player. - # if len(toRemove) >= int(len(self.locationNamesGT) * factor * self.smz3World.TowerCrystals / 7): - # break - if loc.name in self.locationNamesGT and loc.item is None: - poolLength = len(junkPoolIdx) - # start looking at a random starting index and loop at start if no match found - start = self.multiworld.random.randint(0, poolLength) - itemFromPool = None - for off in range(0, poolLength): - i = (start + off) % poolLength - candidate = self.multiworld.itempool[junkPoolIdx[i]] - if junkPoolIdx[i] not in toRemove and loc.can_fill(self.multiworld.state, candidate, False): - itemFromPool = candidate - toRemove.append(junkPoolIdx[i]) - break - assert itemFromPool is not None, "Can't find anymore item(s) to pre fill GT" - self.multiworld.push_item(loc, itemFromPool, False) + for loc in junkLocations: + # Note: Upstream GT junk fill uses FastFill, which ignores item rules + if len(junkPoolIdx) == 0 or len(toRemove) >= int(len(junkLocations) * factor * self.smz3World.TowerCrystals / 7): + break + itemFromPool = self.multiworld.itempool[junkPoolIdx[0]] + toRemove.append(junkPoolIdx.pop(0)) + loc.place_locked_item(itemFromPool) toRemove.sort(reverse = True) for i in toRemove: self.multiworld.itempool.pop(i) @@ -622,15 +617,15 @@ class SMZ3World(World): raise Exception(f"Tried to place item {itemType} at {location.Name}, but there is no such item in the item pool") else: location.Item = itemToPlace - itemFromPool = next((i for i in self.multiworld.itempool if i.player == self.player and i.name == itemToPlace.Type.name), None) - if itemFromPool is not None: + itemPoolIdx = next((idx for idx, i in enumerate(self.multiworld.itempool) if i.player == self.player and i.name == itemToPlace.Type.name), None) + if itemPoolIdx is not None: + itemFromPool = self.multiworld.itempool.pop(itemPoolIdx) self.multiworld.get_location(location.Name, self.player).place_locked_item(itemFromPool) - self.multiworld.itempool.remove(itemFromPool) else: - itemFromPool = next((i for i in self.smz3DungeonItems if i.player == self.player and i.name == itemToPlace.Type.name), None) - if itemFromPool is not None: + itemPoolIdx = next((idx for idx, i in enumerate(self.smz3DungeonItems) if i.player == self.player and i.name == itemToPlace.Type.name), None) + if itemPoolIdx is not None: + itemFromPool = self.smz3DungeonItems.pop(itemPoolIdx) self.multiworld.get_location(location.Name, self.player).place_locked_item(itemFromPool) - self.smz3DungeonItems.remove(itemFromPool) itemPool.remove(itemToPlace) def FrontFillItemInOwnWorld(self, itemPool, itemType): @@ -640,10 +635,10 @@ class SMZ3World(World): raise Exception(f"Tried to front fill {item.Name} in, but no location was available") location.Item = item - itemFromPool = next((i for i in self.multiworld.itempool if i.player == self.player and i.name == item.Type.name and i.advancement == item.Progression), None) - if itemFromPool is not None: + itemPoolIdx = next((idx for idx, i in enumerate(self.multiworld.itempool) if i.player == self.player and i.name == item.Type.name and i.advancement == item.Progression), None) + if itemPoolIdx is not None: + itemFromPool = self.multiworld.itempool.pop(itemPoolIdx) self.multiworld.get_location(location.Name, self.player).place_locked_item(itemFromPool) - self.multiworld.itempool.remove(itemFromPool) itemPool.remove(item) def InitialFillInOwnWorld(self): From 6a08064a520fb4a1a1f9d83fe0280c22e8c3d95b Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 4 Oct 2025 03:04:23 +0200 Subject: [PATCH 129/204] Core: Assert that if an apworld manifest file exists, it has a game field (#5478) * Assert that if an apworld manifest file exists, it has a game field * god damnit * Update worlds/LauncherComponents.py Co-authored-by: Fabian Dill * Update setup.py Co-authored-by: Fabian Dill --------- Co-authored-by: Fabian Dill --- setup.py | 9 +++++++++ worlds/LauncherComponents.py | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/setup.py b/setup.py index 98b9dd60..0233c247 100644 --- a/setup.py +++ b/setup.py @@ -383,6 +383,15 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): world_directory = self.libfolder / "worlds" / file_name if os.path.isfile(world_directory / "archipelago.json"): manifest = json.load(open(world_directory / "archipelago.json")) + + assert "game" in manifest, ( + f"World directory {world_directory} has an archipelago.json manifest file, but it" + "does not define a \"game\"." + ) + assert manifest["game"] == worldtype.game, ( + f"World directory {world_directory} has an archipelago.json manifest file, but value of the" + f"\"game\" field ({manifest['game']} does not equal the World class's game ({worldtype.game})." + ) else: manifest = {} # this method creates an apworld that cannot be moved to a different OS or minor python version, diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 5d50cdef..527208cc 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -274,6 +274,15 @@ if not is_frozen(): world_directory = os.path.join("worlds", file_name) if os.path.isfile(os.path.join(world_directory, "archipelago.json")): manifest = json.load(open(os.path.join(world_directory, "archipelago.json"))) + + assert "game" in manifest, ( + f"World directory {world_directory} has an archipelago.json manifest file, but it" + "does not define a \"game\"." + ) + assert manifest["game"] == worldtype.game, ( + f"World directory {world_directory} has an archipelago.json manifest file, but value of the" + f"\"game\" field ({manifest['game']} does not equal the World class's game ({worldtype.game})." + ) else: manifest = {} From 91e97b68d402e595459c72c2202b8816a4a49e04 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 5 Oct 2025 01:49:56 +0000 Subject: [PATCH 130/204] Webhost: eagerly free resources in customserver (#5512) * Unref some locals that would live long for no reason. * Limit scope of db_session in init_save. --- WebHostLib/customserver.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/WebHostLib/customserver.py b/WebHostLib/customserver.py index 156c1252..45aca124 100644 --- a/WebHostLib/customserver.py +++ b/WebHostLib/customserver.py @@ -97,6 +97,7 @@ class WebHostContext(Context): self.main_loop.call_soon_threadsafe(cmdprocessor, command.commandtext) command.delete() commit() + del commands time.sleep(5) @db_session @@ -146,13 +147,13 @@ class WebHostContext(Context): self.location_name_groups = static_location_name_groups return self._load(multidata, game_data_packages, True) - @db_session def init_save(self, enabled: bool = True): self.saving = enabled if self.saving: - savegame_data = Room.get(id=self.room_id).multisave - if savegame_data: - self.set_save(restricted_loads(Room.get(id=self.room_id).multisave)) + with db_session: + savegame_data = Room.get(id=self.room_id).multisave + if savegame_data: + self.set_save(restricted_loads(Room.get(id=self.room_id).multisave)) self._start_async_saving(atexit_save=False) threading.Thread(target=self.listen_to_db_commands, daemon=True).start() @@ -304,6 +305,7 @@ def run_server_process(name: str, ponyconfig: dict, static_server_data: dict, with db_session: room = Room.get(id=ctx.room_id) room.last_port = port + del room else: ctx.logger.exception("Could not determine port. Likely hosting failure.") with db_session: @@ -322,6 +324,7 @@ def run_server_process(name: str, ponyconfig: dict, static_server_data: dict, with db_session: room = Room.get(id=room_id) room.last_port = -1 + del room logger.exception(e) raise else: @@ -333,11 +336,12 @@ def run_server_process(name: str, ponyconfig: dict, static_server_data: dict, ctx.save_dirty = False # make sure the saving thread does not write to DB after final wakeup ctx.exit_event.set() # make sure the saving thread stops at some point # NOTE: async saving should probably be an async task and could be merged with shutdown_task - with (db_session): + with db_session: # ensure the Room does not spin up again on its own, minute of safety buffer room = Room.get(id=room_id) room.last_activity = datetime.datetime.utcnow() - \ datetime.timedelta(minutes=1, seconds=room.timeout) + del room logging.info(f"Shutting down room {room_id} on {name}.") finally: await asyncio.sleep(5) From ae4426af08fda82b01be11e4f62c2ef1cb4da46a Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 4 Oct 2025 20:46:26 -0600 Subject: [PATCH 131/204] Core: Pad version string in world printout #5511 --- Main.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Main.py b/Main.py index d872a3c1..892baa8d 100644 --- a/Main.py +++ b/Main.py @@ -54,13 +54,16 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None) logger.info(f"Found {len(AutoWorld.AutoWorldRegister.world_types)} World Types:") longest_name = max(len(text) for text in AutoWorld.AutoWorldRegister.world_types) - item_count = len(str(max(len(cls.item_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) - location_count = len(str(max(len(cls.location_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) + world_classes = AutoWorld.AutoWorldRegister.world_types.values() + + version_count = max(len(cls.world_version.as_simple_string()) for cls in world_classes) + item_count = len(str(max(len(cls.item_names) for cls in world_classes))) + location_count = len(str(max(len(cls.location_names) for cls in world_classes))) for name, cls in AutoWorld.AutoWorldRegister.world_types.items(): if not cls.hidden and len(cls.item_names) > 0: logger.info(f" {name:{longest_name}}: " - f"v{cls.world_version.as_simple_string()} |" + f"v{cls.world_version.as_simple_string():{version_count}} | " f"Items: {len(cls.item_names):{item_count}} | " f"Locations: {len(cls.location_names):{location_count}}") From 7a652518a328e5ba57a60162855d6e5870f92428 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sat, 4 Oct 2025 22:59:52 -0400 Subject: [PATCH 132/204] [Website docs] Update wording of "adding a game to archipelago" section --- WebHostLib/static/assets/faq/en.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WebHostLib/static/assets/faq/en.md b/WebHostLib/static/assets/faq/en.md index 96e52661..58875006 100644 --- a/WebHostLib/static/assets/faq/en.md +++ b/WebHostLib/static/assets/faq/en.md @@ -66,7 +66,7 @@ is to ensure items necessary to complete the game will be accessible to the play rules allowing certain items to be placed in normally unreachable locations, provided the player has indicated they are comfortable exploiting certain glitches in the game. -## I want to add a game to the Archipelago randomizer. How do I do that? +## I want to develop a game implementation for Archipelago. How do I do that? The best way to get started is to take a look at our code on GitHub: [Archipelago GitHub Page](https://github.com/ArchipelagoMW/Archipelago). @@ -77,4 +77,5 @@ There, you will find examples of games in the `worlds` folder: You may also find developer documentation in the `docs` folder: [/docs Folder in Archipelago Code](https://github.com/ArchipelagoMW/Archipelago/tree/main/docs). -If you have more questions, feel free to ask in the **#ap-world-dev** channel on our Discord. +If you have more questions regarding development of a game implementation, feel free to ask in the **#ap-world-dev** +channel on our Discord. From 7996fd8d19930734aec17e86b349e6a47d424352 Mon Sep 17 00:00:00 2001 From: PinkSwitch <52474902+PinkSwitch@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:01:56 -0500 Subject: [PATCH 133/204] Core: Update start inventory description to mention item quantities (#5460) * SNIClient: new SnesReader interface * fix Python 3.8 compatibility `bisect_right` * move to worlds because we don't have good separation importable modules and entry points * `read` gives object that contains data * remove python 3.10 implementation and update typing * remove obsolete comment * freeze _MemRead and assert type of get parameter * some optimization in `SnesData.get` * pass context to `read` so that we can have a static instance of `SnesReader` * add docstring to `SnesReader` * remove unused import * break big reads into chunks * some minor improvements - `dataclass` instead of `NamedTuple` for `Read` - comprehension in `SnesData.__init__` - `slots` for dataclasses * Change descriptions * Fix sni client? --------- Co-authored-by: beauxq Co-authored-by: Doug Hoskisson --- Options.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Options.py b/Options.py index 282f7576..c0c04952 100644 --- a/Options.py +++ b/Options.py @@ -1380,7 +1380,7 @@ class NonLocalItems(ItemSet): class StartInventory(ItemDict): - """Start with these items.""" + """Start with the specified amount of these items. Example: "Bomb: 1" """ verify_item_name = True display_name = "Start Inventory" rich_text_doc = True @@ -1388,7 +1388,7 @@ class StartInventory(ItemDict): class StartInventoryPool(StartInventory): - """Start with these items and don't place them in the world. + """Start with the specified amount of these items and don't place them in the world. Example: "Bomb: 1" The game decides what the replacement items will be. """ From a547c8dd7d9ad66501410ca3f77df72634a9cc77 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:02:26 -0600 Subject: [PATCH 134/204] Core: Add location count field for world to spoiler log (#5440) * Add location count * Only count non-events * Add total count --- BaseClasses.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BaseClasses.py b/BaseClasses.py index 855efc60..3e6904ba 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1858,6 +1858,9 @@ class Spoiler: Utils.__version__, self.multiworld.seed)) outfile.write('Filling Algorithm: %s\n' % self.multiworld.algorithm) outfile.write('Players: %d\n' % self.multiworld.players) + if self.multiworld.players > 1: + loc_count = len([loc for loc in self.multiworld.get_locations() if not loc.is_event]) + outfile.write('Total Location Count: %d\n' % loc_count) outfile.write(f'Plando Options: {self.multiworld.plando_options}\n') AutoWorld.call_stage(self.multiworld, "write_spoiler_header", outfile) @@ -1866,6 +1869,9 @@ class Spoiler: outfile.write('\nPlayer %d: %s\n' % (player, self.multiworld.get_player_name(player))) outfile.write('Game: %s\n' % self.multiworld.game[player]) + loc_count = len([loc for loc in self.multiworld.get_locations(player) if not loc.is_event]) + outfile.write('Location Count: %d\n' % loc_count) + for f_option, option in self.multiworld.worlds[player].options_dataclass.type_hints.items(): write_option(f_option, option) From ec9145e61d97e8e482c5b048352fcd9d0f90ab25 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:04:02 -0600 Subject: [PATCH 135/204] Region: Use Mapping type for adding locations/exits #5354 --- BaseClasses.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 3e6904ba..ee2f73ca 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1346,8 +1346,7 @@ class Region: for entrance in self.entrances: # BFS might be better here, trying DFS for now. return entrance.parent_region.get_connecting_entrance(is_main_entrance) - def add_locations(self, locations: Dict[str, Optional[int]], - location_type: Optional[type[Location]] = None) -> None: + def add_locations(self, locations: Mapping[str, int | None], location_type: type[Location] | None = None) -> None: """ Adds locations to the Region object, where location_type is your Location class and locations is a dict of location names to address. @@ -1435,8 +1434,8 @@ class Region: entrance.connect(self) return entrance - def add_exits(self, exits: Union[Iterable[str], Dict[str, Optional[str]]], - rules: Dict[str, Callable[[CollectionState], bool]] = None) -> List[Entrance]: + def add_exits(self, exits: Iterable[str] | Mapping[str, str | None], + rules: Mapping[str, Callable[[CollectionState], bool]] | None = None) -> List[Entrance]: """ Connects current region to regions in exit dictionary. Passed region names must exist first. @@ -1444,7 +1443,7 @@ class Region: created entrances will be named "self.name -> connecting_region" :param rules: rules for the exits from this region. format is {"connecting_region": rule} """ - if not isinstance(exits, Dict): + if not isinstance(exits, Mapping): exits = dict.fromkeys(exits) return [ self.connect( From bdef410eb2d12bcbc7562cbd37fa5b6c2e54a1db Mon Sep 17 00:00:00 2001 From: DJ-lennart Date: Sun, 5 Oct 2025 05:07:11 +0200 Subject: [PATCH 136/204] Civilization VI: Update for the setup instructions #5286 --- worlds/civ_6/docs/setup_en.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md index fb840419..c34a4540 100644 --- a/worlds/civ_6/docs/setup_en.md +++ b/worlds/civ_6/docs/setup_en.md @@ -14,25 +14,27 @@ The following are required in order to play Civ VI in Archipelago: - A copy of the game `Civilization VI` including the two expansions `Rise & Fall` and `Gathering Storm` (both the Steam and Epic version should work). -## Enabling the tuner - -In the main menu, navigate to the "Game Options" page. On the "Game" menu, make sure that "Tuner (disables achievements)" is enabled. - ## Mod Installation 1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). 2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. If you use OneDrive, check if the folder is instead located in your OneDrive file structure, and use that path when relevant in future steps. -3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. Associate the file with the Archipelago Launcher and double click it. +3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. You can open it as a zip file, you can do this by either right clicking it and opening it with a program that handles zip files (if you associate that file with the program it will open it with that program in the future by double clicking it), or by right clicking and renaming the file extension from `apcivvi` to `zip` (only works if you are displaying file extensions). You can also associate the file with the Archipelago Launcher and double click it and it will create a folder with the mod files inside of it. -4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. If double clicking the `.apcivvi` file doesn't generate a folder, you can instead open it as a zip file. You can do this by either right clicking it and opening it with a program that handles zip files, or by right clicking and renaming the file extension from `apcivvi` to `zip`. +4. Copy the contents of the zip file or folder it generated (the name of the folder should be the same as the apcivvi file) into your Civilization VI Archipelago Mod folder (there should be five files placed there from the `.apcivvi` file, overwrite if asked). -5. Place the files generated from the `.apcivvi` in your archipelago mod folder (there should be five files placed there from the apcivvi file, overwrite if asked). Your mod path should look something like `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods\civilization_archipelago_mod`. +5. Your mod path should look something like `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods\civilization_archipelago_mod`. If everything was done correctly you can now connect to the game. -## Configuring your game +## Connecting to a game -Make sure you enable the mod in the main title under Additional Content > Mods. When configuring your game, make sure to start the game in the Ancient Era and leave all settings related to starting technologies and civics as the defaults. Other than that, configure difficulty, AI, etc. as you normally would. +1. In the main menu, navigate to the "Game Options" page. On the "Game" menu, make sure that "Tuner (disables achievements)" is enabled. + +2. In the main menu, navigate to the "Additional Content" page, then go to "Mods" and make sure the Archipelago mod is enabled. + +3. When starting the game make sure you are on the Gathering Storm ruleset in a Single Player game. Additionally you must start in the ancient era, other settings and game modes can be customised to your own liking. An important thing to note is that settings preset saves the mod list from when you created it, so if you want to use a setting preset with this you must create it after installing the Archipelago mod. + +4. To connect to the room open the Archipelago Launcher, from within the launcher open the Civ6 client and connect to the room. Once connected to the room enter your slot name and if everything went right you should now be connected. ## Troubleshooting @@ -51,3 +53,8 @@ Make sure you enable the mod in the main title under Additional Content > Mods. - If you still have any errors make sure the two expansions Rise & Fall and Gathering Storm are active in the mod selector (all the official DLC works without issues but Rise & Fall and Gathering Storm are required for the mod). - If boostsanity is enabled and those items are not being sent out but regular techs are, make sure you placed the files from your new room in the mod folder. + +- If you are neither receiving or sending items, make sure you have the correct client open. The client should be the Civ6 and NOT the Text Client. + +- This should be compatible with a lot of other mods, but if you are having issues try disabling all mods other than the Archipelago mod and see if the problem still persists. + From 1cbc5d66492fb60a47c93170f75880f6528a9a39 Mon Sep 17 00:00:00 2001 From: Branden Wood <44546325+BrandenEK@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:08:15 -0400 Subject: [PATCH 137/204] Short Hike: improve setup guide docs #5470 --- worlds/shorthike/docs/setup_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/shorthike/docs/setup_en.md b/worlds/shorthike/docs/setup_en.md index 96e4d8db..066a9cf3 100644 --- a/worlds/shorthike/docs/setup_en.md +++ b/worlds/shorthike/docs/setup_en.md @@ -13,8 +13,8 @@ ## Installation -Open the [Randomizer Repository](https://github.com/BrandenEK/AShortHike.Randomizer) and follow -the installation instructions listed there. +1. Read the [Randomizer readme](https://github.com/BrandenEK/AShortHike.Randomizer) to see all required dependencies +1. Read the [Mod Installer readme](https://github.com/BrandenEK/AShortHike.Modding.Installer) to see how to download the required mods ## Connecting From 3eb25a59dcfd959ef9f1b6a8c787624fefe7a465 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sat, 4 Oct 2025 23:08:34 -0400 Subject: [PATCH 138/204] Aquaria: Updating documentation to add latest clients informations (#5438) * Updating Aquaria documentation to add latest clients informations * Typo in the permission explanation --- worlds/aquaria/docs/setup_en.md | 37 +++++++++++++++++++++++------- worlds/aquaria/docs/setup_fr.md | 40 ++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index b5a71f1a..7d974e70 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -23,7 +23,7 @@ game you play will make sure that every game has its own save game. Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria game folder. The unzipped files are: - aquaria_randomizer.exe - OpenAL32.dll -- override (directory) +- randomizer_files (directory) - SDL2.dll - usersettings.xml - wrap_oal.dll @@ -32,7 +32,10 @@ Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria If there is a conflict between files in the original game folder and the unzipped files, you should overwrite the original files with the ones from the unzipped randomizer. -Finally, to launch the randomizer, you must use the command line interface (you can open the command line interface +There is multiple way to start the game. The easiest one is using the launcher. To do that, just run +the `aquaria_randomizer.exe` file. + +You can also launch the randomizer using the command line interface (you can open the command line interface by typing `cmd` in the address bar of the Windows File Explorer). Here is the command line used to start the randomizer: @@ -49,15 +52,17 @@ aquaria_randomizer.exe --name YourName --server theServer:thePort --password th ### Linux when using the AppImage If you use the AppImage, just copy it into the Aquaria game folder. You then have to make it executable. You -can do that from command line by using: +can do that from the command line by using: ```bash chmod +x Aquaria_Randomizer-*.AppImage ``` -or by using the Graphical Explorer of your system. +or by using the Graphical file Explorer of your system (the permission can generally be set in the file properties). -To launch the randomizer, just launch in command line: +To launch the randomizer using the integrated launcher, just execute the AppImage file. + +You can also use command line arguments to set the server and slot of your game: ```bash ./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort @@ -79,7 +84,7 @@ the original game will stop working. Copying the folder will guarantee that the Untar the Aquaria randomizer release and copy all extracted files in the Aquaria game folder. The extracted files are: - aquaria_randomizer -- override (directory) +- randomizer_files (directory) - usersettings.xml - cacert.pem @@ -87,7 +92,7 @@ If there is a conflict between files in the original game folder and the extract the original files with the ones from the extracted randomizer files. Then, you should use your system package manager to install `liblua5`, `libogg`, `libvorbis`, `libopenal` and `libsdl2`. -On Debian base system (like Ubuntu), you can use the following command: +On Debian base systems (like Ubuntu), you can use the following command: ```bash sudo apt install liblua5.1-0-dev libogg-dev libvorbis-dev libopenal-dev libsdl2-dev @@ -97,7 +102,9 @@ Also, if there are certain `.so` files in the original Aquaria game folder (`lib `libSDL-1.2.so.0` and `libstdc++.so.6`), you should remove them from the Aquaria Randomizer game folder. Those are old libraries that will not work on the recent build of the randomizer. -To launch the randomizer, just launch in command line: +To launch the randomizer using the integrated launcher, just execute the `aquaria_randomizer` file. + +You can also use command line arguments to set the server and slot of your game: ```bash ./aquaria_randomizer --name YourName --server theServer:thePort @@ -115,6 +122,20 @@ sure that your executable has executable permission: ```bash chmod +x aquaria_randomizer ``` +### Steam deck + +On the Steamdeck, go in desktop mode and follow the same procedure as the Linux Appimage. + + +### No sound on Linux/Steam deck + +If your game play without problems, but with no sound, the game probably does not use the correct +driver for the sound system. To fix that, you can use `ALSOFT_DRIVERS=pulse` before your command +line to make it work. Something like this (depending on the way you launch the randomizer): + +```bash +ALSOFT_DRIVERS=pulse ./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort +``` ## Auto-Tracking diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index 7433dc5d..a72e1e2e 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -2,12 +2,12 @@ ## Logiciels nécessaires -- Une copie du jeu Aquaria non-modifiée (disponible sur la majorité des sites de ventes de jeux vidéos en ligne) +- Une copie du jeu Aquaria non modifiée (disponible sur la majorité des sites de ventes de jeux vidéos en ligne) - Le client du Randomizer d'Aquaria [Aquaria randomizer](https://github.com/tioui/Aquaria_Randomizer/releases/latest) ## Logiciels optionnels -- De manière optionnel, pour pouvoir envoyer des [commandes](/tutorial/Archipelago/commands/en) comme `!hint`: utilisez le client texte de [la version la plus récente d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases/latest) +- De manière optionnelle, pour pouvoir envoyer des [commandes](/tutorial/Archipelago/commands/en) comme `!hint`: utilisez le client texte de [la version la plus récente d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases/latest) - [Aquaria AP Tracker](https://github.com/palex00/aquaria-ap-tracker/releases/latest), pour utiliser avec [PopTracker](https://github.com/black-sliver/PopTracker/releases/latest) ## Procédures d'installation et d'exécution @@ -25,7 +25,7 @@ Désarchiver le randomizer d'Aquaria et copier tous les fichiers de l'archive da fichier d'archive devrait contenir les fichiers suivants: - aquaria_randomizer.exe - OpenAL32.dll -- override (directory) +- randomizer_files (directory) - SDL2.dll - usersettings.xml - wrap_oal.dll @@ -34,7 +34,10 @@ fichier d'archive devrait contenir les fichiers suivants: S'il y a des conflits entre les fichiers de l'archive zip et les fichiers du jeu original, vous devez utiliser les fichiers contenus dans l'archive zip. -Finalement, pour lancer le randomizer, vous devez utiliser la ligne de commande (vous pouvez ouvrir une interface de +Il y a plusieurs manières de lancer le randomizer. Le plus simple consiste à utiliser le lanceur intégré en +exécutant simplement le fichier `aquaria_randomizer.exe`. + +Il est également possible de lancer le randomizer en utilisant la ligne de commande (vous pouvez ouvrir une interface de ligne de commande, entrez l'adresse `cmd` dans la barre d'adresse de l'explorateur de fichier de Windows). Voici la ligne de commande à utiliser pour lancer le randomizer: @@ -57,9 +60,12 @@ le mettre exécutable. Vous pouvez mettre le fichier exécutable avec la command chmod +x Aquaria_Randomizer-*.AppImage ``` -ou bien en utilisant l'explorateur graphique de votre système. +ou bien en utilisant l'explorateur de fichier graphique de votre système (la permission d'exécution est +généralement dans les propriétés du fichier). -Pour lancer le randomizer, utiliser la commande suivante: +Pour lancer le randomizer en utilisant le lanceur intégré, seulement exécuter le fichier AppImage. + +Vous pouvez également lancer le randomizer en spécifiant les informations de connexion dans les arguments de la ligne de commande: ```bash ./Aquaria_Randomizer-*.AppImage --name VotreNom --server LeServeur:LePort @@ -83,7 +89,7 @@ avant de déposer le randomizer à l'intérieur permet de vous assurer de garder Désarchiver le fichier tar et copier tous les fichiers qu'il contient dans le répertoire du jeu d'origine d'Aquaria. Les fichiers extraient du fichier tar devraient être les suivants: - aquaria_randomizer -- override (directory) +- randomizer_files (directory) - usersettings.xml - cacert.pem @@ -102,7 +108,10 @@ Notez également que s'il y a des fichiers ".so" dans le répertoire d'Aquaria ( `libSDL-1.2.so.0` and `libstdc++.so.6`), vous devriez les retirer. Il s'agit de vieille version des librairies qui ne sont plus fonctionnelles dans les systèmes modernes et qui pourrait empêcher le randomizer de fonctionner. -Pour lancer le randomizer, utiliser la commande suivante: +Pour lancer le randomizer en utilisant le lanceur intégré, seulement exécuter le fichier `aquaria_randomizer`. + +Vous pouvez également lancer le randomizer en spécifiant les information de connexion dans les arguments de la +ligne de commande: ```bash ./aquaria_randomizer --name VotreNom --server LeServeur:LePort @@ -120,6 +129,21 @@ pour vous assurer que votre fichier est exécutable: ```bash chmod +x aquaria_randomizer ``` +### Steam Deck + +Pour installer le randomizer sur la Steam Deck, seulement suivre la procédure pour les fichiers AppImage +indiquée précédemment. + +### Aucun son sur Linux/Steam Deck + +Si le jeu fonctionne sans problème, mais qu'il n'y a aucun son, c'est probablement parce que le jeu +n'arrive pas à utiliser le bon pilote de son. Généralement, le problème est réglé en ajoutant la +variable d'environnement `ALSOFT_DRIVERS=pulse`. Voici un exemple (peut varier en fonction de la manière +que le randomizer est lancé): + +```bash +ALSOFT_DRIVERS=pulse ./Aquaria_Randomizer-*.AppImage --name VotreNom --server LeServeur:LePort +``` ## Tracking automatique From 60070c2f1e467728023b33a829fe19e3ccb558fd Mon Sep 17 00:00:00 2001 From: Benny D <78334662+benny-dreamly@users.noreply.github.com> Date: Sat, 4 Oct 2025 21:13:04 -0600 Subject: [PATCH 139/204] PyCharm: add a run config for the new apworld builder workflow (#5489) * add Build APWorld PyCharm run config * change casing of the argument * Update Build APWorld.run.xml --------- Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- .run/Build APWorld.run.xml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .run/Build APWorld.run.xml diff --git a/.run/Build APWorld.run.xml b/.run/Build APWorld.run.xml new file mode 100644 index 00000000..db6a305e --- /dev/null +++ b/.run/Build APWorld.run.xml @@ -0,0 +1,24 @@ + + + + + From f8f30f41b76435c20040087fbd23d9e0ea2c14e7 Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Sun, 5 Oct 2025 14:30:52 +1100 Subject: [PATCH 140/204] Launcher: Newly installed custom worlds are not relative #4989 Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- worlds/LauncherComponents.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index 527208cc..be58b048 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -180,7 +180,7 @@ def _install_apworld(apworld_src: str = "") -> Optional[Tuple[pathlib.Path, path if found_already_loaded and is_kivy_running(): raise Exception(f"Installed APWorld successfully, but '{module_name}' is already loaded, " "so a Launcher restart is required to use the new installation.") - world_source = worlds.WorldSource(str(target), is_zip=True) + world_source = worlds.WorldSource(str(target), is_zip=True, relative=False) bisect.insort(worlds.world_sources, world_source) world_source.load() From a2460b7fe717f1dd41f8449dfa26015190d3f2c7 Mon Sep 17 00:00:00 2001 From: James White Date: Sun, 5 Oct 2025 04:33:52 +0100 Subject: [PATCH 141/204] Pokemon RB: Add client tracking for tracker relevant events (#5495) * Pokemon RB: Add client tracking for tracker relevant events * Pokemon RB: Use list for tracker events * Pokemon RB: Use correct bill event * Pokemon RB: Add champion event tracking --- worlds/pokemon_rb/client.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/worlds/pokemon_rb/client.py b/worlds/pokemon_rb/client.py index 2eb56f53..36db00b3 100644 --- a/worlds/pokemon_rb/client.py +++ b/worlds/pokemon_rb/client.py @@ -36,6 +36,26 @@ DATA_LOCATIONS = { "CrashCheck4": (0x16DD, 1), } +TRACKER_EVENT_FLAGS = [ + 0x77, # EVENT_BEAT_BROCK + 0xbf, # EVENT_BEAT_MISTY + 0x167, # EVENT_BEAT_LT_SURGE + 0x1a9, # EVENT_BEAT_ERIKA + 0x259, # EVENT_BEAT_KOGA + 0x361, # EVENT_BEAT_SABRINA + 0x299, # EVENT_BEAT_BLAINE + 0x51, # EVENT_BEAT_VIRIDIAN_GYM_GIOVANNI + + 0x38, # EVENT_OAK_GOT_PARCEL + 0x525, # EVENT_BEAT_ROUTE22_RIVAL_1ST_BATTLE + 0x117, # EVENT_RESCUED_MR_FUJI + 0x55c, # EVENT_GOT_SS_TICKET + 0x78f, # EVENT_BEAT_SILPH_CO_GIOVANNI + 0x901, # EVENT_BEAT_CHAMPION_RIVAL +] + +assert len(TRACKER_EVENT_FLAGS) <= 32 + location_map = {"Rod": {}, "EventFlag": {}, "Missable": {}, "Hidden": {}, "list": {}, "DexSanityFlag": {}} location_bytes_bits = {} for location in location_data: @@ -61,6 +81,7 @@ class PokemonRBClient(BizHawkClient): super().__init__() self.auto_hints = set() self.locations_array = None + self.tracker_bitfield = 0 self.disconnect_pending = False self.set_deathlink = False self.banking_command = None @@ -236,6 +257,22 @@ class PokemonRBClient(BizHawkClient): await ctx.send_msgs([{"cmd": "Bounce", "slots": [ctx.slot], "data": {"currentMap": data["CurrentMap"][0]}}]) self.current_map = data["CurrentMap"][0] + # TRACKER + tracker_bitfield = 0 + for i, flag in enumerate(TRACKER_EVENT_FLAGS): + if data["EventFlag"][flag // 8] & (1 << (flag % 8)): + tracker_bitfield |= 1 << i + + if tracker_bitfield != self.tracker_bitfield: + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"pokemon_rb_events_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "or", "value": tracker_bitfield}], + }]) + self.tracker_bitfield = tracker_bitfield + # VICTORY if data["EventFlag"][280] & 1 and not ctx.finished_game: From f07fea2771c2fe5092570e9da417c163fe6f87bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 4 Oct 2025 23:39:30 -0400 Subject: [PATCH 142/204] CommonClient: Move command marker to last_autofillable_command (#4907) * handle autocomplete command when press question * fix test * add docstring to get_input_text_from_response * fix line lenght --- Utils.py | 11 ++++++++++- kvui.py | 6 +++--- test/general/test_client_server_interaction.py | 8 ++++---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Utils.py b/Utils.py index a14e737c..08e5dba8 100644 --- a/Utils.py +++ b/Utils.py @@ -721,13 +721,22 @@ def get_intended_text(input_text: str, possible_answers) -> typing.Tuple[str, bo def get_input_text_from_response(text: str, command: str) -> typing.Optional[str]: + """ + Parses the response text from `get_intended_text` to find the suggested input and autocomplete the command in + arguments with it. + + :param text: The response text from `get_intended_text`. + :param command: The command to which the input text should be added. Must contain the prefix used by the command + (`!` or `/`). + :return: The command with the suggested input text appended, or None if no suggestion was found. + """ if "did you mean " in text: for question in ("Didn't find something that closely matches", "Too many close matches"): if text.startswith(question): name = get_text_between(text, "did you mean '", "'? (") - return f"!{command} {name}" + return f"{command} {name}" elif text.startswith("Missing: "): return text.replace("Missing: ", "!hint_location ") return None diff --git a/kvui.py b/kvui.py index 013cd336..86297c49 100644 --- a/kvui.py +++ b/kvui.py @@ -838,15 +838,15 @@ class GameManager(ThemedApp): self.log_panels: typing.Dict[str, Widget] = {} # keep track of last used command to autofill on click - self.last_autofillable_command = "hint" - autofillable_commands = ("hint_location", "hint", "getitem") + self.last_autofillable_command = "!hint" + autofillable_commands = ("!hint_location", "!hint", "!getitem") original_say = ctx.on_user_say def intercept_say(text): text = original_say(text) if text: for command in autofillable_commands: - if text.startswith("!" + command): + if text.startswith(command): self.last_autofillable_command = command break return text diff --git a/test/general/test_client_server_interaction.py b/test/general/test_client_server_interaction.py index 17de9151..209ef92a 100644 --- a/test/general/test_client_server_interaction.py +++ b/test/general/test_client_server_interaction.py @@ -6,9 +6,9 @@ from Utils import get_intended_text, get_input_text_from_response class TestClient(unittest.TestCase): def test_autofill_hint_from_fuzzy_hint(self) -> None: tests = ( - ("item", ["item1", "item2"]), # Multiple close matches - ("itm", ["item1", "item21"]), # No close match, multiple option - ("item", ["item1"]), # No close match, single option + ("item", ["item1", "item2"]), # Multiple close matches + ("itm", ["item1", "item21"]), # No close match, multiple option + ("item", ["item1"]), # No close match, single option ("item", ["\"item\" 'item' (item)"]), # Testing different special characters ) @@ -16,7 +16,7 @@ class TestClient(unittest.TestCase): item_name, usable, response = get_intended_text(input_text, possible_answers) self.assertFalse(usable, "This test must be updated, it seems get_fuzzy_results behavior changed") - hint_command = get_input_text_from_response(response, "hint") + hint_command = get_input_text_from_response(response, "!hint") self.assertIsNotNone(hint_command, "The response to fuzzy hints is no longer recognized by the hint autofill") self.assertEqual(hint_command, f"!hint {item_name}", From adb5a7d632f3b61d4ee005baec31aa2ed2a4a841 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Sun, 5 Oct 2025 00:47:01 -0400 Subject: [PATCH 143/204] SA2B, DKC3, SMW, Celeste 64, Celeste (Open World): Manifest manifests --- worlds/celeste64/LICENSE | 27 +++++++++++++++++++++ worlds/celeste64/archipelago.json | 6 +++++ worlds/celeste_open_world/LICENSE | 27 +++++++++++++++++++++ worlds/celeste_open_world/archipelago.json | 6 +++++ worlds/dkc3/LICENSE | 27 +++++++++++++++++++++ worlds/dkc3/archipelago.json | 6 +++++ worlds/sa2b/LICENSE | 28 ++++++++++++++++++++++ worlds/sa2b/archipelago.json | 6 +++++ worlds/smw/LICENSE | 28 ++++++++++++++++++++++ worlds/smw/archipelago.json | 6 +++++ 10 files changed, 167 insertions(+) create mode 100644 worlds/celeste64/LICENSE create mode 100644 worlds/celeste64/archipelago.json create mode 100644 worlds/celeste_open_world/LICENSE create mode 100644 worlds/celeste_open_world/archipelago.json create mode 100644 worlds/dkc3/LICENSE create mode 100644 worlds/dkc3/archipelago.json create mode 100644 worlds/sa2b/LICENSE create mode 100644 worlds/sa2b/archipelago.json create mode 100644 worlds/smw/LICENSE create mode 100644 worlds/smw/archipelago.json diff --git a/worlds/celeste64/LICENSE b/worlds/celeste64/LICENSE new file mode 100644 index 00000000..733fbe11 --- /dev/null +++ b/worlds/celeste64/LICENSE @@ -0,0 +1,27 @@ +Modified MIT License + +Copyright (c) 2025 PoryGone + +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, and/or distribute copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +No copy or substantial portion of the Software shall be sublicensed or relicensed +without the express written permission of the copyright holder(s) + +No copy or substantial portion of the Software shall be sold without the express +written permission of the copyright holder(s) + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/celeste64/archipelago.json b/worlds/celeste64/archipelago.json new file mode 100644 index 00000000..fdc1c98e --- /dev/null +++ b/worlds/celeste64/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Celeste 64", + "authors": [ "PoryGone" ], + "minimum_ap_version": "0.6.3", + "world_version": "1.3.1" +} \ No newline at end of file diff --git a/worlds/celeste_open_world/LICENSE b/worlds/celeste_open_world/LICENSE new file mode 100644 index 00000000..733fbe11 --- /dev/null +++ b/worlds/celeste_open_world/LICENSE @@ -0,0 +1,27 @@ +Modified MIT License + +Copyright (c) 2025 PoryGone + +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, and/or distribute copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +No copy or substantial portion of the Software shall be sublicensed or relicensed +without the express written permission of the copyright holder(s) + +No copy or substantial portion of the Software shall be sold without the express +written permission of the copyright holder(s) + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/celeste_open_world/archipelago.json b/worlds/celeste_open_world/archipelago.json new file mode 100644 index 00000000..12e1f288 --- /dev/null +++ b/worlds/celeste_open_world/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Celeste (Open World)", + "authors": [ "PoryGone" ], + "minimum_ap_version": "0.6.3", + "world_version": "1.0.5" +} \ No newline at end of file diff --git a/worlds/dkc3/LICENSE b/worlds/dkc3/LICENSE new file mode 100644 index 00000000..733fbe11 --- /dev/null +++ b/worlds/dkc3/LICENSE @@ -0,0 +1,27 @@ +Modified MIT License + +Copyright (c) 2025 PoryGone + +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, and/or distribute copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +No copy or substantial portion of the Software shall be sublicensed or relicensed +without the express written permission of the copyright holder(s) + +No copy or substantial portion of the Software shall be sold without the express +written permission of the copyright holder(s) + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/dkc3/archipelago.json b/worlds/dkc3/archipelago.json new file mode 100644 index 00000000..1d3880a2 --- /dev/null +++ b/worlds/dkc3/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Donkey Kong Country 3", + "authors": [ "PoryGone" ], + "minimum_ap_version": "0.6.3", + "world_version": "1.1.0" +} \ No newline at end of file diff --git a/worlds/sa2b/LICENSE b/worlds/sa2b/LICENSE new file mode 100644 index 00000000..a3648a0f --- /dev/null +++ b/worlds/sa2b/LICENSE @@ -0,0 +1,28 @@ +Modified MIT License + +Copyright (c) 2025 PoryGone +Copyright (c) 2025 RaspberrySpaceJam + +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, and/or distribute copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +No copy or substantial portion of the Software shall be sublicensed or relicensed +without the express written permission of the copyright holder(s) + +No copy or substantial portion of the Software shall be sold without the express +written permission of the copyright holder(s) + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/sa2b/archipelago.json b/worlds/sa2b/archipelago.json new file mode 100644 index 00000000..8d698687 --- /dev/null +++ b/worlds/sa2b/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Sonic Adventure 2 Battle", + "authors": [ "PoryGone", "RaspberrySpaceJam" ], + "minimum_ap_version": "0.6.3", + "world_version": "2.4.2" +} \ No newline at end of file diff --git a/worlds/smw/LICENSE b/worlds/smw/LICENSE new file mode 100644 index 00000000..cf087c45 --- /dev/null +++ b/worlds/smw/LICENSE @@ -0,0 +1,28 @@ +Modified MIT License + +Copyright (c) 2025 PoryGone +Copyright (c) 2025 lx5 + +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, and/or distribute copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +No copy or substantial portion of the Software shall be sublicensed or relicensed +without the express written permission of the copyright holder(s) + +No copy or substantial portion of the Software shall be sold without the express +written permission of the copyright holder(s) + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/smw/archipelago.json b/worlds/smw/archipelago.json new file mode 100644 index 00000000..b3d25d48 --- /dev/null +++ b/worlds/smw/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Super Mario World", + "authors": [ "PoryGone", "lx5" ], + "minimum_ap_version": "0.6.3", + "world_version": "2.1.1" +} \ No newline at end of file From 8decde03704e779cb5e3ae70b96984f099bc4b65 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Sun, 5 Oct 2025 14:07:12 +0100 Subject: [PATCH 144/204] Core: Don't waste swaps by swapping two copies of the same item (#5516) There is a limit to the number of times an item can be swapped to prevent swapping going on potentially forever. Swapping an item with a copy of itself is assumed to be a pointless swap, and was wasting possible swaps in cases where there were multiple copies of an item being placed. This swapping behaviour was noticed from debugging solo LADX generations that was wasting swaps by swapping copies of the same item. This patch adds a check that if the placed_item and item_to_place are equal, then the location is skipped and no attempt to swap is made. If worlds do intend to have seemingly equal items to actually have different logical behaviour, those worlds should override __eq__ on their Item subclasses so that the item instances are not considered equal. Generally, fill_restrictive should only be used with progression items, so it is assumed that swapping won't have to deal with multiple copies of an item where some copies are progression and some are not. This is relevant because Item.__eq__ only compares .name and .player. --- Fill.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Fill.py b/Fill.py index 7a079fbc..48ed7253 100644 --- a/Fill.py +++ b/Fill.py @@ -129,6 +129,10 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati for i, location in enumerate(placements)) for (i, location, unsafe) in swap_attempts: placed_item = location.item + if item_to_place == placed_item: + # The number of allowed swaps is limited, so do not allow a swap of an item with a copy of + # itself. + continue # Unplaceable items can sometimes be swapped infinitely. Limit the # number of times we will swap an individual item to prevent this swap_count = swapped_items[placed_item.player, placed_item.name, unsafe] From fd879408f3e419677f23697a1be550cc173e4cb4 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Sun, 5 Oct 2025 09:38:57 -0400 Subject: [PATCH 145/204] WebHost: Improve user friendliness of generation failure webpage (#4964) * Improve user friendliness of generation failure webpage. * Add details to other render for seedError.html. * Refactor css to avoid !important tags. * Update WebHostLib/static/styles/themes/ocean-island.css Co-authored-by: qwint * Update WebHostLib/generate.py Co-authored-by: qwint * use f words * small refactor * Update WebHostLib/generate.py Co-authored-by: qwint * Fix whitespace. * Update one new use of seedError template for pickling errors. --------- Co-authored-by: qwint --- WebHostLib/generate.py | 32 +++++++++++++++---- .../static/styles/themes/ocean-island.css | 10 ++++++ WebHostLib/static/styles/waitSeed.css | 4 +++ WebHostLib/templates/seedError.html | 12 ++++--- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index 6ca8c1c8..a5147f66 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -72,6 +72,10 @@ def generate(race=False): return render_template("generate.html", race=race, version=__version__) +def format_exception(e: BaseException) -> str: + return f"{e.__class__.__name__}: {e}" + + def start_generation(options: dict[str, dict | str], meta: dict[str, Any]): results, gen_options = roll_options(options, set(meta["plando_options"])) @@ -92,7 +96,11 @@ def start_generation(options: dict[str, dict | str], meta: dict[str, Any]): except PicklingError as e: from .autolauncher import handle_generation_failure handle_generation_failure(e) - return render_template("seedError.html", seed_error=("PicklingError: " + str(e))) + meta["error"] = format_exception(e) + if e.__cause__: + meta["source"] = format_exception(e.__cause__) + details = json.dumps(meta, indent=4).strip() + return render_template("seedError.html", seed_error=meta["error"], details=details) commit() @@ -104,7 +112,11 @@ def start_generation(options: dict[str, dict | str], meta: dict[str, Any]): except BaseException as e: from .autolauncher import handle_generation_failure handle_generation_failure(e) - return render_template("seedError.html", seed_error=(e.__class__.__name__ + ": " + str(e))) + meta["error"] = format_exception(e) + if e.__cause__: + meta["source"] = format_exception(e.__cause__) + details = json.dumps(meta, indent=4).strip() + return render_template("seedError.html", seed_error=meta["error"], details=details) return redirect(url_for("view_seed", seed=seed_id)) @@ -175,9 +187,11 @@ def gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, if gen is not None: gen.state = STATE_ERROR meta = json.loads(gen.meta) - meta["error"] = ( - "Allowed time for Generation exceeded, please consider generating locally instead. " + - e.__class__.__name__ + ": " + str(e)) + meta["error"] = ("Allowed time for Generation exceeded, " + + "please consider generating locally instead. " + + format_exception(e)) + if e.__cause__: + meta["source"] = format_exception(e.__cause__) gen.meta = json.dumps(meta) commit() except BaseException as e: @@ -187,7 +201,9 @@ def gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, if gen is not None: gen.state = STATE_ERROR meta = json.loads(gen.meta) - meta["error"] = (e.__class__.__name__ + ": " + str(e)) + meta["error"] = format_exception(e) + if e.__cause__: + meta["source"] = format_exception(e.__cause__) gen.meta = json.dumps(meta) commit() raise @@ -204,7 +220,9 @@ def wait_seed(seed: UUID): if not generation: return "Generation not found." elif generation.state == STATE_ERROR: - return render_template("seedError.html", seed_error=generation.meta) + meta = json.loads(generation.meta) + details = json.dumps(meta, indent=4).strip() + return render_template("seedError.html", seed_error=meta["error"], details=details) return render_template("waitSeed.html", seed_id=seed_id) diff --git a/WebHostLib/static/styles/themes/ocean-island.css b/WebHostLib/static/styles/themes/ocean-island.css index 2b45fb9d..3216e5e3 100644 --- a/WebHostLib/static/styles/themes/ocean-island.css +++ b/WebHostLib/static/styles/themes/ocean-island.css @@ -72,3 +72,13 @@ code{ padding-right: 0.25rem; color: #000000; } + +code.grassy { + background-color: #b5e9a4; + border: 1px solid #2a6c2f; + white-space: preserve; + text-align: left; + display: block; + font-size: 14px; + line-height: 20px; +} diff --git a/WebHostLib/static/styles/waitSeed.css b/WebHostLib/static/styles/waitSeed.css index 85d281b2..0b4e4c32 100644 --- a/WebHostLib/static/styles/waitSeed.css +++ b/WebHostLib/static/styles/waitSeed.css @@ -13,3 +13,7 @@ min-height: 360px; text-align: center; } + +h2, h4 { + color: #ffffff; +} diff --git a/WebHostLib/templates/seedError.html b/WebHostLib/templates/seedError.html index a5eec1a4..6953eef6 100644 --- a/WebHostLib/templates/seedError.html +++ b/WebHostLib/templates/seedError.html @@ -4,16 +4,20 @@ {% block head %} Generation failed, please retry. - + {% endblock %} {% block body %} {% include 'header/oceanIslandHeader.html' %}
-

Generation failed

-

please retry

- {{ seed_error }} +

Generation Failed

+

Please try again!

+

{{ seed_error }}

+

More details:

+

+ {{ details }} +

{% endblock %} From 60617c682e5ac5fe0d02600b585a248a126661b9 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 5 Oct 2025 19:05:52 +0000 Subject: [PATCH 146/204] WebHost: fix log fetching extra characters when there is non-ascii (#5515) --- WebHostLib/misc.py | 8 ++++---- WebHostLib/templates/hostRoom.html | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index b3088267..b56b11dd 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -271,9 +271,9 @@ def host_room(room: UUID): or "Discordbot" in request.user_agent.string or not any(browser_token in request.user_agent.string for browser_token in browser_tokens)) - def get_log(max_size: int = 0 if automated else 1024000) -> str: + def get_log(max_size: int = 0 if automated else 1024000) -> Tuple[str, int]: if max_size == 0: - return "…" + return "…", 0 try: with open(os.path.join("logs", str(room.id) + ".txt"), "rb") as log: raw_size = 0 @@ -284,9 +284,9 @@ def host_room(room: UUID): break raw_size += len(block) fragments.append(block.decode("utf-8")) - return "".join(fragments) + return "".join(fragments), raw_size except FileNotFoundError: - return "" + return "", 0 return render_template("hostRoom.html", room=room, should_refresh=should_refresh, get_log=get_log) diff --git a/WebHostLib/templates/hostRoom.html b/WebHostLib/templates/hostRoom.html index c5996d18..10ff5e84 100644 --- a/WebHostLib/templates/hostRoom.html +++ b/WebHostLib/templates/hostRoom.html @@ -58,8 +58,7 @@ Open Log File...
- {% set log = get_log() -%} - {%- set log_len = log | length - 1 if log.endswith("…") else log | length -%} + {% set log, log_len = get_log() -%}
{{ log }}